最近做VR开发时需要对麦克风分的录音进行操作,其中涉及到调节录音的大小,检测录音的的大小等功能,我主要使用c++调用windows的音频相关的api来进行对录音的操作,在这里记录一下。
对音频的控制主要用到mixer相关的函数,与它相关的函数主要有以下几个
mixerOpen和mixerClose函数用来打开和关闭混音器设备
mixerGetNumDevs可以确定系统中有多少混音器设备
mixerGetDevCaps函数可以确定混音器设备的能力
mixerGetLineInfo可以检索指定音频线路的信息
mixerGetLineControls用于检索一个或者多个与音频线路相关的控制的通用信息
mixerGetControlDetails用于检索与某个音频线路相关的一个控制的属性
mixerSetControlDetails用于设置制定控制的属性。
现在在来看看如何对麦克风录入音量大小的控制
想要控制麦克风录入音量的大小,主要包括以下几个步骤
①遍历打开系统的混音器,直到找到麦克风的混音器,记录该设备ID
②根据取得的设备ID,取得音频线路相关的通用信息
③根据上面取得的音频线路相关的通用信息取得或者设定该音频线路的控制
具体的取得和控制麦克风设置音量的代码如下
int setAudioInputVolumn(DWORD dwVolume)
{
//初始化相关结构体
MMRESULT rc;
HMIXER hMixer;
MIXERLINE mxl;
MIXERLINECONTROLS mxlc;
MIXERCONTROL mxc;
//①遍历系统的混音器,直到找到麦克风的混音器,记录该设备ID
for (int deviceID = 0; true; deviceID++)
{
//打开当前的混音器,deviceID为混音器的id
rc = mixerOpen(&hMixer, deviceID, 0, 0, MIXER_OBJECTF_MIXER);
if (MMSYSERR_NOERROR != rc)
{
break;
}
ZeroMemory(&mxl, sizeof(MIXERLINE));
mxl.cbStruct = sizeof(MIXERLINE);
/* 指出需要获取的通道,
声卡的音频输出用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
声卡的音频输入用MIXERLINE_COMPONENTTYPE_DST_WAVEIN
*/
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
// 取得混合器设备的指定线路信息
rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
if (rc != MMSYSERR_NOERROR)
{
continue;
}
// 取得混合器设备的指定线路信息成功的话,则将连接数保存
DWORD dwConnections = mxl.cConnections;
DWORD dwLineID = -1;
for (DWORD i = 0; i<dwConnections;)
{
mxl.dwSource = i;