100分 求解VC 用waveIn录音 音量调节问题,我找了一段代码,但不起任何作用.忘高手指点.

1982pc 2007-03-12 06:10:13
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;
}
...全文
758 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gl_soft2006 2007-05-10
  • 打赏
  • 举报
回复
你也用Win ce平台呀,我用的是win ce3,同行,帮你顶.顺便发布一条信息:有二手劳斯莱斯低价转让,价格合理,有意向者请与13061546946石兴海联系,非诚勿扰.也可以发邮件到glsoft2006@126.com联系.
1982pc 2007-03-14
  • 打赏
  • 举报
回复
我看过msdn帮助,这些函数都有,但我想确定wince5.0是否支持mic音量的调节,通过这个是可以控制主音量,但mic似乎不行.而且我看wince系统中好象也找不到mic音量调节控制,不知道有没有前辈做过类似的东西,给点儿指点.
1982pc 2007-03-13
  • 打赏
  • 举报
回复
似乎还是不行,这个是否跟操作系统有关,需要硬件支持还是操作系统支持,还是操作系统定制?
Murray Mu 2007-03-13
  • 打赏
  • 举报
回复
// volumcontrol.h: interface for the volumcontrol class.
//
//////////////////////////////////////////////////////////////////////

#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);
1982pc 2007-03-13
  • 打赏
  • 举报
回复
参数肯定是4,我的程序是跑在wince5.0上的,在模拟器上完全不起效果.
goodboyws 2007-03-13
  • 打赏
  • 举报
回复
看看ce的文档吧,另外,不要太相信模拟器
xyxfly 2007-03-12
  • 打赏
  • 举报
回复
这个直接不好看出来呵呵

看看这个有没有帮助
http://www.xiaozhou.net/ReadNews.asp?NewsId=968
goodboyws 2007-03-12
  • 打赏
  • 举报
回复
似乎应该是4
goodboyws 2007-03-12
  • 打赏
  • 举报
回复
是不是参数给错了dev=?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧