现在的位置: 首页 > 综合 > 正文

封装好的vc音量调节类, 可用于声音和麦克风音量调节的编程

2013年12月04日 ⁄ 综合 ⁄ 共 6505字 ⁄ 字号 评论关闭

封装好的vc音量调节类, 可用于声音和麦克风音量调节的编程

源代码:

VolumControl.h:

// CVolumControl.h: interface for the CVolumControl class.

//

//////////////////////////////////////////////////////////////////////

#if !defined _CVolumControl_H

#define _CVolumControl_H

#if _MSC_VER > 1000

#pragma once

#endif

class CVolumControl

{

protected:

CWnd *m_pWnd;

LONG m_min;

LONG m_max;

HMIXER m_hMixer;

public:

CString m_strName;

DWORD m_ControlNum;

DWORD m_ControlID;

public:

void SetValue(DWORD vl ,DWORD vr);

DWORD GetValue(DWORD *vl,DWORD *vr);

DWORD GetMin();

DWORD GetMax();

DWORD SetMute(bool mute);

DWORD GetMuteValue();

void Close();

void Create(CWnd *m_ControlID,DWORD m_devId, DWORD type1,DWORD type2,DWORD type3);

CVolumControl();

virtual ~CVolumControl();

};

#endif

VolumControl.cpp:

// CVolumControl.cpp: implementation of the CVolumControl class.

// Download by http://www.codefans.net

//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "VolumControl.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CVolumControl::CVolumControl()

{

m_max=0;

m_min=0;

}

CVolumControl::~CVolumControl()

{}

void CVolumControl::Create(CWnd *pWnd,DWORD m_devId, DWORD type1,DWORD type2,DWORD type3)

{

m_pWnd=pWnd;

m_hMixer = NULL;

MIXERCAPS m_mxcaps;

::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));

if (::mixerGetNumDevs() != 0)

{

if (::mixerOpen(&m_hMixer,m_devId,(DWORD)m_pWnd->m_hWnd,NULL,MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)

!= MMSYSERR_NOERROR)

return ;

if (::mixerGetDevCaps((UINT)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){

AfxMessageBox("type 1 error!!");

return ;

}

if(type2!=-1)

{

DWORD num=mxl.cConnections;

DEBUG_INFO("num is %d", num);

DWORD type=mxl.dwDestination;

DWORD i;

for(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("can't found type 2!");

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){

AfxMessageBox("GetLinControl faile!");

return;

}

m_strName=mxc.szName;

m_ControlID = mxc.dwControlID;

m_min= mxc.Bounds.lMinimum;

m_max= mxc.Bounds.lMaximum;

}

void CVolumControl::Close()

{

if (m_hMixer != NULL)

{

::mixerClose(m_hMixer);

m_hMixer = NULL;

}

}

DWORD CVolumControl::GetMax()

{

return m_max;

}

DWORD CVolumControl::GetMin()

{

return m_min;

}

DWORD CVolumControl::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 CVolumControl::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 ;

}

DWORD CVolumControl::SetMute(bool mute)

{

MIXERCONTROLDETAILS mxcd;

MIXERCONTROLDETAILS_BOOLEAN mxcdMute;

mxcdMute.fValue=mute;

mxcd.hwndOwner = 0;

mxcd.dwControlID = m_ControlID;

mxcd.cbStruct = sizeof(mxcd);

mxcd.cbDetails = sizeof(mxcdMute);

mxcd.paDetails = &mxcdMute;

mxcd.cChannels = 1;

mxcd.cMultipleItems = 0;

if (mixerSetControlDetails((HMIXEROBJ)m_hMixer, &mxcd, MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))

return -1;

return 0;

}

DWORD CVolumControl::GetMuteValue()

{

MIXERCONTROLDETAILS mxcd;

MIXERCONTROLDETAILS_BOOLEAN mxcdMute;

mxcd.hwndOwner = 0;

mxcd.cbStruct = sizeof(mxcd);

mxcd.dwControlID = m_ControlID;

mxcd.cbDetails = sizeof(mxcdMute);

mxcd.paDetails = &mxcdMute;

mxcd.cChannels = 1;

mxcd.cMultipleItems = 0;

if (mixerGetControlDetails((HMIXEROBJ)m_hMixer, &mxcd,MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))

return -1;

return mxcdMute.fValue;

}

使用代码:

初始化并设置SLIDER

//voice control init

slider_voice=(CSliderCtrl *)GetDlgItem(IDC_SLIDER_output);

slider_mic=(CSliderCtrl *)GetDlgItem(IDC_SLIDER_input);

DWORD vl,ml;

m_VControl.Create(this, 0, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,-1,MIXERCONTROL_CONTROLTYPE_VOLUME);

m_VControl.GetValue(&vl,&vl);

slider_voice->SetRange(m_VControl.GetMin(),m_VControl.GetMax());

slider_voice->SetPos(m_VControl.GetMax()-vl);

//DEBUG_INFO("voice: max:%d, min:%d, pos:%d", m_VControl.GetMax(), m_VControl.GetMin(), m_VControl.GetMax()-vl);

m_MControl.Create(this,0, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,MIXERCONTROL_CONTROLTYPE_VOLUME);

if(m_MControl.GetMax() == m_MControl.GetMin() )

{

m_MControl.Create(this,1, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,MIXERCONTROL_CONTROLTYPE_VOLUME);

}

m_MControl.GetValue(&ml, &ml);

slider_mic->SetRange(m_MControl.GetMin(),m_MControl.GetMax());

slider_mic->SetPos(m_MControl.GetMax()-ml);

//DEBUG_INFO("microphone: max:%d, min:%d, pos:%d", m_MControl.GetMax(), m_MControl.GetMin(), m_MControl.GetMax()-ml);

设置系统音量:

voice:

void CsiphoneDlg::OnNMCustomdrawSliderinput(NMHDR *pNMHDR, LRESULT *pResult)

{

LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

// TODO: 在此添加控件通知处理程序代码

int pos_mic=slider_mic->GetPos();

pos_mic=m_MControl.GetMax()-pos_mic;

//DEBUG_INFO("micphone pos is %d", pos_mic);

m_MControl.SetValue(pos_mic, pos_mic);

*pResult = 0;

}

mic:

void CsiphoneDlg::OnNMCustomdrawSliderinput(NMHDR *pNMHDR, LRESULT *pResult)

{

LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

// TODO: 在此添加控件通知处理程序代码

int pos_mic=slider_mic->GetPos();

pos_mic=m_MControl.GetMax()-pos_mic;

//DEBUG_INFO("micphone pos is %d", pos_mic);

m_MControl.SetValue(pos_mic, pos_mic);

*pResult = 0;

}

抱歉!评论已关闭.