Index: dll/shellext/stobject/volume.cpp =================================================================== --- dll/shellext/stobject/volume.cpp (revision 66030) +++ dll/shellext/stobject/volume.cpp (working copy) @@ -115,34 +115,73 @@ return S_OK; } -HRESULT Volume_IsMute() +BOOL Volume_IsMute() { -#if 0 + MIXERLINECONTROLS pVolumeMixer; + HMIXER hMixer; + MIXERCONTROL volumeControl; + MIXERLINEW mixerline; + MIXERCONTROLDETAILS_UNSIGNED mValue; + MIXERCAPS mixcaps; MIXERCONTROLDETAILS mixerControlDetails; - if (g_mixerId != (UINT)-1 && g_muteControlID != (DWORD)-1) + if (mixerOpen(&hMixer, 0, 0, 0, 0) != MMSYSERR_NOERROR) { - BOOL detailsResult = 0; - mixerControlDetails.cbStruct = sizeof(mixerControlDetails); - mixerControlDetails.hwndOwner = 0; - mixerControlDetails.dwControlID = g_muteControlID; - mixerControlDetails.cChannels = 1; - mixerControlDetails.paDetails = &detailsResult; - mixerControlDetails.cbDetails = sizeof(detailsResult); - if (mixerGetControlDetailsW((HMIXEROBJ) g_mixerId, &mixerControlDetails, 0)) - return E_FAIL; + TRACE("Unable to open the mixer"); + return TRUE; + } - TRACE("Obtained mute status %d\n", detailsResult); + if (mixerGetDevCapsW((UINT)hMixer, &mixcaps, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR) + { + TRACE("Unable to query Mixer Device"); + goto nomixer; + } + mixerline.cbStruct = sizeof(MIXERLINEW); + mixerline.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; - g_IsMute = detailsResult != 0; + if (mixerGetLineInfoW((HMIXEROBJ)hMixer, &mixerline, MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR) + { + TRACE("Unable to get information about a specific line of mixer"); + goto nomixer; } -#endif - return S_OK; + pVolumeMixer.cbStruct = sizeof(MIXERLINECONTROLS); + pVolumeMixer.dwLineID = mixerline.dwLineID; + pVolumeMixer.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; + pVolumeMixer.cControls = 1; + pVolumeMixer.pamxctrl = &volumeControl; + pVolumeMixer.cbmxctrl = sizeof(MIXERCONTROL); + + if (mixerGetLineControlsW((HMIXEROBJ)hMixer, &pVolumeMixer, MIXER_GETLINECONTROLSF_ONEBYTYPE) != MMSYSERR_NOERROR) + { + TRACE("Unable to get line controls of the mixer"); + goto nomixer; + } + + mixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS); + mixerControlDetails.dwControlID = volumeControl.dwControlID; + mixerControlDetails.cChannels = 1; + mixerControlDetails.cMultipleItems = volumeControl.cMultipleItems; + mixerControlDetails.paDetails = &mValue; + mixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); + + if (mixerGetControlDetailsW((HMIXEROBJ)hMixer, &mixerControlDetails, MIXER_GETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR) + { + TRACE("Unable to get any info on the speaker volume."); + goto nomixer; + } + + mixerClose(hMixer); + return FALSE; + +nomixer: + mixerClose(hMixer); + return TRUE; } HRESULT STDMETHODCALLTYPE Volume_Init(_In_ CSysTray * pSysTray) { HRESULT hr; + WCHAR strTooltip[128]; TRACE("Volume_Init\n"); @@ -155,38 +194,30 @@ g_mmDeviceChange = RegisterWindowMessageW(L"winmm_devicechange"); } + g_hIconVolume = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_VOLUME)); g_hIconMute = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_VOLMUTE)); - Volume_IsMute(); + g_IsMute = Volume_IsMute(); - HICON icon; - if (g_IsMute) - icon = g_hIconMute; - else - icon = g_hIconVolume; + LoadStringW(g_hInstance, (g_IsMute ? IDS_VOL_MUTED : IDS_VOL_VOLUME), strTooltip, _countof(strTooltip)); - return pSysTray->NotifyIcon(NIM_ADD, ID_ICON_VOLUME, icon, L"Volume Control"); + return pSysTray->NotifyIcon(NIM_ADD, ID_ICON_VOLUME, (g_IsMute ? g_hIconMute : g_hIconVolume), strTooltip); } HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray * pSysTray) { + WCHAR strTooltip[128]; + TRACE("Volume_Update\n"); - Volume_IsMute(); +#if 0 + g_IsMute = Volume_IsMute(); +#endif - WCHAR strTooltip[128]; - HICON icon; - if (g_IsMute) { - icon = g_hIconMute; - LoadStringW(g_hInstance, IDS_VOL_MUTED, strTooltip, _countof(strTooltip)); - } - else { - icon = g_hIconVolume; - LoadStringW(g_hInstance, IDS_VOL_VOLUME, strTooltip, _countof(strTooltip)); - } + LoadStringW(g_hInstance, (g_IsMute ? IDS_VOL_MUTED : IDS_VOL_VOLUME), strTooltip, _countof(strTooltip)); - return pSysTray->NotifyIcon(NIM_MODIFY, ID_ICON_VOLUME, icon, strTooltip); + return pSysTray->NotifyIcon(NIM_MODIFY, ID_ICON_VOLUME, (g_IsMute ? g_hIconMute : g_hIconVolume), strTooltip); } HRESULT STDMETHODCALLTYPE Volume_Shutdown(_In_ CSysTray * pSysTray)