双击系统右下角的小喇叭,弹出播放控制,然后点“选项”菜单,点击“属性”。在“调节音量”栏中选中“录音”,然后确定。这里就是调节录音音量的地方。
请问我想调节麦克风的录音音量,该怎么做?
我已经查过以前的贴子,所有的代码都只能调节放音的音量,而不是录音。
所以我重申一遍,只能调节放音音量的代码就不要再贴了,我问的是如何调节录音音量。
使用别的控件的方法不予考虑,只能用API。
一段代码供参考:
int CHMixerManager::Set_SpeakerConnectionVolume(UINT rMixerID, DWORD rLineIndex, DWORD *rVolumePercent, BOOL *rMuteNow)
{
// open mixer by id
HMIXER mixer = NULL;
HRESULT hr = ::mixerOpen(
&mixer,
rMixerID,
NULL,
NULL,
MIXER_OBJECTF_MIXER);
if (FAILED(hr))
return ERR_BASE_MIM_FailedToOpenMixer;
// get line count of destination line
MIXERLINE lineinfo;
::ZeroMemory(&lineinfo, sizeof(MIXERLINE));
lineinfo.cbStruct = sizeof(MIXERLINE);
lineinfo.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
hr = ::mixerGetLineInfo(
(HMIXEROBJ)mixer,
&lineinfo,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE);
// get info of specified connector
DWORD lineID = lineinfo.dwDestination;
::ZeroMemory(&lineinfo, sizeof(MIXERLINE));
lineinfo.cbStruct = sizeof(MIXERLINE);
lineinfo.dwDestination = lineID;
lineinfo.dwSource = rLineIndex;
hr = ::mixerGetLineInfo(
(HMIXEROBJ)mixer,
&lineinfo,
MIXER_GETLINEINFOF_SOURCE);
if (rVolumePercent)
{
// get volume control ID
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = lineinfo.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
::mixerGetLineControls(
reinterpret_cast<HMIXEROBJ>(mixer),
&mxlc,
MIXER_OBJECTF_HMIXER|MIXER_GETLINECONTROLSF_ONEBYTYPE);
// get volume value range now
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mixerGetControlDetails(
reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
// set volume
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume_Set = {
mxc.Bounds.dwMaximum * (*rVolumePercent) / 100 };
MIXERCONTROLDETAILS mxcd_Set;
mxcd_Set.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd_Set.dwControlID = mxc.dwControlID;
mxcd_Set.cChannels = 1;
mxcd_Set.cMultipleItems = 0;
mxcd_Set.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd_Set.paDetails = &mxcdVolume_Set;
mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd_Set,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE);
}
if (rMuteNow)
{
// get mute control id
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = lineinfo.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
hr = ::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(mixer),
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE);
// set mute value now
MIXERCONTROLDETAILS_BOOLEAN mxcdMute = { *rMuteNow };
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mxcd.paDetails = &mxcdMute;
hr = ::mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE);
}
// close mixer
::mixerClose(mixer);
return 0;
}
mark
long int max_vol;
HMIXER hmx;
mixerOpen(&hmx, 0, 0, 0, 0);
用MIXERLINE_COMPONENTTYPE_DST_WAVEIN 作参数可得到所有录音的Connection
MIXERLINE mxl;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN ;
mixerGetLineInfo((HMIXEROBJ)hmx, &mxl,MIXER_GETLINEINFOF_COMPONENTTYPE);
DWORD cConnections = mxl.cConnections;
for(DWORD j=0; j<cConnections; j++)
{
mxl.dwSource = j;
mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE);
AfxMessageBox(mxl.szName);
}
录音一般修改的是MIC的输入
学习
走mixer思路是对了。
我以前在 codeproject 上发布过一个类,就是专门调节录音音量的。 时间长乐有点记不大清楚,应该是在多媒体、音频分类下。
谢谢楼主兄弟提点.偶是发错了.嘿嘿...
int CHMixerManager::Set_WaveInConnectionLevel(UINT rMixerID, DWORD rLineIndex, DWORD *rLevelPercent, BOOL *rSelected)
{
// open mixer by id
HMIXER mixer = NULL;
HRESULT hr = ::mixerOpen(
&mixer,
rMixerID,
NULL,
NULL,
MIXER_OBJECTF_MIXER);
if (FAILED(hr))
return ERR_BASE_MIM_FailedToOpenMixer;
// get line id of destination line
MIXERLINE lineinfo_Dest;
::ZeroMemory(&lineinfo_Dest, sizeof(MIXERLINE));
lineinfo_Dest.cbStruct = sizeof(MIXERLINE);
lineinfo_Dest.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
hr = ::mixerGetLineInfo(
(HMIXEROBJ)mixer,
&lineinfo_Dest,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE);
// get id of specified connector
MIXERLINE lineinfo_Connector;
::ZeroMemory(&lineinfo_Connector, sizeof(MIXERLINE));
lineinfo_Connector.cbStruct = sizeof(MIXERLINE);
lineinfo_Connector.dwDestination = lineinfo_Dest.dwLineID;
lineinfo_Connector.dwSource = rLineIndex;
hr = ::mixerGetLineInfo(
(HMIXEROBJ)mixer,
&lineinfo_Connector,
MIXER_GETLINEINFOF_SOURCE);
if (rLevelPercent)
{
// get volume control ID
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = lineinfo_Connector.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
::mixerGetLineControls(
reinterpret_cast<HMIXEROBJ>(mixer),
&mxlc,
MIXER_OBJECTF_HMIXER|MIXER_GETLINECONTROLSF_ONEBYTYPE);
// get volume value range now
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mixerGetControlDetails(
reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
// set volume
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume_Set = {
mxc.Bounds.dwMaximum * (*rLevelPercent) / 100 };
MIXERCONTROLDETAILS mxcd_Set;
mxcd_Set.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd_Set.dwControlID = mxc.dwControlID;
mxcd_Set.cChannels = 1;
mxcd_Set.cMultipleItems = 0;
mxcd_Set.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd_Set.paDetails = &mxcdVolume_Set;
mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd_Set,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE);
}
//////////////////////
// selected control
if (rSelected)
{
// get dwControlID
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = lineinfo_Dest.dwLineID;
DWORD m_dwControlType = MIXERCONTROL_CONTROLTYPE_MIXER;
mxlc.dwControlType = m_dwControlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(mixer),
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE)
!= MMSYSERR_NOERROR)
{
// no mixer, try MUX
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = lineinfo_Dest.dwLineID;
m_dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
mxlc.dwControlType = m_dwControlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(mixer),
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
}
// store dwControlID, cMultipleItems
//m_dwSelectControlID = mxc.dwControlID;
//m_dwMultipleItems = mxc.cMultipleItems;
if (mxc.cMultipleItems == 0)
{
return -1;
}
// get all the values first
MIXERCONTROLDETAILS_BOOLEAN *pmxcdSelectValue =
new MIXERCONTROLDETAILS_BOOLEAN[mxc.cMultipleItems];
if (pmxcdSelectValue != NULL)
{
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = mxc.cMultipleItems;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mxcd.paDetails = pmxcdSelectValue;
if (::mixerGetControlDetails(reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_GETCONTROLDETAILSF_VALUE)
== MMSYSERR_NOERROR)
{
// MUX restricts the line selection to one source line at a time.
if (m_dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
{
::ZeroMemory(pmxcdSelectValue,
mxc.cMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
}
// set the want line value
pmxcdSelectValue[mxc.cMultipleItems -1 - rLineIndex].fValue = TRUE;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = mxc.cMultipleItems;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mxcd.paDetails = pmxcdSelectValue;
if (::mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(mixer),
&mxcd,
MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
{
delete []pmxcdSelectValue;
::mixerClose(mixer);
return -2;
}
}
delete []pmxcdSelectValue;
}
}
// close mixer
::mixerClose(mixer);
return 0;
}