怎么把NDS安卓模拟器音量键的音量调静音

1549人阅读
本文主要介绍如何使用混音器函数实现系统音量调节,以及设置静音。
1.混音器的作用及结构
1.1混音器的作用
  声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能:
  ()音乐合成发音功能
  ()混音器()功能和数字声音效果处理器()功能
  ()模拟声音信号的输入和输出功能
  混音器的作用是将来自音乐合成器、、话筒输入()等不同来源的声音组合在一起再输出。
1.2混音器的结构
  混音器由多个目的单元()组成,如回放()、录音()、语音命令()等等。
  目的单元()又由多个连接设备()组成,如回放下有、、等等。
  而每条连接设备又联系着一个或多个控制器()。
  控制器是混音器的关键,如音量控制器()、静音控制器()、仪表控制器()等等。
2.&Mixer&API函数
2.1获取混合器设备的数量
函数原型:
WINMMAPI&UINT&WINAPI&mixerGetNumDevs(void);
函数说明:该函数用于获取系统中混合器设备的数量。
2.2打开混合器设备
函数原型:
WINMMAPI&MMRESULT&WINAPI&mixerOpen(LPHMIXER&phmx,&UINT&uMxId,&DWORD&dwCallback,&DWORD&dwInstance,&DWORD&fdwOpen);
函数说明:该函数用于打开混合器设备。
参数说明:
参数phmx是一个指向设备句柄的指针,当该函数调用成功,该指针就指向所打开的混合器设备句柄。
参数uMxId是混合器的标识号,用于指定要打开的混合器设备。
参数dwCallback是在混合器设备发生变化时,接收通知消息的窗口句柄。
参数dwInstance是传给回调函数的用户实例数据。
参数fdwOpen表示打开设备的标志。
2.3获取混合器设备指定音频线路的信息
函数原型:
WINMMAPI&MMRESULT&WINAPI&mixerGetLineInfo(HMIXEROBJ&hmxobj,&LPMIXERLINE&pmxl,&DWORD&fdwInfo);
函数说明:该函数用于获取混合器设备指定音频线路的信息。
参数说明:
参数hmxobj表示混合器设备对象句柄。
参数pmxl是MIXERLINE结构体对象,用于填充指定音频线路的相关信息。
参数fdwInfo用于指定得到哪些音频线路信息。
2.4获取与音频线路相关的控制
函数原型:
WINMMAPI&MMRESULT&WINAPI&mixerGetLineControls(HMIXEROBJ&hmxobj,&LPMIXERLINECONTROLS&pmxlc,&DWORD&fdwControls);
函数说明:该函数用于获取与音频线路相关的控制。
参数说明:
参数hmxobj表示混合器设备对象句柄。
参数pmxlc是MIXERLINECONTROLS结构体对象,用于填充控制信息。
参数fdwControls用于指定得到哪些线路的控制。
2.5获取指定控制器的详细信息
函数原型:
WINMMAPI&MMRESULT&WINAPI&mixerGetControlDetails(HMIXEROBJ&hmxobj,&LPMIXERCONTROLDETAILS&pmxcd,&DWORD&fdwDetails);
函数说明:该函数用于获取指定控制器的详细信息
参数说明:
参数hmxobj表示混合器设备对象句柄。
参数pmxcd是MIXERCONTROLDETAILS结构体对象,包含具体控制信息。
参数fdwDetails用于指定要获取的信息。
2.6设置指定控制器的详细信息
函数原型:
WINMMAPI&MMRESULT&WINAPI&mixerSetControlDetails(HMIXEROBJ&hmxobj,&LPMIXERCONTROLDETAILS&pmxcd,&DWORD&fdwDetails);
函数说明:该函数用于设置指定控制器的详细信息
参数说明:
参数hmxobj表示混合器设备对象句柄。
参数pmxcd是MIXERCONTROLDETAILS结构体对象,包含具体控制信息。
参数fdwDetails用于指定要设置的信息。
2.7关闭混合器设备
函数原型:
WINMMAPI&MMRESULT&WINAPI&mixerClose(HMIXER&hmx);
函数说明:该函数用于关闭混合器设备
参数说明:
参数hmx表示混合器设备对象句柄。
3.使用实例
  下面通过一个简单的实例来演示如何使用上述的函数实现系统音量调节,以及设置静音。实例运行效果如图所示。
&图扫频软件主界面
  该实例是我正在做的一个扫频软件,其中的音量调节部分实现了以下功能:
  ()通过拖动滑块,能够调节系统音量的大小,并实时显示当前音量值。
  ()通过勾选取消勾选“静音”复选框,能够设置系统是否静音。
  ()调节系统音量或设置静音时,程序也能够同步进行响应。
3.1加载头文件和动态链接库
  在使用函数编程时,我们需要在工程中包含头文件mmsystem.h,并加载动态链接库Winmm.lib。具体方法如下:
#include &mmsystem.h&
//包含音频操作头文件mmsystem.h
#pragma comment(lib, &Winmm.lib&)
//添加动态链接库Winmm.lib
3.2获取混合器设备的数量
  通过使用函数mixerGetNumDevs(),我们可以获取系统中混合器设备的数量。具体方法如下:
* 函数功能 : 获取混合器设备的数量
者 : 博客园 依旧淡然
bool CMixerDAO::GetMixerDevsNumber()
m_nMixerDevsNumber = ::mixerGetNumDevs();
if(m_nMixerDevsNumber == 0)
  其中,成员变量m_nMixerDevsNumber用于存储获取到的系统中混合器设备的数量,若不存在混合器设备,后续对混合器的操作均不可进行。
3.3打开混合器设备
  通过使用函数mixerOpen&(),我们可以打开指定的混合器设备。具体方法如下:
* 函数功能 : 打开混合器设备
注 : 参数hWnd表示窗口句柄
参数nMixerID表示混合器标识号(取值范围0到混合器设备总个数-1)
者 : 博客园 依旧淡然
bool CMixerDAO::OpenMixer(HWND hWnd, UINT nMixerID)
ASSERT(nMixerID & m_nMixerDevsNumber-1);
MMRESULT mmResult = ::mixerOpen(&m_hMixer, nMixerID, (DWORD)hWnd, NULL,
MIXER_OBJECTF_MIXER | CALLBACK_WINDOW);
if(mmResult != MMSYSERR_NOERROR)
  其中,成员变量m_hMixer用于存储混合器设备句柄。
3.4获取混合器设备指定音频线路的信息
  通过使用函数mixerGetLineInfo&(),我们可以获取混合器设备指定音频线路的信息。具体方法如下:
* 函数功能 : 获取混合器音频线路信息
者 : 博客园 依旧淡然
bool CMixerDAO::GetMixerLineInfo()
ASSERT(m_hMixer != NULL);
m_tMixerLine.cbStruct = sizeof(MIXERLINE);
m_tMixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
MMRESULT mmResult = ::mixerGetLineInfo((HMIXEROBJ)m_hMixer, &m_tMixerLine,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
//指定线路类型
if(mmResult != MMSYSERR_NOERROR)
3.5获取与音频线路相关的控制
  通过使用函数mixerGetLineControls&(),我们可以获取与音频线路相关的控制。例如要获得音量控制器,可以采用如下方法:
* 函数功能 : 获取混合器音频线路控件(音量)
者 : 博客园 依旧淡然
bool CMixerDAO::GetMixerLineControlsOfVolume()
ASSERT(m_hMixer != NULL);
m_tMixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS);
m_tMixerLineControls.dwLineID = m_tMixerLine.dwLineID;
m_tMixerLineControls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
m_tMixerLineControls.cControls = 1;
m_tMixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
m_tMixerLineControls.pamxctrl = &m_tMixerControlOfV
MMRESULT mmResult = ::mixerGetLineControls((HMIXEROBJ)m_hMixer, &m_tMixerLineControls,
MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);
if(mmResult != MMSYSERR_NOERROR)
  其中,用于指定要获取哪种控制器,若为,则表明是音量控制器m_tMixerControlOfVolume;若为MIXERCONTROL_CONTROLTYPE_MUTE,则表明是静音控制器m_tMixerControlOfMute。
3.6获取指定控制器的详细信息
  通过使用函数mixerGetControlDetails&(),我们可以获取指定控制器的详细信息。例如要获取当前的音量值,可以采用如下方法:
* 函数功能 : 获取混合器控件详细信息(音量)
注 : 参数nCurrentVolume表示当前的音量值
者 : 博客园 依旧淡然
bool CMixerDAO::GetMixerControlDetails(DWORD& nCurrentVolume)
ASSERT(m_hMixer != NULL);
MIXERCONTROLDETAILS_UNSIGNED tMixerControlDetailsU
m_tMixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
m_tMixerControlDetails.dwControlID = m_tMixerControlOfVolume.dwControlID;
m_tMixerControlDetails.cChannels = 1;
m_tMixerControlDetails.cMultipleItems = 0;
m_tMixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
m_tMixerControlDetails.paDetails = &tMixerControlDetailsU
MMRESULT mmResult = ::mixerGetControlDetails((HMIXEROBJ)m_hMixer, &m_tMixerControlDetails,
MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE);
if(mmResult != MMSYSERR_NOERROR)
nCurrentVolume = tMixerControlDetailsUnsigned.dwV
//获取当前的音量值
  获取系统静音状态的方法与上述获取当前系统音量值的方法类似,但是需要将m_tMixerControlDetails.dwControlID指定为m_tMixerControlOfMute.dwControlID。
3.7设置指定控制器的详细信息
  通过使用函数mixerSetControlDetails&(),我们可以设置指定控制器的详细信息。例如要设置音量值,可以采用如下方法:
* 函数功能 : 设置混合器控件详细信息(音量)
注 : 参数nNewVolume表示新的音量值
者 : 博客园 依旧淡然
bool CMixerDAO::SetMixerControlDetails(DWORD nNewVolume)
ASSERT(m_hMixer != NULL);
ASSERT(nNewVolume &= m_tMixerControlOfVolume.Bounds.dwMinimum);
//输入参数范围验证
ASSERT(nNewVolume &= m_tMixerControlOfVolume.Bounds.dwMaximum);
MIXERCONTROLDETAILS_UNSIGNED tMixerControlDetailsUnsigned = {nNewVolume};
m_tMixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
m_tMixerControlDetails.dwControlID = m_tMixerControlOfVolume.dwControlID;
m_tMixerControlDetails.cChannels = 1;
m_tMixerControlDetails.cMultipleItems = 0;
m_tMixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
m_tMixerControlDetails.paDetails = &tMixerControlDetailsU
MMRESULT mmResult = ::mixerSetControlDetails((HMIXEROBJ)m_hMixer, &m_tMixerControlDetails,
MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE);
if(mmResult != MMSYSERR_NOERROR)
  设置系统静音状态的方法与上述设置当前系统音量值的方法类似,但是需要将m_tMixerControlDetails.dwControlID指定为m_tMixerControlOfMute.dwControlID。
3.8关闭混合器设备
  通过使用函数mixerClose&(),可以关闭混合器设备。具体方法如下:
* 函数功能 : 关闭混合器设备
者 : 博客园 依旧淡然
bool CMixerDAO::CloseMixer()
ASSERT(m_hMixer != NULL);
MMRESULT mmResult = ::mixerClose(m_hMixer);
if(mmResult != MMSYSERR_NOERROR)
m_hMixer = NULL;
  至此,我们已经在CMixerDAO类中封装好了进行混合器操作的一些常用方法,通过调用这些方法,就可以实现调节音量、设置静音功能了。但是,要实现在调节系统音量、设置静音时,我们的程序也能够同步进行响应,就得在我们的程序中对MM_MIXM_CONTROL_CHANGE消息进行监听并响应了。
3.9监听响应MM_MIXM_CONTROL_CHANGE消息
  当混合器控制器改变时会发送MM_MIXM_CONTROL_CHANGE消息,我们对该消息进行监听,并进行相应的消息事件处理,就可以让我们的程序在调节系统音量、设置静音时,进行同步响应了。具体的实现代码如下:
* 函数功能 : 系统音量(静音)调节消息MM_MIXM_CONTROL_CHANGE的消息处理函数
者 : 博客园 依旧淡然
LONG CFrequencyVoiceDlg::OnMixerCtrlChange(UINT wParam, LONG lParam)
if((wParam == (UINT)(HMIXEROBJ)m_MixerDAO.m_hMixer) &&
(lParam == m_MixerDAO.m_tMixerControlOfMute.dwControlID))
//获取混合器控件详细信息(静音)
if(!m_MixerDAO.GetMixerControlDetails(m_isMixerMute))
MessageBox(&获取混合器控件详细信息(静音)失败!&, &提示&, MB_OK|MB_ICONWARNING);
//更新静音复选框的勾选状态
((CButton*)GetDlgItem(IDC_CHECK_MUTE))-&SetCheck((int)m_isMixerMute);
if((wParam == (UINT)(HMIXEROBJ)m_MixerDAO.m_hMixer) &&
(lParam == m_MixerDAO.m_tMixerControlOfVolume.dwControlID))
//获取混合器控件详细信息(音量)
if(!m_MixerDAO.GetMixerControlDetails(m_nCurrentVolume))
MessageBox(&获取混合器控件详细信息(音量)失败!&, &提示&, MB_OK|MB_ICONWARNING);
//更新音量控件信息
m_nCurrentVolumePos = 65535 - m_nCurrentV
UpdateDataVolumeCtrlInfo();
备注:由于接口函数变更,在Win7以上的系统中,调节音量或设置静音,需要使用IAudioEndpointVolume,具体请参阅MSDN:
转自:/menlsh/p/4168195.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20560次
排名:千里之外
转载:31篇
(15)(2)(2)(7)(2)(3)(1)(2)后使用快捷导航没有帐号?
平板/笔记本
云服务专区
怎么都是做到媒体音量一键静音?
&略有小成&
来自:浏览器
有时候想看个视频或者微信,网页,QQ等上的小段子,办公区或者公交车上,或者厕所里不方面放声音,但是没有一键静音非常不方便,每次都要确认一下媒体音量是不是已经关闭才敢打开,好烦!!
width:100%">
&花粉特种部队&
来自:浏览器
长按音量减,自动转为震动状态。
盖章仅为特部队员间跟进识别,不代表结贴,如果需要,请在我的跟帖中“回复”我,论坛才会提醒,谢谢 & !!来自花粉,服务花粉的特部需要您的“支持”,&&技术贴直达&&&&& &
width:100%">
&渐入佳境&
来自:浏览器
很需要,可以通过第三方插件实现...
width:100%">
&已臻大成&
来自:浏览器
人才啊,呵呵。
width:100%">
&渐入佳境&
来自:浏览器
支持楼主!!!
width:100%">
&禁止发言&
来自:浏览器
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
width:100%">
&炉火纯青&
来自:浏览器
进来看看。。
width:100%">
&独步江湖&
来自:浏览器
路过,鼓励楼主,呵呵
width:100%">
&自成一派&
来自:浏览器
兄台莫慌,局长有一键静音的办法,按住电源键2S,看到弹出的4个图标了么,第二个就是响铃模式的选择了:响铃、振动、静音,还有在来电话的时候也可以按一下电源键或者音量键达到快速静音效果哦~怎么样,是不是觉得局长很厉害呢~{:2_27:}
width:100%">
&略有小成&
来自:浏览器
花粉政键局 发表于
兄台莫慌,局长有一键静音的办法,按住电源键2S,看到弹出的4个图标了么,第二个就是响铃模式的选择了:响 ...
局长,你确定你真的测试过吗?这个响铃,振动,静音是管理铃声音量的,而不是媒体音量,如果这个是全局的,我还用提这个问题吗?
width:100%">
花粉特种部队荣耀勋章
好基友勋章
花粉好机友,注册时间大于99天
沙滩上的乐趣最美不过毕业季大漠风情劳动公园的早晨美好的风景看不够英歌石植物园
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
没有最新动态
关注花粉俱乐部
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利

我要回帖

更多关于 蓝叠模拟器音量键 的文章

 

随机推荐