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
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!