在程序中调节系统声音大小

在vc程序中如何调节系统声音大小呢?下面的类CMixer实现了访问指定的系统音频输入输出设备,读取或调节音量的功能。

在程序中调节系统声音大小的vc代码如下:


BOOL CMixer::Init(DWORD ComponentType, DestKind dkKind,int & min,int & max)
{
    HMIXER hMixer;
    HRESULT hr;
    hr = mixerOpen(&hMixer, 0, 0, 0, 0);
    
    if (hr!= MMSYSERR_NOERROR)
        return FALSE;
    
     m_dwControlID=-1;
     m_bOK=FALSE;
     m_dwChannels=1;
    
    MIXERLINE mxl;
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;
    DWORD kind, count;

    if (dkKind == Play)
        kind = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    else
        kind = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;

    mxl.cbStruct = sizeof(mxl);
    mxl.dwComponentType = kind;

    hr = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE |MIXER_OBJECTF_HMIXER);
    
    if (hr!= MMSYSERR_NOERROR)
    {
        mixerClose(hMixer);
        return FALSE;
    }

    count = mxl.dwSource;

    // get dwControlID
    if(dkKind == Play)
    {
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;
    if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(hMixer),
                               &mxlc,
                               MIXER_OBJECTF_HMIXER |
                               MIXER_GETLINECONTROLSF_ONEBYTYPE)
        != MMSYSERR_NOERROR)
    {
        return FALSE;
    }
               m_dwChannels = 1;
            m_dwControlID = mxc.dwControlID;
            min=mxc.Bounds.dwMinimum;
            max=mxc.Bounds.dwMaximum;
    }    
    else
    {
    
    for(UINT i = 0; i < count; i++)
    {
        mxl.dwSource = i;
        mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_SOURCE | MIXER_OBJECTF_HMIXER);
        
        if (mxl.dwComponentType == ComponentType)
        {
            m_dwChannels = mxl.cChannels;
            mxc.cbStruct = sizeof(mxc);
            mxlc.cbStruct = sizeof(mxlc);
            mxlc.dwLineID = mxl.dwLineID;
            mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
            mxlc.cControls = 1;
            mxlc.cbmxctrl = sizeof(MIXERCONTROL);
            mxlc.pamxctrl = &mxc;
            hr = mixerGetLineControls((HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER);
            m_dwControlID = mxc.dwControlID;
            min=mxc.Bounds.dwMinimum;
            max=mxc.Bounds.dwMaximum;
            break;
        };
    }
    }
    
    m_bOK=TRUE;
    mixerClose(hMixer);
    return TRUE;
}

void CMixer::SetVolume(DWORD dwVol)
{
    if (!m_bOK) return;
    
    HMIXER hMixer;
    HRESULT hr;
    hr = mixerOpen(&hMixer, 0, 0, 0, 0);
    
    if (hr!= MMSYSERR_NOERROR)
    return;

    MIXERCONTROLDETAILS mxcd;
    MIXERCONTROLDETAILS_UNSIGNED mxdu;

    mxdu.dwValue = dwVol;
    mxcd.cMultipleItems = 0;       /********Modified code ******/
    mxcd.cChannels = m_dwChannels;
    mxcd.cbStruct = sizeof(mxcd);
    mxcd.dwControlID = m_dwControlID;
    mxcd.cbDetails = sizeof(mxdu);
    mxcd.paDetails = &mxdu;
    
    hr = mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);    
    
    mixerClose(hMixer);
}

DWORD CMixer::GetVolume()
{
    if (!m_bOK) return 0;
    HMIXER hMixer;
    HRESULT hr;
    hr = mixerOpen(&hMixer, 0, 0, 0, 0);
    if (FAILED(hr)) return 0;

    MIXERCONTROLDETAILS mxcd;
    MIXERCONTROLDETAILS_UNSIGNED mxdu;

    mxcd.cMultipleItems = 0;  
    mxcd.cChannels = m_dwChannels;
    mxcd.cbStruct = sizeof(mxcd);
    mxcd.dwControlID = m_dwControlID;
    mxcd.cbDetails = sizeof(mxdu);
    mxcd.paDetails = &mxdu;
    hr = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);    
    
    mixerClose(hMixer);
    return mxdu.dwValue;
}


调用方法如下:
    //音量调节
    CMixer m_mixrec,m_mixplay;
    int min,max;
    m_mixrec.Init(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Record,min,max);
    m_mixplay.Init(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS ,CMixer::Play,min,max);

    DWORD dwVol = 50;
    m_mixrec.SetVolume(dwVol);
    m_mixplay.SetVolume(dwVol);


[本日志由 cnfgg 于 2009-12-11 04:10 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 程序 声音
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.