// cmdmute.cpp : Defines the entry point for the console application. // // Time-stamp: <2002/04/11, 01:41:54 (EST), maverick, cmdmute.cpp> #include #include const char* version = // hehe, we need a version number for this? "CmdMute - Written by Maverick Woo "; VOID usage() { printf("Usage: cmdmute [0|1]\n"); printf(" 0 - Mute OFF\n"); printf(" 1 - Mute ON\n"); printf(" Toggle if no argument is given.\n"); printf(" Status message printed to STDERR.\n"); printf(" Errorlevel indicates mute status.\n"); exit(2); } UINT nNumMixers; HMIXER hMixer; MIXERCAPS mxcaps; BOOL mmInit() { nNumMixers = mixerGetNumDevs(); hMixer = NULL; ZeroMemory(&mxcaps, sizeof(MIXERCAPS)); if(nNumMixers != 0) { if (mixerOpen(&hMixer, 0, 0, NULL, MIXER_OBJECTF_MIXER) != MMSYSERR_NOERROR) { return FALSE; } if (mixerGetDevCaps((UINT)hMixer, &mxcaps, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR) { return FALSE; } } return hMixer != NULL; } BOOL mmClose() { return mixerClose(hMixer) == MMSYSERR_NOERROR; } BOOL mmGetMuteControl(DWORD* id) { // get dwLineID MIXERLINE mxl; mxl.cbStruct = sizeof(MIXERLINE); mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; if (mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR) { return FALSE; } // get dwControlID MIXERCONTROL mxc; MIXERLINECONTROLS mxlc; mxlc.cbStruct = sizeof(MIXERLINECONTROLS); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; mxlc.cControls = 1; mxlc.cbmxctrl = sizeof(MIXERCONTROL); mxlc.pamxctrl = &mxc; if (mixerGetLineControls((HMIXEROBJ)hMixer, &mxlc, MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE) != MMSYSERR_NOERROR) { return FALSE; } *id = mxc.dwControlID; return TRUE; } BOOL mmGetMuteValue(DWORD id, LONG* value) { MIXERCONTROLDETAILS_BOOLEAN mxcdMute; MIXERCONTROLDETAILS mxcd; mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS); mxcd.dwControlID = id; mxcd.cChannels = 1; mxcd.cMultipleItems = 0; mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN); mxcd.paDetails = &mxcdMute; if (mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR){ return FALSE; } *value = mxcdMute.fValue; return TRUE; } BOOL mmSetMuteValue(DWORD id, char todo) { MIXERCONTROLDETAILS_BOOLEAN mxcdMute = { (LONG)todo }; MIXERCONTROLDETAILS mxcd; mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS); mxcd.dwControlID = id; mxcd.cChannels = 1; mxcd.cMultipleItems = 0; mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN); mxcd.paDetails = &mxcdMute; if (mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR) { return FALSE; } return TRUE; } int main(int argc, char* argv[]) { char todo = -1; //-1 is toggle, 1 is mute, 0 is no mute if(argc >= 3) { usage(); } else if(argc == 2) { switch(argv[1][0]) { case '0': if (argv[1][1] == 0) { todo = 0; break; } case '1': if (argv[1][1] == 0) { todo = 1; break; } default: usage(); } } DWORD controlID; if(mmInit() && mmGetMuteControl(&controlID)) { LONG currValue; mmGetMuteValue(controlID, &currValue); if (todo == -1) //need to know what to do todo = 1 - (char)currValue; if (todo != (char)currValue) mmSetMuteValue(controlID, todo); fprintf(stderr, todo == 1 ? "Mute ON\n" : "Mute OFF\n"); mmClose(); } return todo; }