我在编写音量控制的代码时,碰到一个问题.
当调整volume音量时,左右声道的平衡会突然变到左声道.
不知道这是为什么?
代码如下
void CMixer::SetVolume(DWORD dwVol)
{
HMIXER hMixer;
HRESULT hr;
hr = mixerOpen(&hMixer, 0, 0, 0, 0);
if (FAILED(hr)) return; MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED mxdu; mxdu.dwValue = dwVol; mxcd.cMultipleItems = 0;
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);

mixerClose(hMixer);
}
请高手指教

解决方案 »

  1.   

    #include <windows.h>
        #include <mmsystem.h>    MMRESULT rc;              // Return code.
        HMIXER hMixer;            // Mixer handle used in mixer API calls.
        MIXERCONTROL mxc;         // Holds the mixer control data.
        MIXERLINE mxl;            // Holds the mixer line data.
        MIXERLINECONTROLS mxlc;   // Obtains the mixer control.    // Open the mixer. This opens the mixer with a deviceID of 0. If you
        // have a single sound card/mixer, then this will open it. If you have
        // multiple sound cards/mixers, the deviceIDs will be 0, 1, 2, and
        // so on.
        rc = mixerOpen(&hMixer, 0,0,0,0);
        if (MMSYSERR_NOERROR == rc) {
            // Couldn't open the mixer.
        }    // Initialize MIXERLINE structure.
        ZeroMemory(&mxl,sizeof(mxl));
        mxl.cbStruct = sizeof(mxl);    // Specify the line you want to get. You are getting the input line
        // here. If you want to get the output line, you need to use
        // MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT.
        mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;    rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl,
                               MIXER_GETLINEINFOF_COMPONENTTYPE);
        if (MMSYSERR_NOERROR == rc) {
            // Couldn't get the mixer line.
        }    // Get the control.
        ZeroMemory(&mxlc, sizeof(mxlc));
        mxlc.cbStruct = sizeof(mxlc);
        mxlc.dwLineID = mxl.dwLineID;
        mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_PEAKMETER;
        mxlc.cControls = 1;
        mxlc.cbmxctrl = sizeof(mxc);
        mxlc.pamxctrl = &mxc;
        ZeroMemory(&mxc, sizeof(mxc));
        mxc.cbStruct = sizeof(mxc);
        rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,
                                   MIXER_GETLINECONTROLSF_ONEBYTYPE);
        if (MMSYSERR_NOERROR == rc) {
            // Couldn't get the control.
        }    // After successfully getting the peakmeter control, the volume range
        // will be specified by mxc.Bounds.lMinimum to mxc.Bounds.lMaximum.    MIXERCONTROLDETAILS mxcd;             // Gets the control values.
        MIXERCONTROLDETAILS_SIGNED volStruct; // Gets the control values.
        long volume;                          // Holds the final volume value.    // Initialize the MIXERCONTROLDETAILS structure
        ZeroMemory(&mxcd, sizeof(mxcd));
        mxcd.cbStruct = sizeof(mxcd);
        mxcd.cbDetails = sizeof(volStruct);
        mxcd.dwControlID = mxc.dwControlID;
        mxcd.paDetails = &volStruct;
        mxcd.cChannels = 1;    // Get the current value of the peakmeter control. Typically, you
        // would set a timer in your program to query the volume every 10th
        // of a second or so.
        rc = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd,
                                     MIXER_GETCONTROLDETAILSF_VALUE);
        if (MMSYSERR_NOERROR == rc) {
            // Couldn't get the current volume.
        }
        volume = volStruct.lValue;    // Get the absolute value of the volume.
        if (volume < 0)
            volume = -volume;
      

  2.   

    奇怪,我看msdn上写的mxl.cChannels=1为左声道,2为右声道。可是当我把我程序中mxcd.cChannels = m_dwChannels改为mxcd.cChannels = 1时,我原先的那个问题就不会出现了,但是把它改成mxcd.cChannels = 2时,经过几次音量设置后(次数不定),左右声道平衡就会变成左声道,请大家讨论这是为什么?