如何从C#调整麦克风增益(需要在XP和W7上工作)

Ed.*_*Ed. 7 c# mixer microphone

首先,请注意我知道有一些问题已经发布; 但他们似乎没有充分解决这个问题.我有一个C#应用程序,所有的pInvoke挂钩都与waveXXX API对话,我可以用它来捕获和回放音频.我也可以使用该API调整扬声器(WaveOut)音量.
问题在于,无论出于何种原因,该API都不允许我调整麦克风(WaveIn)音量.所以,我设法找到了一些混音器代码,我也已经通过pInvoke接入并允许我调整麦克风音量,但只能在我的W7 PC上调整.我开始使用的混音器代码来自这里:http: //social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85 它的工作原理,但写的是调整扬声器音量.我添加了此处显示的SetMicVolume方法...

    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);
    }
Run Code Online (Sandbox Code Playgroud)

注意调用GetVolumeControl()的"第二次尝试".这样做是因为在XP上,在第一次调用GetVolumeControl时(参考上面的站点获取该代码),调用mixerGetLineControlsA()失败,XP系统返回MIXERR_INVALCONTROL.然后,使用mixerOpen(输出混音器,0,0,0,0)的第二次尝试,代码不会返回故障但麦克风增益不受影响.注意,正如我上面所说,这适用于W7(第二次尝试从未执行,因为它使用mixerOpen(输出混音器,mxid,0,0,MIXER_OBJECTF_WAVEIN)不会失败).

我承认没有很好地掌握混音器API,所以这就是我现在正在研究的内容; 但是,如果有人知道为什么这可以在W7上运行,而不是XP,我肯定希望听到它.同时,如果我在收到回复之前搞清楚,我会发布自己的回答......

Ed.*_*Ed. 1

以下代码现在对我来说似乎可以正常工作(2010 年 6 月 29 日更新)。请注意,我的测试用例是我的两台电脑,一台是 W7,另一台是 XP,所以这不是结论性的。我已经证实这并不适用于所有机器,但对于那些适用的机器来说,似乎没问题。

    public static bool setMicVolume(int mxid, int percentage)
    {
        if (mixerdisabled)
            return(false);

        bool rc;
        int mixer, vVolume, ctrltype, comptype;
        MIXERCONTROL volCtrl = new MIXERCONTROL();
        int currentVol;
        int mr = mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN);
        if (mr != MMSYSERR_NOERROR)
        {
            Warning("mixerOpen() failed: " + mr.ToString());
            mixerdisabled = true;
            return(false);
        }
        ctrltype = MIXERCONTROL_CONTROLTYPE_VOLUME;
        comptype = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
        rc = GetVolumeControl(mixer, comptype, ctrltype, out volCtrl, out currentVol);
        if (rc == false)
        {
            Warning("SetMicVolume/GetVolumeControl() failed");
            mixerdisabled = true;
            mixerClose(mixer);
            return(false);
        }
        vVolume = ((int)((float)(volCtrl.lMaximum - volCtrl.lMinimum) / 100.0F) * percentage);
        rc = SetVolumeControl(mixer, volCtrl, vVolume);
        if (rc == false)
        {
            Warning("SetMicVolume/SetVolumeControl() failed");
            mixerdisabled = true;
            mixerClose(mixer);
            return (false);
        }
        mixerClose(mixer);
        return (true);
    }
Run Code Online (Sandbox Code Playgroud)

请注意,主要区别在于我使用的是“MIXERLINE_COMPONENTTYPE_DST_WAVEIN”组件类型,而不是“MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE”。不太明白这一点,所以如果有人想附和解释(或者告诉我这通常不起作用),我欢迎回复!