📄 volumectrl.cpp
字号:
// VolumeCtrl.cpp: implementation of the CVolumeCtrl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyMediaPlayer.h"
#include "VolumeCtrl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CVolumeCtrl::CVolumeCtrl(CWnd * pParent)
{
m_hParent = pParent;
}
CVolumeCtrl::~CVolumeCtrl()
{
amdUnInitialize(); //释放混音设备
}
//得到混音设备的个数
BOOL CVolumeCtrl::amdInitialize()
{
m_nNumMixers = ::mixerGetNumDevs();
m_hMixer = NULL;
::ZeroMemory(&m_mxcaps,sizeof(MIXERCAPS));
if(m_nNumMixers != 0) { //如果系统混音设备个数不为0
//获得混音设备句柄
if(::mixerOpen(&m_hMixer,
0,
(DWORD)m_hParent->GetSafeHwnd(),
NULL,
MIXER_OBJECTF_MIXER|CALLBACK_WINDOW)
!= MMSYSERR_NOERROR) {
return FALSE;
}
//获得混音设备性能
if(::mixerGetDevCaps((UINT)m_hMixer,&m_mxcaps,sizeof(MIXERCAPS))
!= MMSYSERR_NOERROR) {
return FALSE;
}
}
else { //如果混音器的个数为0
return FALSE;
}
return TRUE;
}
//添加成员函数amdUnInitalize():
BOOL CVolumeCtrl::amdUnInitialize()
{
BOOL bResult = TRUE;
if(m_hMixer != NULL) { //如果混音设备句柄不为空,关闭混音设备
if(::mixerClose(m_hMixer) != MMSYSERR_NOERROR) {
bResult = FALSE;
}
m_hMixer = NULL;
}
return bResult;
}
BOOL CVolumeCtrl::SetVolume(DWORD dwVol)
{
if(m_hMixer == NULL ||
m_strDstLineName.IsEmpty() ||
m_strVolumeControlName.IsEmpty()
) {
return FALSE;
}
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = {dwVol};
MIXERCONTROLDETAILS mxcd;
//准备参数
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
//设置混音器音量
if(::mixerSetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR) {
return FALSE;
}
return TRUE;
}
//获得混音设备的音量
BOOL CVolumeCtrl::GetVolume(DWORD &dwVol)
{
if(m_hMixer == NULL ||
m_strDstLineName.IsEmpty() ||
m_strVolumeControlName.IsEmpty()
) {
return FALSE;
}
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = {dwVol};
MIXERCONTROLDETAILS mxcd;
//准备参数
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
//获取混音设备的音量
if(::mixerGetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR) {
return FALSE;
}
dwVol = mxcdVolume.dwValue; //保存混音设备的音量
return TRUE;
}
//获取混音设备的主音量控件
BOOL CVolumeCtrl::amdGetVolumeControl()
{
m_strDstLineName.Empty(); //清空字符串
m_strVolumeControlName.Empty(); //清空字符串
if(m_hMixer == NULL) { //如果混音器句柄为空,则返回
return FALSE;
}
//准备参数
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
//得到混音设备线信息
if(::mixerGetLineInfo((HMIXEROBJ)m_hMixer,
&mxl,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE)
!= MMSYSERR_NOERROR) {
return FALSE;
}
//准备参数
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
//获取混音设备线控制器
if(::mixerGetLineControls((HMIXEROBJ)m_hMixer,
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE)
!= MMSYSERR_NOERROR) {
return FALSE;
}
//保存混音设备的相关信息
m_strDstLineName = mxl.szName;
m_strVolumeControlName = mxc.szName;
m_dwMinimum = mxc.Bounds.dwMinimum;
m_dwMaximum = mxc.Bounds.dwMaximum;
m_dwVolumeControlID = mxc.dwControlID;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -