Nombre de sorties d'une carte son

Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 3 janv. 2008 à 16:09
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008 - 2 mars 2008 à 12:41
Bonjour je cherche à lister les infos des périphériques audio connectés à un PC, j'en suis à l'étape de test pour connaitre le nombre de sorties et d'entrées disponibles pour un périphérique.

J'ai donc fait une petite fonction :

int AudioDrivers::TestAudioDriver(LPAUDIODRIVERSLIST audiodrv,unsigned int channels,double SampleRate,int Resolution){
    if(audiodrv)
if(audiodrv->type==AUDIO_TYPE_WDM){        

                

            WAVEFORMATEXTENSIBLE wfxs;

           

            wfxs.Format.wFormatTag=WAVE_FORMAT_EXTENSIBLE;

            wfxs.Format.nChannels=0;

            unsigned int channelmask=channels;

            while( channelmask != 0 ){

                wfxs.Format.nChannels += ( channelmask & 1L );

                channelmask >>= 1;

            }

           

            wfxs.Format.nSamplesPerSec=(DWORD)SampleRate;

            wfxs.Format.wBitsPerSample=8*(1+(int)(Resolution/8));

            wfxs.Format.nBlockAlign=wfxs.Format.wBitsPerSample*wfxs.Format.nChannels/8;

            wfxs.Format.nAvgBytesPerSec=wfxs.Format.nBlockAlign*wfxs.Format.wBitsPerSample;

            wfxs.Format.cbSize=sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);

           

            wfxs.Samples.wValidBitsPerSample=Resolution;

            wfxs.Samples.wSamplesPerBlock=512;

            wfxs.Samples.wReserved=0;

            wfxs.dwChannelMask=channels;

            wfxs.SubFormat=KSDATAFORMAT_SUBTYPE_PCM;

           

            MMRESULT open;

            if((open=waveOutOpen(NULL,audiodrv->drvID,(LPCWAVEFORMATEX)&wfxs,0,0,CALLBACK_NULL|WAVE_FORMAT_QUERY))==MMSYSERR_NOERROR)return 1;

            else if(open==MMSYSERR_ALLOCATED)strcpy(audiodrv->errorMessage, "Specified resource is already allocated.");

            else if(open==MMSYSERR_BADDEVICEID)strcpy(audiodrv->errorMessage, "Specified device identifier is out of range.");

            else if(open==MMSYSERR_NODRIVER)strcpy(audiodrv->errorMessage, "No device driver is present.");

            else if(open==MMSYSERR_NOMEM)strcpy(audiodrv->errorMessage, "Unable to allocate or lock memory.");

            else if(open==WAVERR_BADFORMAT)strcpy(audiodrv->errorMessage, "Attempted to open with an unsupported waveform-audio format.");

            else if(open==WAVERR_SYNC)strcpy(audiodrv->errorMessage, "The device is synchronous but waveOutOpen was called without using the WAVE_ALLOWSYNC flag.");

      

        }

   

    }

    return 0;

}

que j'appelle de la façon suivante (ici test pour du 7.1 par exemple):

if(TestAudioDriver(audiodrv,SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT,44100.,16))audiodrv->OutputChannels=8;

Le soucis est que sur une carte audio qui dispose de 2 sorties, cet exemple donne quand même un résultat positif. Je voudrais savoir comment obtenir plus concrètement les infos d'une carte son, puis l'utiliser en se servant le moins possibles des fioritures de windows.

Merci d'avance

http://www.rc-bot.com/bannieres/banniere468x60.jpg

6 réponses

cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
3 janv. 2008 à 17:17
Regarde ma source : http://www.cppfrance.com/codes/AUDIODETECT_20037.aspx. Je pense qu'elle répondra à tes questions.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
MVP Visual C++
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
3 janv. 2008 à 21:13
Bonjour Arnotic,

J'utilise déjà au préalable waveOutGetDevCaps pour récuperer les noms, mais je n'étais pas satisfait du : waveOutGetDevCaps.wChannels 65535 qui n'a à mes yeux pas d'utilité car aucune carte son n'a 65535 sorties réelles or les 3 cartes son connectées à mon PC donnent ce même nombre (deux d'entres elles sont des 7.1, la troisième une stéréo).

J'ai l'impression que waveoutgetdevcaps donne plutot les capacités du bus audio associé à la carte et non pas les capacités physiques de la carte. De plus wChannels est cencé prendre les valeurs 1 pour mono ou 2 pour stéréo selon la msdn, et malheureusement on ne parle pas de ce qui ce passe pour des cartes son plus récentes 5.1 et 7.1 par exemple.

Moi je cherche à récuperer les infos précises : nombre de canaux, samplerates acceptés en entrée et en sortie ...

Mais pour l'instant je suis un peu perdu dans les infos complexes de la msdn.

Si tu as une piste pour aller un peu plus loin je suis preneur.

http://www.rc-bot.com/bannieres/banniere468x60.jpg
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
3 janv. 2008 à 22:31
Je vais essayer de regarder tout cela d'un peu plus près.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
0
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008
27 févr. 2008 à 16:41
Salut,

j'ai une question pour toi Arnotic, j'ai recuperé ton code et j'essaye de la faire marcher en C.
Hors j'ai une erreur que je ne comprends pas si tu pouvais m'eclairer ca serait sympa.
Autre question est ce qu'il est possible de faire la meme chose avec les peripheriques video, je pense à la webcam par exemple ????

erreur :   [Linker error] undefined reference to `waveInGetNumDevs@0'

@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
27 févr. 2008 à 18:06
Link avec ton projet : Winmm.lib
Pour la vidéo je ne connais pas.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
0
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008
2 mars 2008 à 12:41
Ah dommage! merci quand meme!!!

@++
0
Rejoignez-nous