Here is a little function, assembled from code in a CodeProject article.
Code:
#include <windows.h>
#if defined(_MSC_VER)
#pragma comment(lib, "Winmm.lib")
#endif
/*
* Function to mute or unmute the system microphone.
* Arg: fMute - TRUE to mute, FALSE to unmute.
*/
BOOL MuteMicrophone(BOOL fMute)
{
MMRESULT result = 0;
HMIXER hMixer = 0;
MIXERLINE ml = { 0 };
MIXERLINECONTROLS mlc = { 0 };
MIXERCONTROL mc = { 0 };
MIXERCONTROLDETAILS_BOOLEAN mcb = { 0 };
MIXERCONTROLDETAILS mcd = { 0 };
result = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);
ml.cbStruct = sizeof(MIXERLINE);
ml.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE ;
result = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
mlc.cbStruct = sizeof(MIXERLINECONTROLS);
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl = sizeof(MIXERCONTROL);
result = mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mcd.hwndOwner = NULL;
mcd.dwControlID = mc.dwControlID;
mcb.fValue = fMute;
mcd.paDetails = &mcb;
mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mcd.cChannels = 1;
result = mixerSetControlDetails((HMIXEROBJ) hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
mixerClose(hMixer);
return (result == MMSYSERR_NOERROR ? TRUE : FALSE);
}
int main(void)
{
MuteMicrophone(TRUE);
return 0;
}
The Mixer API has got to be the messiest API in Win32. I can only assume that is was designed by the work experience kid while he was smoking some seriously good stuff.