mixerGetControlDetails总是在Win8.1和Win10

时间:2016-02-15 14:29:48

标签: windows winapi audio

我正在尝试读取当前的音量水平 我从waveOut *函数移到了混音器*函数 如果我在Windows XP下运行该应用程序,则该值与系统音量级别对齐 如果我在Win8.1和Win10下运行,我总是收到0xFFFF。 我的代码是:

TCHAR msg[100];
g_uNumDevs = mixerGetNumDevs();
wsprintf( msg, L"N. mixer: %d", g_uNumDevs);
pInfo->Log(msg);

if (g_uNumDevs)
{
    UINT i = 0;
    while(i < g_uNumDevs)
    {
        MMRESULT mmRes = mixerOpen(&hMixer, i, 0, 0, MIXER_OBJECTF_MIXER);
        if (mmRes != MMSYSERR_NOERROR)
        {
            wsprintf( msg, L"Errore openMixer i:%d err:%d", i, mmRes);
            pInfo->Log(msg);
        }

        // Master line
        MIXERLINE ml = {0};
        ml.cbStruct = sizeof(MIXERLINE);
        ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;  // Volume master
        mmRes = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
        pInfo->Log( ml.szName);
        if (mmRes != MMSYSERR_NOERROR)
        {
            wsprintf( msg, L"Errore mixerGetLineInfo err:%d", mmRes);
            pInfo->Log(msg);

            mixerClose(hMixer);
            return FALSE;
        }

    //  get the volume control of the speaker line.
    MIXERLINECONTROLS mlc = {0};
    MIXERCONTROL mc = {0};
    mlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mlc.dwLineID = ml.dwLineID;
    mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    mlc.cControls = 1;
    mlc.pamxctrl = &mc;
    mlc.cbmxctrl = sizeof(MIXERCONTROL);
    mmRes = mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
    if (mmRes != MMSYSERR_NOERROR)
    {
        wsprintf( msg, L"Errore mixerGetLineControls err:%d", mmRes);
        pInfo->Log(msg);

        EnableWindow( g_hwndSlider, FALSE);
        EnableWindow( g_hwndVerifBtn, FALSE);
    }
    else {
        // GetVolume level
        MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
        MIXERCONTROLDETAILS mxcd;
        mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
        mxcd.dwControlID = mc.dwControlID;
        mxcd.cChannels = 1;
        mxcd.cMultipleItems = 0;
        mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
        mxcd.paDetails = &mxcdVolume;
        mmRes = mixerGetControlDetails(reinterpret_cast<HMIXEROBJ>(hMixer),
                     &mxcd, MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE);
        if (mmRes != MMSYSERR_NOERROR)
        {
            EnableWindow( g_hwndSlider, FALSE);
            EnableWindow( g_hwndVerifBtn, FALSE);
            //return FALSE;
        }
        else {
            DWORD dwVol = mxcdVolume.dwValue;
            dwVol &= 0xFFFF;
            DWORD perc = dwVol * 100 / 0xFFFF;
            SendMessage( g_hwndSlider, TBM_SETPOS, 1, perc);

            wsprintf( msg, L"Volume = %d %% [%d]", perc, dwVol);
            pInfo->Log(msg);
        }
    }
    mixerClose(hMixer);

        ++i;
    } // while
}
else {
    pInfo->Log(L"No audio device !!");
    return FALSE;
}

0 个答案:

没有答案