之前想实现这个功能,找了很多资料,全都不给力,最后发现Microsoft给的那才是可以用的,总的来说就是使用mixer api来打开混音器设备、获得音频线路信息、然后设定属性。实现这个之后,就可以用在你写的程序比如播放器上面啦。
总共就下面几个函数:
通过这9个API,我们就可以来控制音频的输入和输出设备了,其实有关这几个函数的定义你可以在C:/Program Files/Microsoft Visual Studio/VC98/Include/mmsystem.h文件中找到。下面我简单介绍一下这几个函数,详细地介绍你可以参见msdn。
mixerOpen和mixerClose函数用来打开和关闭混音器设备
mixerGetNumDevs可以确定系统中有多少混音器设备
mixerGetDevCaps函数可以确定混音器设备的能力
mixerGetLineInfo可以检索指定音频线路的信息
mixerGetLineControls用于检索一个或者多个与音频线路相关的控制的通用信息
mixerGetControlDetails用于检索与某个音频线路相关的一个控制的属性
mixerSetControlDetails用于设置制定控制的属性。
对话框工程(工程->设置->链接 添加winmm.lib,头文件包含mmsystem.h),添加一个slider控件,关联control变量m_volume
我把那个滑块设为了垂直样式,仿右下角那个小喇叭的风格:)
但是这样一来我发现一个问题,垂直样式默认刻度是上边小下边大,而我想实现的是下边为0刻度,上面为最大值,google一下无解决方案。
csdn就是智慧无穷,我被鄙视了。。。kemee童鞋说“….. 我是自己再做个运算的….比如0~100,不管什么数据要在控件上显示了,就和100先做个运算,再设置,这样0就显示100,100的时候就显示0了。。”,就是这么无须解释,我承认我脑袋很锈
给CSliderDlg添加成员变量:
MIXERCONTROLDETAILS_SIGNED volStruct;
MIXERCONTROLDETAILS mxcd;
MIXERLINECONTROLS mxlc;
MIXERLINE mxl;
MIXERCONTROL mxc;
HMIXER m_hmx;
在OnInitDialog中添加一下代码:
// TODO: Add extra initialization here
unsigned long err;
CString str;
err = mixerOpen(&m_hmx,0,0,0,0);
if(err)
{
MessageBox("ERROR:Can’t open Mixer Device!");
}
//初始化MIXERLINE结构体
ZeroMemory(&mxl,sizeof(mxl));
mxl.cbStruct = sizeof(mxl);
// 指出需要获取的通道,扬声器用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if(mixerGetLineInfo((HMIXEROBJ)m_hmx,&mxl,
MIXER_GETLINEINFOF_COMPONENTTYPE))
{
MessageBox("Couldn’t get the mixer line!");
}
// 取得控制器.
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);
if(mixerGetLineControls((HMIXEROBJ)m_hmx,&mxlc,
MIXER_GETLINECONTROLSF_ONEBYTYPE))
{
MessageBox("取得控制器失败!");
}
// 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
// 初始化MIXERCONTROLDETAILS结构体
ZeroMemory(&mxcd, sizeof(mxcd));
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(volStruct);
mxcd.dwControlID = mxc.dwControlID;
mxcd.paDetails = &volStruct;
mxcd.cChannels = 1;
// 获得音量值
if(mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,
MIXER_GETCONTROLDETAILSF_VALUE))
{
MessageBox("无法获得音量");
}
//str.Format("%d %d %d",mxc.Bounds.dwMinimum,mxc.Bounds.dwMaximum,volStruct.lValue);
//MessageBox(str);
/*unsigned long mixerID;
err = mixerGetID((struct HMIXEROBJ__ *)m_hmx, (unsigned int *)&mixerID, MIXER_OBJECTF_HMIXER);
if (err)
{
MessageBox("ERROR: Can’t get Mixer Device ID!");
}
else
{
str.Format("Mixer Device ID = %d/n", mixerID);
MessageBox(str);
}
MIXERCAPS mixcaps;
unsigned long iNumDevs, i;
// 获取系统中混音器设备个数
iNumDevs = mixerGetNumDevs();
// 遍历所有的混音器并显示它们的ID和名称
for (i = 0; i < iNumDevs; i++)
{
// 获取下一个混音器设备的信息
if (!mixerGetDevCaps(i, &mixcaps, sizeof(MIXERCAPS)))
{
// 显示ID和名称
str.Format("Device ID #%u: %s/r/n", i, mixcaps.szPname);
MessageBox(str);
}
}*/
m_volume.SetRange(mxc.Bounds.dwMinimum,mxc.Bounds.dwMaximum);
m_volume.SetPos(mxc.Bounds.dwMaximum – volStruct.lValue);