频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

11.2.3 音量大小控制

作者: 明日科技 宋坤 刘锐宁 出处:人民邮电出版社  2008-05-03 17:16    砖    好    评论   进入论坛
阅读提示:《Visual C++程序设计自学手册》主要是以初学者学习程序开发为中心,由浅入深地全面介绍使用Visual C++ 6.0开发程序的各种技术。本章讲述了多媒体技术,就位图文件、WAVE文件、AVI文件和Flash动画进行简单的介绍,其中需要重点掌握的是位图文件的各种操作。本节讲了音量大小控制

11.2.3  音量大小控制

音量控制是多媒体应用的主要部分,在音频采集方面可以起到辅助控制录制效果的作用。使用MCI(The Media Control Interface)接口可以进行音量控制。系统提供了一个音量控制的程序,通过该程序可以控制不同类型音量,音量控制程序运行如图11.6所示。
其中,Volume表示系统总音量,Wave表示波形音量,SW Synth表示SW设备音量,CD Player表示CD控制线,Line In表示磁带设备音量,Microphone表示麦克风音量。

图11.6  音量控制程序
为了实现音量的控制,微软提供了一些与Mixer(混音器)相关的API函数。在控制系统总音量时,首先通过mixerOpen函数打开混音设备,然后通过mixerGetLineInfo函数获取控制线信息取得设备ID号并通过mixerGetLineControls函数得到控制线的控制,最后通过mixerGetControlDetails得到具体的音量信息,通过mixerSetControlDetails函数来设置音量。
(1)mixerOpen函数用于打开指定的混音器设备,并确保在应用程序关闭之前设备不被移除。

语法:

MMRESULT mixerOpen( LPHMIXER phmx, UINT uMxld, DWORD dwCallback, DWORD dwlnstance, DWORD fdwOpen );

mixerOpen函数语法中的参数说明如表11.5所示。
表11.5 mixerOpen函数语法中的参数说明
参 数 名 称 描    述
phmx   返回已打开的混音设备的标识句柄
uMxld 指定要打开的混音器设备标识
dwCallback 指定调用窗口句柄
dwlnstance 指定调用实例句柄
fdwOpen           设备打开标志

(2)mixerGetLineInfo函数用于获取混音器设备指定的线路信息。
语法:

MMRESULT mixerGetLinelnfo( HMIXEROBJ hmxobj, LPMIXERLINE pmxl, DWORD fdwlnfo );
hmxobj:控制指定音频线路的混音器设备对象句柄。
pmxl:MIXERLINE结构对象。
fdwlnfo:指定要获取的信息标志。

(3)mixerGetLineControls函数用于获取关联音频线路的一个或多个控制器。
语法:

MMRESULT mixerGetLineControls ( HMIXEROBJ hmxobj, LPMIXERLINE CONTROLS pmxlc, DWORD fdwControls );
hmxobj:指定要查询的混音器设备对象句柄。
pmxlc:LPMIXERLINE CONTROLS结构对象。
fdwControl:指定要获取的信息标志。

(4)mixerGetControlDetails函数用于获取指定控制器的详细信息。
语法:

MMRESULT mixerGetControlDetails ( HMIXEROBJ hmxobj, LPMIXER CONTROLDETAILS pmxcd, DWORD fdwDetails );
hmxobj:指定要查询的混音器设备对象句柄。
pmxcd:LPMIXER CONTROLDETAILS结构对象。
fdwDetails:指定要获取的信息标志。

(5)mixerSetControlDetails函数用于设置指定控制器的详细信息。
语法:

MMRESULT mixerSetControlDetails ( HMIXEROBJ hmxobj, LPMIXER CONTROLDETAILS pmxcd, DWORD fdwDetails );

hmxobj:指定要查询的混音器设备对象句柄。
pmxcd:LPMIXER CONTROLDETAILS结构对象。
fdwDetails:指定要获取的信息标志。

下面通过实例来介绍如何控制音量大小。
例如:
控制音量大小的应用程序设计步骤如下。
ch1106实例位置:mr\11\sl\06
(1)新建MFC对话框工程,工程名设置为“ControlSound”。

(2)在对话框上添加一个滑标控件,图片控件和两个静态文本控件。

(3)通过类向导为滑标控件添加成员变量m_control。

(4)在实现文件ControlSoundDlg.cpp中加入多媒体库的头文件引用及多媒体静态库的链接。

#include
#pragma comment(lib,"winmm.lib")

(5)在头文件中加入类成员变量的定义。

 HMIXER m_hMixer;
MIXERCAPS m_mxcaps;
DWORD m_curvalue;
DWORD m_controlid;

(6)在对话框初始化工程中可以先获取音量的大小。

 BOOL CControlSoundDlg::OnInitDialog()
{
……//此处代码省略
MIXERLINE mxl;
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;

mixerOpen(&m_hMixer,0,(DWORD)this->GetSafeHwnd(),
NULL,MIXER_OBJECTF_MIXER | CALLBACK_WINDOW);
mixerGetDevCaps((UINT)m_hMixer, &m_mxcaps, sizeof(MIXERCAPS));
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType =MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
mixerGetLineInfo((HMIXEROBJ)m_hMixer,&mxl,
MIXER_OBJECTF_HMIXER|MIXER_GETLINEINFOF_COMPONENTTYPE);

mxlc.cbStruct=sizeof(MIXERLINECONTROLS);
mxlc.dwLineID=mxl.dwLineID;
mxlc.dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls=1;//一般为1
mxlc.cbmxctrl=sizeof(MIXERCONTROL);
mxlc.pamxctrl=&mxc;
mixerGetLineControls((HMIXEROBJ)m_hMixer,&mxlc,
MIXER_OBJECTF_HMIXER|MIXER_GETLINECONTROLSF_ONEBYTYPE);

m_controlid=mxc.dwControlID;
m_control.SetRange(mxc.Bounds.lMinimum,mxc.Bounds.lMaximum);
MIXERCONTROLDETAILS_SIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);
mxcd.paDetails = &mxcdVolume;
mixerGetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,
MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE);
m_control.SetPos(mxcdVolume.lValue);
return TRUE;
}

(7)添加滑标控件的WM_HSCROLL消息的实现函数,该函数不能通过类向导添加,需要手动添加,首先在头文件ControlSoundDlg.h进行函数声明。

afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

然后在实现文件ControlSoundDlg.cpp中建立消息与函数的映射。
ON_WM_HSCROLL()

在OnHScroll函数中通过获得滑标的位置变化来对音量进行调节。
void CControlSoundDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
DWORD val;
val=((CSliderCtrl*)pScrollBar)->GetPos();
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = {val};
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_controlid;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;

mixerSetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,
MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

(8)当音量发生改变时,系统会向程序发送MM_MIXM_CONTROL_CHANGE消息,可以通过对该消息进行映射,来达到当系统音量改变时应用程序滑标也发生变化。对MM_MIXM_CONTROL_CHANGE消息进行映射首先在头文件中加入函数声明。

afx_msg LONG OnMixerCtrlChange(UINT wParam, LONG lParam);
然后在实现文件中建立消息与函数的映射。
ON_MESSAGE(MM_MIXM_CONTROL_CHANGE,OnMixerCtrlChange)

在OnMixerCtrlChange函数中参数wParam获取的是音量设备句柄,参数lParam获取的是音量控制行ID值,通过这两个参数就可以获得改变后的音量。
LONG CControlSoundDlg::OnMixerCtrlChange(UINT wParam, LONG lParam)
{
if ((HMIXER)wParam == m_hMixer && (DWORD)lParam ==m_controlid)
{
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_controlid;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;

mixerGetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,
MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE);

m_control.SetPos(mxcdVolume.dwValue);
}
return 0L;
}

(9)程序运行效果如图11.7所示。

【责任编辑:阚书 TEL:(010)68476606】

回书目   上一节   下一节
专题
NAC安全访问控制
如何优化IT 控制能耗
互联网接入管理与控制专题
访问控制列表(ACL)介绍
Visual C++程序设计自学手册
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
Vista SP1对决XP SP3
Vista SP1对决XP SP3
AIX操作系统管理应用(专题)
AIX操作系统管理应用(专题)
2008年上半年全国软考冲刺辅导
2008年上半年全国软考冲刺辅导
· 2008年上半年全国软考..
· 微软出价446亿美元收购..
· 华为员工自杀频频拷问..
· 三层交换技术专题
· ARP攻击防范与解决方案
· 隐私保护技术探讨
· 反垃圾邮件技术应用
· 龙芯要做中国的“奔腾”
· Windows Server 2008专..
· AMD Phenom三核处理器..
· 路由器设置与口令恢复
· 微软Forefront企业安全..
· LAMP技术精解
· 企业数据恢复指南
· 技术人求职简历完备手册
· Apache技术专题
ARP攻击防范与解决方案
ARP攻击防范与解决方案
iSCSI应用与发展
iSCSI应用与发展
SQL Server 2008/2005全解
SQL Server 2008/2005全解
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· Apache技术专题
· 中间件应用技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Apache技术专题
· 国际文档格式标准开战
· 路由器设置与口令恢复
· 打造安全服务器
· SOA 面向服务架构
· PHP开发应用手册
· 企业数据恢复指南
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· 中间件应用技术专题
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· iSCSI应用与发展
· 三层交换技术专题
· Apache技术专题
· RAID——磁盘阵列基础
· 企业数据恢复指南
· 路由器设置与口令恢复
· SOA 面向服务架构
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用