Wie man die Mikrofonverstärkung in C # einstellt (muss unter XP & W7 funktionieren)

Zunächst, beachte, dass ich weiß, dass einige Fragen wie diese bereits gestellt wurden. Sie scheinen das Problem jedoch nicht angemessen anzugehen. Ich habe eine C # -Anwendung mit allen pInvoke-Hooks, um mit der waveXXX-API zu kommunizieren, und kann damit Audio aufnehmen und wiedergeben. Mit dieser API kann ich auch die Lautstärke der Lautsprecher (WaveOut) anpassen.
Das Problem ist, dass ich mit dieser API aus irgendeinem Grund die Mikrofonlautstärke (WaveIn) nicht einstellen kann. Ich habe also einen Mixer-Code gefunden, auf den ich auch über pInvoke zugegriffen habe und mit dem ich die Mikrofonlautstärke einstellen kann, aber nur auf meinem W7-PC. Der Mixer-Code, mit dem ich angefangen habe, kommt von hier:http: //social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da8 und es funktioniert, wird aber geschrieben, um die Lautsprecherlautstärke anzupassen. Ich habe die hier gezeigte SetMicVolume-Methode hinzugefügt ...

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

Beachten Sie den "zweiten Versuch", GetVolumeControl () aufzurufen. Dies geschieht, weil unter XP beim ersten Aufruf von GetVolumeControl (siehe Site oben für diesen Code) der Aufruf von mixerGetLineControlsA () fehlschlägt, wenn XP-Systeme MIXERR_INVALCONTROL zurückgeben. Bei diesem zweiten Versuch mit mixerOpen (out mixer, 0, 0, 0, 0) gibt der Code keinen Fehler zurück, die Mikrofonverstärkung bleibt jedoch unverändert. Beachten Sie, wie oben erwähnt, dass dies auf W7 funktioniert (der zweite Versuch wird niemals ausgeführt, da er mit mixerOpen nicht fehlschlägt (out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN)).

Ich gebe zu, dass ich die Mixer-API nicht gut verstehe. Wenn jedoch jemand eine Ahnung hat, warum dies auf W7 funktionieren würde, aber nicht auf XP, würde ich es gerne hören. In der Zwischenzeit, wenn ich es herausfinde, bevor ich eine Antwort bekomme, werde ich meine eigene Antwort posten ...

Antworten auf die Frage(4)

Ihre Antwort auf die Frage