⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 volumectrl.cpp

📁 又是一个新的CD播放器的代码,有不错的学习效果
💻 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 + -