现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

windows下如何获取系统音量

2013-09-05 23:15 工业·编程 ⁄ 共 2965字 ⁄ 字号 暂无评论

之前想实现这个功能,找了很多资料,全都不给力,最后发现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); 

给我留言

留言无头像?