problem on recording sound
Hello,
My application needs to record the sound of the microphone. But, I am
worrying the user may set the microphone input volume mute by accident. So I
want to use some codes to check it and set the volume of microphone input
maximum.
Is there any API to do this?Thanks
解答
You will need to use the Mixer functions, MixerGetControlDetail and MixerSetControlDetail.
See if this helps.
http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c1561/
AliR.
所有回覆
You will need to use the Mixer functions, MixerGetControlDetail and MixerSetControlDetail.
See if this helps.
http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c1561/
AliR.
When I build the project, an error occured:
c:\program files\microsoft visual studio\vc98\include\mmsystem.h(113) : error C2146: syntax error : missing ';' before identifier 'MMVERSION'
c:\program files\microsoft visual studio\vc98\include\mmsystem.h(113) : fatal error C1004: unexpected end of file foundWhat is the problem?
ThanksHello,
Now, I have solved the above problem by some other articles, but I have a new problem.
I can control the output volume with the codes provided by the above article, but I still can't change the input volume. How can I change the input volume?
Thanks.
Pass MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE to these functions for the microphone volume. See the help for MIXERLINE struct for other possible values. The dwVolume range is from 0 to 0xFFFF
Code Snippetvoid
SetVolume(DWORD OfWhichDevice, DWORD dwVolume ){
MMRESULT result;
HMIXER hMixer;
MIXERLINE ml = {0};
MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};
// get a handle to the mixer deviceresult = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);
if (MMSYSERR_NOERROR == result){
sizeof(MIXERLINE);ml.cbStruct =
ml.dwComponentType = OfWhichDevice;
// get the speaker line of the mixer deviceresult = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
if (MMSYSERR_NOERROR == result){
sizeof(MIXERLINECONTROLS);mlc.cbStruct =
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl =
sizeof(MIXERCONTROL); // get the volume controls associated with the speaker lineresult = mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (MMSYSERR_NOERROR == result){
sizeof(MIXERCONTROLDETAILS);mcdu.dwValue = dwVolume;
mcd.cbStruct =
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails =
sizeof(MIXERCONTROLDETAILS_UNSIGNED);mcd.cChannels = 1;
// set the volumeresult = mixerSetControlDetails((HMIXEROBJ) hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR == result)
"Volume changed!");AfxMessageBox(
else
"mixerSetControlDetails() failed");AfxMessageBox(
}
else
"mixerGetLineControls() failed");AfxMessageBox(
}
else
"mixerGetLineInfo() failed");AfxMessageBox(
elsemixerClose(hMixer);
}
"mixerOpen() failed");AfxMessageBox(
}
//====================================================================
DWORD GetVolume( DWORD OfWhichDevice)
{
// get a handle to the mixer deviceDWORD dwVolume = -1;
MMRESULT result;
HMIXER hMixer;
MIXERLINE ml = {0};
MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};
result = mixerOpen(&hMixer, 0, 0, 0, MIXER_OBJECTF_HMIXER);
if (MMSYSERR_NOERROR == result){
sizeof(MIXERLINE);ml.cbStruct =
ml.dwComponentType = OfWhichDevice;
// get the speaker line of the mixer deviceresult = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
if (MMSYSERR_NOERROR == result){
sizeof(MIXERLINECONTROLS);mlc.cbStruct =
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl =
sizeof(MIXERCONTROL); // get the volume controls associated with the speaker lineresult = mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (MMSYSERR_NOERROR == result){
sizeof(MIXERCONTROLDETAILS);mcd.cbStruct =
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails =
sizeof(MIXERCONTROLDETAILS_UNSIGNED);mcd.cChannels = 1;
// get the volumeresult = mixerGetControlDetails((HMIXEROBJ) hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR == result)
elsedwVolume = mcdu.dwValue;
"mixerGetControlDetails() failed");AfxMessageBox(
}
else
"mixerGetLineControls() failed");AfxMessageBox(
}
else
"mixerGetLineInfo() failed");AfxMessageBox(
elsemixerClose(hMixer);
}
"mixerOpen() failed"); return (dwVolume);AfxMessageBox(
}
Thanks.
But when I invoked SetVolume(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,0);, it told me mixerGetLineInfo() failed.
And because of the restriction of my sound card, I can't change the microphone input volume in the control panel neither. I can only change the leftmost volume in the "Realtek HD Audio Input", maybe it is called "Recording Control" in English.(My OS is not a english version). How can I change the "recording control" volume? What argument should I pass to the SetVolume method?Look at the help for MIXERLINE, try passing in different values of dwComponentType to Get/SetVolume and see if any of them help. Otherwise I am out of suggestions.
mabye MIXERLINE_COMPONENTTYPE_DST_DIGITAL or MIXERLINE_COMPONENTTYPE_DST_LINE
AliR.
Unfortunately, I have tried all the values and they all didn't work
Was anyone able to resolve this? This is the exact same problem I am experiencing.
I can control all the audio sources and destination on the Volume Control except for the "Line Volume" and "Mic Volume" when selecting the Realtek HD Audio Input as the Mixer device.
http://www.teamsoftwaresolutions.com/picts/realtek.gif
Any information would be appreciated.
- Hi, I am having same Error using the MMSystem.
mmsystem.h(113) : error C2146: syntax error : missing ';'
What did you do to resolve your compiler error?
Thanks

