在程序中怎样调节麦克风音量?(更新)

mountlin 2000-10-01 09:25:00
调节喇叭音量可以用waveOutSetVolume()函数,但却没有waveInSetVolume()函数,那么该怎样编程,实现象netmeeting向导那样调节麦克风音量呢?
...全文
875 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hew 2000-10-18
  • 打赏
  • 举报
回复
INT CMixer::ProcessLine(BOOL bIsSet, UINT iCardIndex, DWORD dwType,LPVOID paDetails,DWORD cbDetails,long *plMin,long *plMax)
{
MMRESULT rc; // Return code.
HMIXER hMixer; // Mixer handle used in mixer API calls.
MIXERCONTROL mxc; // Holds the mixer control data.
MIXERLINE mxl; // Holds the mixer line data.
MIXERLINECONTROLS mxlc; // Obtains the mixer control.
// Open the mixer. This opens the mixer with a deviceID of 0. If you
// have a single sound card/mixer, then this will open it. If you have
// multiple sound cards/mixers, the deviceIDs will be 0, 1, 2, and
// so on.
rc = mixerOpen(&hMixer, iCardIndex,0,0,0);
if (MMSYSERR_NOERROR != rc) { // Couldn't open the mixer.
mixerClose(hMixer);
return 1;
}
// Initialize MIXERLINE structure.
ZeroMemory(&mxl,sizeof(mxl));
mxl.cbStruct = sizeof(mxl);
// Specify the line you want to get. You are getting the input line
// here. If you want to get the output line, you need to use
// MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT.
mxl.dwComponentType = dwType;
rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl,
MIXER_GETLINEINFOF_COMPONENTTYPE);
if (MMSYSERR_NOERROR != rc) { // Couldn't get the mixer line.
mixerClose(hMixer);
return 2;
}
// Get the control.
ZeroMemory(&mxlc, sizeof(mxlc));
mxlc.cbStruct = sizeof(mxlc);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(mxc);
mxlc.pamxctrl = &mxc;
ZeroMemory(&mxc, sizeof(mxc));
mxc.cbStruct = sizeof(mxc);
rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,
MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (MMSYSERR_NOERROR != rc) { // Couldn't get the control.
mixerClose(hMixer);
return 3;
}
if (plMin) *plMin = mxc.Bounds.lMinimum;
if (plMax) *plMax = mxc.Bounds.lMaximum;
// After successfully getting the peakmeter control, the volume range
// will be specified by mxc.Bounds.lMinimum to mxc.Bounds.lMaximum.
MIXERCONTROLDETAILS mxcd; // Gets the control values.
// Initialize the MIXERCONTROLDETAILS structure
ZeroMemory(&mxcd, sizeof(mxcd));
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = cbDetails;
mxcd.dwControlID = mxc.dwControlID;
mxcd.paDetails = paDetails;
mxcd.cChannels = 1;
// Get the current value of the peakmeter control. Typically, you
// would set a timer in your program to query the volume every 10th
// of a second or so.
if (bIsSet)
{
rc = mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR != rc) { // Couldn't get the current volume.
mixerClose(hMixer);
return 4;
}
}
else
{
rc = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR != rc) { // Couldn't get the current volume.
mixerClose(hMixer);
return 5;
}
}
return 0;
}

STDMETHODIMP CMixer::GetMicVolume(short iCardIndex, long *plVolume, long *plMin, long *plMax)
{
// TODO: Add your implementation code here
MIXERCONTROLDETAILS_SIGNED volStruct;
INT iRet = ProcessLine(FALSE,iCardIndex,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
&volStruct,sizeof(volStruct),plMin,plMax);
*plVolume = volStruct.lValue;
if (iRet)
return S_FALSE;
else
return S_OK;
}

STDMETHODIMP CMixer::SetMicVolume(short iCardIndex, long lVolume)
{
// TODO: Add your implementation code here
MIXERCONTROLDETAILS_SIGNED volStruct;
volStruct.lValue = lVolume;
INT iRet = ProcessLine(TRUE,iCardIndex,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
&volStruct,sizeof(volStruct));
if (iRet)
return S_FALSE;
else
return S_OK;
}

STDMETHODIMP CMixer::GetWaveoutVolume(short iCardIndex, long *plVolume, long *plMin, long *plMax)
{
// TODO: Add your implementation code here
MIXERCONTROLDETAILS_SIGNED volStruct;
INT iRet = ProcessLine(FALSE,iCardIndex,
MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT,
&volStruct,sizeof(volStruct),plMin,plMax);
*plVolume = volStruct.lValue;
if (iRet)
return S_FALSE;
else
return S_OK;
}

STDMETHODIMP CMixer::SetWaveoutVolume(short iCardIndex, long lVolume)
{
// TODO: Add your implementation code here
MIXERCONTROLDETAILS_SIGNED volStruct;
volStruct.lValue = lVolume;
INT iRet = ProcessLine(TRUE,iCardIndex,
MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT,
&volStruct,sizeof(volStruct));
if (iRet)
return S_FALSE;
else
return S_OK;
}
zhq2000 2000-10-02
  • 打赏
  • 举报
回复
用 mixerOpen(hMixer,0,0,0) 取得句柄hMixer , GetVolumeControl(hMixer,MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,MIXERCONTROL_CONTROLTYPE_VOLUME,
micCtrl) ,然后再用 SetVolumeControl(hMixer,micCtrl, vol /*音量值*/) 就可以了。
详细资料参考MSDN。
程序片段:

BOOL GetVolumeControl(HMIXER hmix,DWORD dwComponentType ,DWORD dwControlType,LPMIXERCONTROL mixCtrl)
{
MIXERLINECONTROLS mixlc;
MIXERLINE mxl;
MMHRESULT res;

ZeroMemory(&mxl,sizeof(mxl));
mxl.cbStruct=sizeof(mxl);
mxl.dwComponentType=dwConponentType;
res=mixerGetLineControls((HMIXEROBJ)hmix,&mxl,MIXER_GETLINECONTROLSF_ONEBYTYPE);
if(res!=MMSYSERR_NOERROR)
return FALSE;

ZeroMemory(mixCtrl,sizeof(MIXERCONTROL));
mixCtrl->cbStruct=sizeof(MIXERCONTROL);

ZeroMemory(&mixlc,sizeof(mixlc));
mixlc.cbStruct=sizeof(mixlc);
mixlc.dwLineID=mxl.dwLineID;
mixlc.dwControl=dwControlType;
mixlc.cControls=1;
mixlc.cbmxctrl=sizeof(MIXERCONTROL);
mix1c.pamxctrl=mixCtrl;

res=mixerGetLineControls((HMIXEROBJ)hmix,mixlc,MIXER_GETLINECONTROLSF_ONEBYTYPE);
if(res!=MMSYSERR_NOERROR)
return FALSE;

return TRUE;
}

BOOL SetVolumeControl(HMIXER hmix,LPMIXERCONTROL mxc,DWORD dwVol)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol;

vol.dwValue=dwVol;

ZeroMemory(&mxcd,sizeof(mxcd));
mxcd.cbStruct=sizeof(mxcd);
mxcd.item=0;
mxcd.cbDetails=sizeof(vol);
mxcd.paDetails=&vol;

MMRESULT res=mixerSetControlDetails((HMIXEROBJ)hmix,&mxcd,MIXER_SETCONTROLDETAILSF_VALUE);

if(res!=MMSYSERR_NOERROR)
return FALSE

return TRUE;
}

HMIXER hMixer;
MMRESULT mmr;
MIXERCONTROL mix
DWORD dwVolume=5050;
mmr=mixerOpen(&hMixer,0,0,0);
if(mmr==MMSYSERR_NOERROR)
{
if(GetVolumeControl( hMixer , MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE , MIXERCONTROL_CONTROLTYPE_VOLUME , &mix))
{
SetVolumeControl(hmixer,&mix,dwVolume);
}
}
敬告:该系列的课程在抓紧录制更新,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。  我将带领大家一起来学习:采集麦克风、PCM重采样、AAC或MP3音频编码存储、并直播。具体内容包括:1.FFmpeg采集麦克风并存储为PCM。2.PCM重采样原理及实战。3.采集麦克风并实时转码AAC或MP3并保存文件。4.采集麦克风并实时转码AAC并可以直播。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。 目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧