BOOL CWaveSound::SetVolume(long dev,long vol)//设置设备的音量
{
//dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
//vol=0-100 表示音量的大小 , 设置与返回音量的值用的是百分比,即音量从0 - 100,而不是设备的绝对值
//retrun false 表示设置音量的大小的操作不成功
//retrun true 表示设置音量的大小的操作成功
long device;
BOOL rc = FALSE;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch(dev)
{
case 1:
device = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
break;
case 2:
device = MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
break;
case 3:
device = MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;
break;
case 4:
device = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
break;
default:
device = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}
if(MMSYSERR_NOERROR != ::mixerOpen(&hmixer, 0, 0, 0, 0))
return FALSE;
if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
{
vol = vol * volCtrl.Bounds.lMaximum / 100;
if(SetVolumeValue(hmixer,&volCtrl,vol))
{
rc = TRUE;
}
}
else
{
rc = FALSE;
}
::mixerClose(hmixer);
return rc;
}
BOOL CWaveSound::GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc)
{
MIXERLINECONTROLS mxlc;
MIXERLINE mxl;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = componentType;
if(MMSYSERR_NOERROR == mixerGetLineInfo((HMIXEROBJ)hmixer,&mxl,MIXER_GETLINEINFOF_COMPONENTTYPE))
{
mxlc.cbStruct = sizeof(mxlc);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = ctrlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = mxc;
if(MMSYSERR_NOERROR == mixerGetLineControls((HMIXEROBJ)hmixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE))
return TRUE;
else
return FALSE;
}
else
{
return FALSE;
}
}
//---------------------------------------------------------------------------
BOOL CWaveSound::SetVolumeValue(HMIXER hmixer,MIXERCONTROL *mxc,long volume)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol;
vol.dwValue = volume;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &vol;
mxcd.cChannels = 1;
if(MMSYSERR_NOERROR == mixerSetControlDetails((HMIXEROBJ)hmixer,&mxcd,
MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
return TRUE;
return FALSE;
}
{
//dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
//vol=0-100 表示音量的大小 , 设置与返回音量的值用的是百分比,即音量从0 - 100,而不是设备的绝对值
//retrun false 表示设置音量的大小的操作不成功
//retrun true 表示设置音量的大小的操作成功
long device;
BOOL rc = FALSE;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch(dev)
{
case 1:
device = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
break;
case 2:
device = MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
break;
case 3:
device = MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;
break;
case 4:
device = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
break;
default:
device = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}
if(MMSYSERR_NOERROR != ::mixerOpen(&hmixer, 0, 0, 0, 0))
return FALSE;
if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
{
vol = vol * volCtrl.Bounds.lMaximum / 100;
if(SetVolumeValue(hmixer,&volCtrl,vol))
{
rc = TRUE;
}
}
else
{
rc = FALSE;
}
::mixerClose(hmixer);
return rc;
}
BOOL CWaveSound::GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc)
{
MIXERLINECONTROLS mxlc;
MIXERLINE mxl;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = componentType;
if(MMSYSERR_NOERROR == mixerGetLineInfo((HMIXEROBJ)hmixer,&mxl,MIXER_GETLINEINFOF_COMPONENTTYPE))
{
mxlc.cbStruct = sizeof(mxlc);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = ctrlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = mxc;
if(MMSYSERR_NOERROR == mixerGetLineControls((HMIXEROBJ)hmixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE))
return TRUE;
else
return FALSE;
}
else
{
return FALSE;
}
}
//---------------------------------------------------------------------------
BOOL CWaveSound::SetVolumeValue(HMIXER hmixer,MIXERCONTROL *mxc,long volume)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol;
vol.dwValue = volume;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &vol;
mxcd.cChannels = 1;
if(MMSYSERR_NOERROR == mixerSetControlDetails((HMIXEROBJ)hmixer,&mxcd,
MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
return TRUE;
return FALSE;
}
http://www.xiaozhou.net/ReadNews.asp?NewsId=968
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_VOLUMCONTROL_H__E811E0A4_75C1_11D3_A19C_F387354F5E9B__INCLUDED_)
#define AFX_VOLUMCONTROL_H__E811E0A4_75C1_11D3_A19C_F387354F5E9B__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "mmsystem.h"
namespace nsGuiCode
{
class volumcontrol
{
public:
CString m_name;
DWORD m_controlnum;
DWORD m_controlid;
void SetValue(DWORD vl ,DWORD vr);
DWORD GetValue(DWORD *vl,DWORD *vr);
DWORD GetMin();
DWORD GetMax();
void Close();
void Create(CWnd *pwnd,DWORD type1,DWORD type2,DWORD type3);
volumcontrol();
virtual ~volumcontrol();
protected:
CWnd *m_wnd;
LONG m_min;
LONG m_max;
HMIXER m_hMixer;
};
}#endif // !defined(AFX_VOLUMCONTROL_H__E811E0A4_75C1_11D3_A19C_F387354F5E9B__INCLUDED_)ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// volumcontrol.cpp: implementation of the volumcontrol class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "volumcontrol.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
using namespace nsGuiCode;
volumcontrol::volumcontrol()
{
m_max=0;
m_min=0;
}volumcontrol::~volumcontrol()
{}void volumcontrol::Create(CWnd *pwnd,DWORD type1,DWORD type2,DWORD type3)
{
m_wnd=pwnd;
m_hMixer = NULL;
MIXERCAPS m_mxcaps;
::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));
if (::mixerGetNumDevs() != 0)
{
if (::mixerOpen(&m_hMixer,0,(UINT_PTR)m_wnd->m_hWnd,NULL,MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)
!= MMSYSERR_NOERROR)
return ;
if (::mixerGetDevCaps((UINT_PTR)m_hMixer, &m_mxcaps, sizeof(MIXERCAPS))
!= MMSYSERR_NOERROR)
return ;
}
if (m_hMixer == NULL) return ;
MIXERLINE mxl;
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = type1;
if (::mixerGetLineInfo((HMIXEROBJ)m_hMixer,
&mxl,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE)
!= MMSYSERR_NOERROR) return ;
if(type2!=-1)
{
DWORD num=mxl.cConnections;
DWORD type=mxl.dwDestination;
for( DWORD i=0;i<num;i++)
{
mxl.cbStruct = sizeof(mxl);
mxl.dwDestination = type;
mxl.dwSource = i;
if(mixerGetLineInfo((HMIXEROBJ)m_hMixer, &mxl, MIXER_GETLINEINFOF_SOURCE|MIXER_OBJECTF_HMIXER)!= MMSYSERR_NOERROR)
{
AfxMessageBox("GetLinInfo Resource faile!");
continue;
}
if(mxl.dwComponentType==type2) break;
if(i==num)
{
AfxMessageBox("GetLinInfo Resource faile!");
return;
}
}
}
m_controlnum=mxl.cChannels;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType =type3;
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;
m_name=mxc.szName;
m_controlid = mxc.dwControlID;
m_min= mxc.Bounds.lMinimum;
m_max= mxc.Bounds.lMaximum;
}void volumcontrol::Close()
{
if (m_hMixer != NULL)
{
::mixerClose(m_hMixer);
m_hMixer = NULL;
}
}
DWORD volumcontrol::GetMax()
{
return m_max;
}DWORD volumcontrol::GetMin()
{
return m_min;
}
DWORD volumcontrol::GetValue(DWORD *vl,DWORD *vr)
{
if (m_hMixer == NULL) return -1;
MIXERCONTROLDETAILS_SIGNED mxcdVolume[2];
MIXERCONTROLDETAILS mxcd;
*vl=-1;
*vr=-1;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_controlid;
mxcd.cChannels = m_controlnum;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);
mxcd.paDetails = mxcdVolume;
if (::mixerGetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_GETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
return -1;
*vl=mxcdVolume[0].lValue;
if(m_controlnum==2) *vr=mxcdVolume[1].lValue;
return 1;
}
void volumcontrol::SetValue(DWORD vl,DWORD vr)
{
MIXERCONTROLDETAILS_SIGNED mxcdVolume[2] = {vl,vr};
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_controlid;
mxcd.cChannels = m_controlnum;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);
mxcd.paDetails = &mxcdVolume;
if (::mixerSetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR) return ;
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
应用:
volumcontrol m_MicroPCtrl; //调节麦克对声音您的控制 m_MicroPCtrl.Create(this,MIXERLINE_COMPONENTTYPE_DST_WAVEIN
,MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
,MIXERCONTROL_CONTROLTYPE_VOLUME); /*得到系统麦克风的设置*/ DWORD vl=0,vr=0;//系统麦克风音量
m_MicroPCtrl.GetValue(&vl,&vr); m_MicroVolume.SetRange(m_MicroPCtrl.GetMin(),m_MicroPCtrl.GetMax());
m_MicroVolume.SetTicFreq(m_MicroPCtrl.GetMax()/15);
m_MicroVolume.SetPos(m_MicroVolume.GetRangeMax()-vl);