En primer lugar, tenga en cuenta que sé que hay algunas preguntas como esta ya publicadas; sin embargo, ellos no parecen abordar el problema adecuadamente. Tengo una aplicación C#, con todos los ganchos pInvoke para hablar con la API waveXXX, y puedo capturar y reproducir audio con eso. También puedo ajustar el volumen de los altavoces (WaveOut) con esa API.
El problema es que, por cualquier razón, esa API no me permite ajustar el volumen del micrófono (WaveIn). Entonces, logré encontrar un código de mezclador que también obtuve y el acceso a a través de pInvoke, y eso me permite ajustar el volumen del micrófono, pero solo en mi W7 PC. El código del mezclador que comencé proviene de aquí: http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85 y funciona, pero está escrito para ajustar el volumen del altavoz. He añadido el método SetMicVolume se muestra aquí ...Cómo ajustar la ganancia del micrófono desde C# (necesita trabajar en XP y 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);
}
Nota del "segundo intento" para llamar GetVolumeControl(). Esto se hace porque en XP, en la primera llamada a GetVolumeControl (consulte el sitio anterior para ese código), la llamada a mixerGetLineControlsA() falla con los sistemas XP que devuelven MIXERR_INVALCONTROL. Luego, con este segundo intento utilizando mixer Open (mezclador de salida, 0, 0, 0, 0), el código no devuelve un error, pero la ganancia del micrófono no se ve afectada. Tenga en cuenta que, como dije antes, esto funciona en W7 (el segundo intento nunca se ejecuta porque no falla utilizando mixerOpen (out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN)).
Admito que no tengo una buena comprensión de la API de mezclador, así que eso es lo que estoy buscando ahora; sin embargo, si alguien tiene una pista de por qué esto funcionaría en W7, pero no en XP, me gustaría escucharlo. Mientras tanto, si lo resuelvo antes de obtener una respuesta, publicaré mi propia respuesta ...
Tenga en cuenta que ya he tenido una máquina XP que falló, por lo que aún no es perfecta ... –
¿Qué es int mxid en su código? ¿Cómo conseguir uno? –