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

封装好的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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值