там не все так просто - типа нажал и готово - не покатит.
для начала нужна настройка вашей проги что и где включать - карт может быть много, микрофонов еще больше...
попозже выложу пример.
+
выводим список всего что есть.
на форме listbox + кнопка. +mmsystem.h
void __fastcall TForm1::ButtonInfoClick (TObject *Sender)
{
HMIXER mixer;
MIXERCAPS mixercaps;
MIXERLINE mixerline;
int MixerCount;
int Res;
int MixerTypes[20] =
{
MIXERLINE_COMPONENTTYPE_DST_DIGITAL,
MIXERLINE_COMPONENTTYPE_DST_HEADPHONES,
MIXERLINE_COMPONENTTYPE_DST_LINE,
MIXERLINE_COMPONENTTYPE_DST_MONITOR,
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
MIXERLINE_COMPONENTTYPE_DST_TELEPHONE,
MIXERLINE_COMPONENTTYPE_DST_UNDEFINED,
MIXERLINE_COMPONENTTYPE_DST_VOICEIN,
MIXERLINE_COMPONENTTYPE_DST_WAVEIN,
MIXERLINE_COMPONENTTYPE_SRC_ANALOG,
MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY,
MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC,
MIXERLINE_COMPONENTTYPE_SRC_DIGITAL,
MIXERLINE_COMPONENTTYPE_SRC_LINE,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER,
MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER,
MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE,
MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED,
MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT,
};
AnsiString MixerStrTypes[20] =
{
"MIXERLINE_COMPONENTTYPE_DST_DIGITAL",
"MIXERLINE_COMPONENTTYPE_DST_HEADPHONES",
"MIXERLINE_COMPONENTTYPE_DST_LINE",
"MIXERLINE_COMPONENTTYPE_DST_MONITOR",
"MIXERLINE_COMPONENTTYPE_DST_SPEAKERS",
"MIXERLINE_COMPONENTTYPE_DST_TELEPHONE",
"MIXERLINE_COMPONENTTYPE_DST_UNDEFINED",
"MIXERLINE_COMPONENTTYPE_DST_VOICEIN",
"MIXERLINE_COMPONENTTYPE_DST_WAVEIN",
"MIXERLINE_COMPONENTTYPE_SRC_ANALOG",
"MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY",
"MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC",
"MIXERLINE_COMPONENTTYPE_SRC_DIGITAL",
"MIXERLINE_COMPONENTTYPE_SRC_LINE",
"MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE",
"MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER",
"MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER",
"MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE",
"MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED",
"MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT",
};
MixerCount = mixerGetNumDevs();
if (!MixerCount)
{
ListBox1->Items->Add("No mixers is system");
return;
}
ListBox1->Items->Add("Mixers count = " + IntToStr(MixerCount));
for (int m = 0; m < MixerCount; m++)
{
Res = mixerOpen(&mixer, m, 0, 0, 0);
if (Res == MMSYSERR_NOERROR)
{
AnsiString S = "Mixer #" + IntToStr(m);
Res = mixerGetDevCaps((UINT) mixer, &mixercaps, sizeof(MIXERCAPS));
if (Res == MMSYSERR_NOERROR) S = S + ", Device = " + mixercaps.szPname;
ListBox1->Items->Add("");
ListBox1->Items->Add(S);
for (int i = 0; i < 20; i++)
{
mixerline.cbStruct = sizeof(mixerline);
mixerline.dwComponentType = MixerTypes[i];
Res = mixerGetLineInfo(mixer, &mixerline, MIXER_GETLINEINFOF_COMPONENTTYPE);
if (Res == MMSYSERR_NOERROR)
{
AnsiString S = "MIXER_GETLINEINFOF_COMPONENTTYPE / " + MixerStrTypes[i] + " / " + mixerline.szName;
ListBox1->Items->Add(S);
}
}
Res = mixerGetDevCaps((UINT) mixer, &mixercaps, sizeof(MIXERCAPS));
if (Res == MMSYSERR_NOERROR)
{
for (int i = 0; i < (int) mixercaps.cDestinations; i++)
{
mixerline.cbStruct = sizeof(mixerline);
mixerline.dwDestination = i;
Res = mixerGetLineInfo(mixer, &mixerline, MIXER_GETLINEINFOF_DESTINATION);
if (Res == MMSYSERR_NOERROR)
{
AnsiString S = (AnsiString) "MIXER_GETLINEINFOF_DESTINATION / " + mixerline.szName;
ListBox1->Items->Add(S);
}
}
}
mixerClose(mixer);
}
}
}
+
управляем микрофоном на указанном миксере:
+mmsystem.h
true - успешно завершено, иначе ошибка.
bool SetMicrophoneMute (bool AMute)
{
HMIXER mixer;
MIXERLINECONTROLS mxlc;
MIXERCONTROLDETAILS mxcd;
MIXERCONTROL mxc;
MIXERLINE mixerline;
MIXERCONTROLDETAILS_BOOLEAN mcdMute;
int MixerCount;
int Res;
bool Result = false;
int MYMIXERDEVICE = 0; // миксер, где микрофон. может быть 0..n-1 (n - число миксеров в системе)
MixerCount = mixerGetNumDevs();
if (!MixerCount) return Result;
Res = mixerOpen(&mixer, MYMIXERDEVICE, 0, 0, 0);
if (Res == MMSYSERR_NOERROR)
{
mixerline.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
mixerline.cbStruct = sizeof(mixerline);
Res = mixerGetLineInfo(mixer, &mixerline, MIXER_GETLINEINFOF_COMPONENTTYPE);
if (Res == MMSYSERR_NOERROR)
{
ZeroMemory(&mxlc, sizeof(mxlc));
mxlc.cbStruct = sizeof(mxlc);
mxlc.dwLineID = mixerline.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(mxc);
mxlc.pamxctrl = &mxc;
Res = mixerGetLineControls(mixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (Res == MMSYSERR_NOERROR)
{
ZeroMemory(&mxcd, sizeof(mxcd));
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mxcd.paDetails = &mcdMute;
mcdMute.fValue = (AMute) ? 1 : 0;
Res = mixerSetControlDetails(mixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
if (Res == MMSYSERR_NOERROR) Result = true;
}
}
mixerClose(mixer);
}
return Result;
}
+
учтите, что номер миксера не фиксирован
так что придется переискивать каждый раз заново (ну, это если неск карт в системе)
короче, я предупредил