How to adjust microphone gain from C# (needs to work on XP & W7)

前端 未结 2 626
长发绾君心
长发绾君心 2020-12-17 01:51

First, note that I know there are a few questions like this already posted; however they don\'t seem to address the problem adequately. I have a C# application, with all th

2条回答
  •  生来不讨喜
    2020-12-17 01:57

    The following code seems to work ok for me now (updated 6/29/2010). Note that my test cases are my two PCs, one being W7 the other being XP, so it's not conclusive. I've verified that this does not work for all machines, but for those on which they do, it seems to be fine.

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

    Notice that the main difference is that I'm using a component type of 'MIXERLINE_COMPONENTTYPE_DST_WAVEIN' instead of 'MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE'. Don't really understand this, so if anyone wants to chime in with an explanation (or to tell me that this isn't going to work generically), I'm welcoming the replies!

提交回复
热议问题