win32volume.cpp
来自「CD播放器源代码 .rar」· C++ 代码 · 共 143 行
CPP
143 行
#include "win32volume.h"
Win32Volume::Win32Volume()
{
m_hMixer = NULL;
}
Win32Volume::~Win32Volume(void)
{
}
void Win32Volume::GetVolume(int &left, int &right)
{
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume[2];
MIXERCONTROLDETAILS mxcd;
int ret;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 2;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
ret = mixerGetControlDetails((HMIXEROBJ)m_hMixer, &mxcd, MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE);
if (ret != MMSYSERR_NOERROR)
return;
left = (int)(((float)((mxcdVolume[0].dwValue - m_dwMinimum) * 100) / (float)(m_dwMaximum - m_dwMinimum)) + 0.5);
right = (int)(((float)((mxcdVolume[1].dwValue - m_dwMinimum) * 100) / (float)(m_dwMaximum - m_dwMinimum)) + 0.5);
}
void Win32Volume::SetVolume(int left, int right)
{
DWORD dwValLeft, dwValRight;
dwValLeft = (left * (m_dwMaximum - m_dwMinimum) / 100);
dwValRight = (right * (m_dwMaximum - m_dwMinimum) / 100);
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume[2];
MIXERCONTROLDETAILS mxcd;
memcpy(&mxcdVolume[0], &dwValLeft, sizeof(MIXERCONTROLDETAILS_UNSIGNED));
memcpy(&mxcdVolume[1], &dwValRight, sizeof(MIXERCONTROLDETAILS_UNSIGNED));
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 2;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mixerSetControlDetails((HMIXEROBJ)m_hMixer, &mxcd, MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE);
}
bool Win32Volume::InitVolumeControl(HWND hWnd)
{
MMRESULT mmresult = 0;
mmresult = mixerOpen(&m_hMixer, 0, (DWORD)hWnd, NULL, MIXER_OBJECTF_MIXER | CALLBACK_WINDOW);
if (mmresult != MMSYSERR_NOERROR)
{
m_hMixer = NULL;
MessageBox(hWnd, "Unable to open Mixer Controls.", "Volume Control Error", MB_ICONERROR);
}
switch (mmresult)
{
case MMSYSERR_NOERROR :
break;
case MMSYSERR_ALLOCATED :
m_hMixer = NULL;
break;
case MMSYSERR_BADDEVICEID :
m_hMixer = NULL;
break;
case MMSYSERR_INVALFLAG :
m_hMixer = NULL;
break;
case MMSYSERR_INVALHANDLE :
m_hMixer = NULL;
break;
case MMSYSERR_INVALPARAM :
m_hMixer = NULL;
break;
case MMSYSERR_NODRIVER :
m_hMixer = NULL;
break;
case MMSYSERR_NOMEM :
m_hMixer = NULL;
break;
default:
m_hMixer = NULL;
break;
}
m_oDstLineName = " ";
m_oVolumeControlName = ' ';
if (m_hMixer == NULL)
{
return FALSE;
}
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;
if (mixerGetLineInfo((HMIXEROBJ)m_hMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR)
{
return false;
}
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;
// record dwControlID
m_oDstLineName = mxl.szName;
m_oVolumeControlName = *mxc.szName;
m_dwMinimum = mxc.Bounds.dwMinimum;
m_dwMaximum = mxc.Bounds.dwMaximum;
m_dwVolumeControlID = mxc.dwControlID;
return TRUE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?