Sélectionner une carte son [Résolu]

Utilisateur anonyme - 6 janv. 2008 à 17:13 - Dernière réponse : cs_Jardis 2 Messages postés mercredi 3 décembre 2008Date d'inscription 22 janvier 2009 Dernière intervention
- 22 janv. 2009 à 17:55
Salut à tous,

Je cherche à sélectionner une carte son parmis plusieurs installées sur le Pc.

J'utilise le test suivant pour sélectionner celle par défaut :

procedure TForm1.Button1Click(Sender: TObject);
 var
 waveF  : TWAVEFORMATEX;
 hWO    : HWAVEOUT;
begin
 FillChar(waveF, SizeOf(waveF), 0);
  If waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0)= MMSYSERR_NOERROR then
  showmessage('oki');
end;

Ps (Pas oublier d'utiliser MMSystem dans les uses)

Manque de bol ca ne fonctionne pas : le message n'apparait pas.

J'ai beau chercher, je ne vois pas ce qui ne colle pas.

Si quelqu'un a une idée

Merci
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 7 janv. 2008 à 13:27
3
Merci
1 - Ton WAVE_MAPPED dans le code précédent n'a rien à faire ici !! c'est un flag pour l'ouverture du périphérique, flag à utiliser dans fdwOpen c'est à dire dans le dernier élément.

2 - On récupère les erreurs histoire de savoir ce qui ne va pas (J'ai mis tous les défauts même si ceux ci ne peuvent pas tous être générés par cette fonction). Dans ce cas tu verras que l'erreur correspond à un format WAVE invalide, ce qui est normal vu que tu lui passes une structure vide.

procedure TForm1.Button2Click(Sender: TObject);
var
  waveF  : TWAVEFORMATEX;
  hWO    : HWAVEOUT;
  Result : integer ;
begin
  FillChar(waveF, SizeOf(waveF), 0);
  Result := waveOutOpen(@hWO, WAVE_MAPPER , @waveF, 0, 0, CALLBACK_NULL) ;
  case Result of
    MMSYSERR_NOERROR      : showmessage('ok ');
    MMSYSERR_ERROR        : showmessage('unspecified error ');
    MMSYSERR_BADDEVICEID  : showmessage('device ID out of range ');
    MMSYSERR_NOTENABLED   : showmessage('driver failed enable ');
    MMSYSERR_ALLOCATED    : showmessage('device already allocated ');
    MMSYSERR_INVALHANDLE  : showmessage('device handle is invalid ');
    MMSYSERR_NODRIVER     : showmessage('no device driver present ');
    MMSYSERR_NOMEM        : showmessage('memory allocation error ');
    MMSYSERR_NOTSUPPORTED : showmessage('function isn''t supported ');
    MMSYSERR_BADERRNUM    : showmessage('error value out of range ');
    MMSYSERR_INVALFLAG    : showmessage('invalid flag passed ');
    MMSYSERR_INVALPARAM   : showmessage('invalid parameter passed ');
    MMSYSERR_HANDLEBUSY   : showmessage('handle being used simultaneously on another thread (eg callback) ');
    MMSYSERR_INVALIDALIAS : showmessage('specified alias not found ');
    MMSYSERR_BADDB        : showmessage('bad registry database ');
    MMSYSERR_KEYNOTFOUND  : showmessage('registry key not found ');
    MMSYSERR_READERROR    : showmessage('registry read error ');
    MMSYSERR_WRITEERROR   : showmessage('registry write error ');
    MMSYSERR_DELETEERROR  : showmessage('registry delete error ');
    MMSYSERR_VALNOTFOUND  : showmessage('registry value not found ');
    MMSYSERR_NODRIVERCB   : showmessage('driver does not call DriverCallback ');
    WAVERR_BADFORMAT      : showmessage('unsupported wave format ');
    WAVERR_STILLPLAYING   : showmessage('still something playing ');
    WAVERR_UNPREPARED     : showmessage('header not prepared ');
    WAVERR_SYNC           : showmessage('device is synchronous ');



    else                    showmessage('Error n°' + inttostr(Result) + ' (' + SysErrorMessage(GetLastError) + ')' );
  end ;
end;


3 - Réessayes le code ci-dessus avec le code suivant placé juste avant le WaveOutOpen :

  with waveF do
  begin
    wFormatTag    : = WAVE_FORMAT_PCM;
    nChannels    := 1;
   nSamplesPerSec  := 8000;
   nAvgBytesPerSec := 16000;
   nBlockAlign    := 2;
   wBitsPerSample  := 16;
   cbSize      := 0;
  end ;

Cordialement. <hr />"L'imagination est plus importante que le savoir." Albert Einstein

Merci WhiteHippo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de WhiteHippo
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 6 janv. 2008 à 17:39
0
Merci
déjà..
WAVE_MAPPED <> WAVE_MAPPER

cantador
Commenter la réponse de cs_cantador
Utilisateur anonyme - 6 janv. 2008 à 19:43
0
Merci
Merci Cantador : Mais ca beug toujours
Commenter la réponse de Utilisateur anonyme
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 6 janv. 2008 à 23:15
0
Merci
Bonsoir

En prenant WAVE_MAPPER tu dis au système de choisir le périphérique le plus approprié. Si tu veux le choisir par toi même il faut utiliser son ID (Si tu as deux cartes, la première doit avoir pour valeur 0 et la seconde 1)

Pour faire les choses proprement, on utilise auxGetNumDevs pour obtenir le nombre de peripheriques disponibles, puis auxGetDevCaps dans une boucle pour obtenir les infos de chacun des peripheriques (savoir lequel est lequel) et enfin un waveOutOpen avec le bon uDeviceID.

Cordialement.





<hr />

"L'imagination est plus importante que le savoir." Albert Einstein
Commenter la réponse de WhiteHippo
Utilisateur anonyme - 7 janv. 2008 à 08:35
0
Merci
Salut,

Je suis d'accord avec toi White Hippo et du reste c'est ce que j'ai fais. Pour le listing no problemo, j'ai bien ma liste de cartes et leur ID. Mais quand je sélectionne la carte son, ca plante :

Du reste fait un essais :

procedure TForm1.Button1Click(Sender: TObject);
var
waveF : TWAVEFORMATEX;
hWO : HWAVEOUT;
begin
FillChar(waveF, SizeOf(waveF), 0);
If waveOutOpen(@hWO, WAVE_MAPPED, @waveF, 0, 0, 0)= MMSYSERR_NOERROR then
showmessage('oki');
end;

Tu vera que le show-message n'a pas lien. Et c'est ca que je capte pas : Pourquoi mon WaveOutOpen plante.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 7 janv. 2008 à 15:06
0
Merci
Merci White Hippo

Effectivement le problème vient d'ici :

with waveF do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1;
nSamplesPerSec := 8000;
nAvgBytesPerSec := 16000;
nBlockAlign := 2;
wBitsPerSample := 16;
cbSize := 0;
end ;

sans ca plante.

Décidémment chez Microsoft, ils feront jamais les choses simplements.
L'art de la complexité inutile semble etre cultivé chez eux.

Enfin bref probleme résolu : Merci White Hippo
Commenter la réponse de Utilisateur anonyme
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 7 janv. 2008 à 19:25
0
Merci
Désolé, francky, j'ai cru sur le coup à une erreur de syntaxe mais dans l'API WAVE_MAPPER est bien l'identifiant de la carte.


heureusement WhiteHippo veille au grain..

cantador
Commenter la réponse de cs_cantador
Utilisateur anonyme - 7 janv. 2008 à 20:29
0
Merci
Il n'y as pas de probleme Cantador : ca arrive à tout le monde
Commenter la réponse de Utilisateur anonyme
cs_Jardis 2 Messages postés mercredi 3 décembre 2008Date d'inscription 22 janvier 2009 Dernière intervention - 22 janv. 2009 à 17:55
0
Merci
quelqu'un peut-il m'expliquer comment on se sert de ce code ?
car je n'y arrive pas et j'ai besoin de pouvoir sélectionner une de mes deux cartes son.

merci d'avance
Commenter la réponse de cs_Jardis

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.