Tout d'abord, sachez que je sais qu'il y a déjà quelques questions comme celles-ci; Cependant, ils ne semblent pas résoudre le problème de manière adéquate. J'ai une application C#, avec tous les hooks pInvoke pour parler à l'API waveXXX, et je suis capable de capturer et de lire de l'audio avec ça. Je suis également capable d'ajuster le volume du haut-parleur (WaveOut) avec cette API.
Le problème est que, pour une raison quelconque, cette API ne me permet pas de régler le volume du microphone (WaveIn). Donc, j'ai réussi à trouver un code de mixage que j'ai également tiré et accès via pInvoke et qui me permet d'ajuster le volume du microphone, mais seulement sur mon PC W7. Le code du mélangeur que j'ai commencé avec vient d'ici: http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85 et cela fonctionne, mais est écrit pour régler le volume du haut-parleur. J'ai ajouté la méthode SetMicVolume montré ici ...Comment ajuster le gain du microphone à partir de C# (doit fonctionner sous XP & W7)
public static void SetMicVolume(int mxid, int percentage)
{
bool rc;
int mixer, vVolume;
MIXERCONTROL volCtrl = new MIXERCONTROL();
int currentVol;
mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN);
int type = MIXERCONTROL_CONTROLTYPE_VOLUME;
rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol);
if (rc == false)
{
mixerClose(mixer);
mixerOpen(out mixer, 0, 0, 0, 0);
rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol);
if (rc == false)
throw new Exception("SetMicVolume/GetVolumeControl() failed");
}
vVolume = ((int)((float)(volCtrl.lMaximum - volCtrl.lMinimum)/100.0F) * percentage);
rc = SetVolumeControl(mixer, volCtrl, vVolume);
if (rc == false)
throw new Exception("SetMicVolume/SetVolumeControl() failed");
mixerClose(mixer);
}
Notez la "deuxième tentative" d'appeler GetVolumeControl(). Cela est fait parce que sur XP, dans le premier appel à GetVolumeControl (se référer au site ci-dessus pour ce code), l'appel à mixerGetLineControlsA() échoue avec les systèmes XP retournant MIXERR_INVALCONTROL. Ensuite, avec cette deuxième tentative en utilisant mixerOpen (out mixer, 0, 0, 0, 0), le code ne retourne pas un échec mais le gain du micro n'est pas affecté. Notez, comme je l'ai dit plus haut, cela fonctionne sur W7 (la seconde tentative n'est jamais exécutée car elle n'échoue pas en utilisant mixerOpen (out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN)). Je reconnais ne pas avoir une bonne compréhension de l'API de mixage, donc c'est ce que je suis en train de regarder maintenant; Cependant, si quelqu'un a une idée pourquoi cela fonctionnerait sur W7, mais pas XP, je voudrais bien l'entendre. Pendant ce temps, si je le découvre avant que j'obtienne une réponse, je posterai ma propre réponse ...
Notez que j'ai déjà eu une machine XP qui a échoué, donc ce n'est toujours pas parfait ... –
Qu'est-ce que int mxid dans votre code? Comment en obtenir un? –