Cómo ajustar la ganancia del micrófono desde C # (debe funcionar en XP y W7)

Primero, tenga en cuenta que sé que hay algunas preguntas como esta ya publicadas; sin embargo, 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 del altavoz (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 accedo a través de pInvoke y que me permite ajustar el volumen del micrófono, pero solo en mi PC W7. El código del mezclador con el que comencé viene 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. Agregué el método SetMicVolume que se muestra aquí ...

    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);
    }

Tenga en cuenta el "segundo intento" para llamar a 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 de usar mixerOpen (mezclador de salida, 0, 0, 0, 0), el código no devuelve una falla pero la ganancia del micrófono no se ve afectada. Tenga en cuenta que, como dije anteriormente, esto funciona en W7 (el segundo intento nunca se ejecuta porque no falla usando mixerOpen (out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN)).

Admito no tener una buena comprensión de la API del mezclador, así que eso es lo que estoy investigando ahora; sin embargo, si alguien tiene idea de por qué esto funcionaría en W7, pero no en XP, me gustaría escucharlo. Mientras tanto, si lo descubro antes de recibir una respuesta, publicaré mi propia respuesta ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta