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;   
}

解决方案 »

  1.   

    这个直接不好看出来呵呵看看这个有没有帮助
    http://www.xiaozhou.net/ReadNews.asp?NewsId=968
      

  2.   

    参数肯定是4,我的程序是跑在wince5.0上的,在模拟器上完全不起效果.
      

  3.   

    // 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);
      

  4.   

    我看过msdn帮助,这些函数都有,但我想确定wince5.0是否支持mic音量的调节,通过这个是可以控制主音量,但mic似乎不行.而且我看wince系统中好象也找不到mic音量调节控制,不知道有没有前辈做过类似的东西,给点儿指点.
      

  5.   

    你也用Win ce平台呀,我用的是win ce3,同行,帮你顶.顺便发布一条信息:有二手劳斯莱斯低价转让,价格合理,有意向者请与13061546946石兴海联系,非诚勿扰.也可以发邮件到[email protected]联系.