windows系统音量控制,API函数调用出错,该怎么处理
windows系统音量控制,API函数调用出错
最近在开发一个项目过程中遇到一些问题,问题具体如下:
项目中我需要控制系统音量,也就是麦克风以及扬声器音量,于是我找到了一个CVolume类,代码如下:
//Volume.h
include "MMSystem.h"
define HMIXER_NUM_MAX 10
class CVolume
{
public:
CVolume(void);
public:
~CVolume(void);
public:
HMIXER m_hMixer[HMIXER_NUM_MAX];
BOOL m_barrOpened[HMIXER_NUM_MAX];
HMIXER m_hMixerMic;
HMIXER m_hMixerSpk;
int m_iMixerNums;
MIXERLINE m_MixerLineMicrophone;
BOOL MixerOpen();
void MixerClose();
BOOL m_bIsOpen;
BOOL GetMicrophoneID();
BOOL GetMicrophoneLevel(DWORD* dwLevel, DWORD* dwLevelMax);
BOOL SetMicrophoneLevel(DWORD dwLevel);
BOOL GetSpeakerLevel(DWORD* dwLevel, DWORD* dwLevelMax);
BOOL SetSpeakerLevel(DWORD dwLevel);
};
//Volume.cpp
include "stdafx.h"
include "Volume.h"
CVolume::CVolume(void)
{
m_bIsOpen = FALSE;
m_iMixerNums = 0;
m_hMixerMic = 0;
m_hMixerSpk = 0;
for (int i = 0; i < HMIXER_NUM_MAX; i ++)
m_barrOpened[i] = FALSE;
}
CVolume::~CVolume(void)
{
MixerClose();
}
BOOL CVolume::MixerOpen()
{
m_iMixerNums = mixerGetNumDevs();
if (mixerGetNumDevs() < 1)
return FALSE;
m_iMixerNums = min(m_iMixerNums, HMIXER_NUM_MAX);
m_bIsOpen = FALSE;
for (int i = 0; i < m_iMixerNums; i ++)
{
MMRESULT mmresult = mixerOpen(&m_hMixer[i], (UINT)i, 0, 0, MIXER_OBJECTF_MIXER);
if (mmresult == MMSYSERR_NOERROR)
{
m_barrOpened[i] = TRUE;
m_bIsOpen = TRUE;
}
}
return m_bIsOpen;
}
void CVolume::MixerClose()
{
if (m_bIsOpen)
{
for (int i = 0; i < m_iMixerNums; i ++)
{
if (m_barrOpened[i])
{
mixerClose(m_hMixer[i]);
m_barrOpened[i] = FALSE;
}
}
m_bIsOpen = FALSE;
}
}
BOOL CVolume::GetMicrophoneID()
{
MMRESULT mmresult;
if (!m_bIsOpen)
return FALSE;
m_MixerLineMicrophone.cbStruct = sizeof(m_MixerLineMicrophone);
m_MixerLineMicrophone.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
for (int i = 0; i < m_iMixerNums; i ++)
{
mmresult = mixerGetLineInfo((HMIXEROBJ)m_hMixer[i], &m_MixerLineMicrophone,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
if (mmresult == MMSYSERR_NOERROR)
{
m_hMixerMic = m_hMixer[i];
break;
}
}
if (m_hMixerMic == 0)
return FALSE;
DWORD dwConnections = m_MixerLineMicrophone.cConnections;
DWORD dwLineID = 0;
for (DWORD i = 0; i < dwConnections; i++)
{
m_MixerLineMicrophone.dwSource = i;
MMRESULT mr = mixerGetLineInfo((HMIXEROBJ)m_hMixerMic, &m_MixerLineMicrophone,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_SOURCE);
if (mr != MMSYSERR_NOERROR)
{
break;
}
if (m_MixerLineMicrophone.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)
{
dwLineID = m_MixerLineMicrophone.dwLineID;
break;
}
}
if (dwLineID == 0)
{
return FALSE;
}
return TRUE;
}
BOOL CVolume::GetMicrophoneLevel(DWORD* dwLevel, DWORD* dwLevelMax)
{
MMRESULT mmresult;
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
if (!m_bIsOpen)
return FALSE;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = m_MixerLineMicrophone.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
mmresult = mixerGetLineControls(
reinterpret_cast(m_hMixerMic),
&mxlc,
MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (mmresult != MMSYSERR_NOERROR)
return FALSE;
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mmresult = mixerGetControlDetails(
reinterpret_cast(m_hMixerMic),
&mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
if (mmresult != MMSYSERR_NOERROR)
return FALSE;
*dwLevel = mxcdVolume.dwValue;
*dwLevelMax = mxc.Bounds.dwMaximum;
return TRUE;
}
BOOL CVolume::SetMicrophoneLevel(DWORD dwLevel)
{
MMRESULT mmresult;
最近在开发一个项目过程中遇到一些问题,问题具体如下:
项目中我需要控制系统音量,也就是麦克风以及扬声器音量,于是我找到了一个CVolume类,代码如下:
//Volume.h
include "MMSystem.h"
define HMIXER_NUM_MAX 10
class CVolume
{
public:
CVolume(void);
public:
~CVolume(void);
public:
HMIXER m_hMixer[HMIXER_NUM_MAX];
BOOL m_barrOpened[HMIXER_NUM_MAX];
HMIXER m_hMixerMic;
HMIXER m_hMixerSpk;
int m_iMixerNums;
MIXERLINE m_MixerLineMicrophone;
BOOL MixerOpen();
void MixerClose();
BOOL m_bIsOpen;
BOOL GetMicrophoneID();
BOOL GetMicrophoneLevel(DWORD* dwLevel, DWORD* dwLevelMax);
BOOL SetMicrophoneLevel(DWORD dwLevel);
BOOL GetSpeakerLevel(DWORD* dwLevel, DWORD* dwLevelMax);
BOOL SetSpeakerLevel(DWORD dwLevel);
};
//Volume.cpp
include "stdafx.h"
include "Volume.h"
CVolume::CVolume(void)
{
m_bIsOpen = FALSE;
m_iMixerNums = 0;
m_hMixerMic = 0;
m_hMixerSpk = 0;
for (int i = 0; i < HMIXER_NUM_MAX; i ++)
m_barrOpened[i] = FALSE;
}
CVolume::~CVolume(void)
{
MixerClose();
}
BOOL CVolume::MixerOpen()
{
m_iMixerNums = mixerGetNumDevs();
if (mixerGetNumDevs() < 1)
return FALSE;
m_iMixerNums = min(m_iMixerNums, HMIXER_NUM_MAX);
m_bIsOpen = FALSE;
for (int i = 0; i < m_iMixerNums; i ++)
{
MMRESULT mmresult = mixerOpen(&m_hMixer[i], (UINT)i, 0, 0, MIXER_OBJECTF_MIXER);
if (mmresult == MMSYSERR_NOERROR)
{
m_barrOpened[i] = TRUE;
m_bIsOpen = TRUE;
}
}
return m_bIsOpen;
}
void CVolume::MixerClose()
{
if (m_bIsOpen)
{
for (int i = 0; i < m_iMixerNums; i ++)
{
if (m_barrOpened[i])
{
mixerClose(m_hMixer[i]);
m_barrOpened[i] = FALSE;
}
}
m_bIsOpen = FALSE;
}
}
BOOL CVolume::GetMicrophoneID()
{
MMRESULT mmresult;
if (!m_bIsOpen)
return FALSE;
m_MixerLineMicrophone.cbStruct = sizeof(m_MixerLineMicrophone);
m_MixerLineMicrophone.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
for (int i = 0; i < m_iMixerNums; i ++)
{
mmresult = mixerGetLineInfo((HMIXEROBJ)m_hMixer[i], &m_MixerLineMicrophone,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
if (mmresult == MMSYSERR_NOERROR)
{
m_hMixerMic = m_hMixer[i];
break;
}
}
if (m_hMixerMic == 0)
return FALSE;
DWORD dwConnections = m_MixerLineMicrophone.cConnections;
DWORD dwLineID = 0;
for (DWORD i = 0; i < dwConnections; i++)
{
m_MixerLineMicrophone.dwSource = i;
MMRESULT mr = mixerGetLineInfo((HMIXEROBJ)m_hMixerMic, &m_MixerLineMicrophone,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_SOURCE);
if (mr != MMSYSERR_NOERROR)
{
break;
}
if (m_MixerLineMicrophone.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)
{
dwLineID = m_MixerLineMicrophone.dwLineID;
break;
}
}
if (dwLineID == 0)
{
return FALSE;
}
return TRUE;
}
BOOL CVolume::GetMicrophoneLevel(DWORD* dwLevel, DWORD* dwLevelMax)
{
MMRESULT mmresult;
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
if (!m_bIsOpen)
return FALSE;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = m_MixerLineMicrophone.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
mmresult = mixerGetLineControls(
reinterpret_cast(m_hMixerMic),
&mxlc,
MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (mmresult != MMSYSERR_NOERROR)
return FALSE;
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = mxc.dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mmresult = mixerGetControlDetails(
reinterpret_cast(m_hMixerMic),
&mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
if (mmresult != MMSYSERR_NOERROR)
return FALSE;
*dwLevel = mxcdVolume.dwValue;
*dwLevelMax = mxc.Bounds.dwMaximum;
return TRUE;
}
BOOL CVolume::SetMicrophoneLevel(DWORD dwLevel)
{
MMRESULT mmresult;