Skip to content

Commit 56c3a21

Browse files
committed
[STOBJECT] Control sound muting from media buttons
Muting can be controlled explicitly by Mute button and implicitly unmute by increasing volume.
1 parent d12d32f commit 56c3a21

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

dll/shellext/stobject/csystray.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,11 @@ BOOL CSysTray::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
359359
{
360360
MouseKeys_Update(this);
361361
}
362+
else if (wParam == HSHELL_APPCOMMAND && ((GET_APPCOMMAND_LPARAM(lParam) >= APPCOMMAND_VOLUME_DOWN) || GET_APPCOMMAND_LPARAM(lParam) <= APPCOMMAND_VOLUME_UP))
363+
{
364+
lpVolCmd = GET_APPCOMMAND_LPARAM(lParam);
365+
Volume_Update(this);
366+
}
362367
lResult = 0L;
363368
return TRUE;
364369
}

dll/shellext/stobject/csystray.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class CSysTray :
6060
static void RunDll(PCSTR Dll, PCSTR Parameters);
6161
static void RunAccessCpl(PCSTR Parameters);
6262

63+
LPARAM lpVolCmd;
64+
6365
protected:
6466
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD dwMsgMapID = 0);
6567

dll/shellext/stobject/volume.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,32 @@ HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray * pSysTray)
173173
PrevState = g_IsMute;
174174
Volume_IsMute();
175175

176-
if (PrevState != g_IsMute)
176+
// Unmute if volume is increased or unmuted explicitly
177+
if (pSysTray->lpVolCmd)
178+
{
179+
g_IsMute = pSysTray->lpVolCmd == APPCOMMAND_VOLUME_UP ? FALSE : !g_IsMute;
180+
181+
MIXERCONTROLDETAILS_BOOLEAN mxcdMute = {0};
182+
mxcdMute.fValue = g_IsMute;
183+
184+
MIXERCONTROLDETAILS mxcd = {0};
185+
mxcd.cbStruct = sizeof(mxcd);
186+
mxcd.cChannels = 1;
187+
mxcd.hwndOwner = NULL;
188+
mxcd.dwControlID = g_muteControlID;
189+
mxcd.paDetails = &mxcdMute;
190+
mxcd.cbDetails = sizeof(mxcdMute);
191+
192+
MMRESULT mmres = mixerSetControlDetails((HMIXEROBJ)UlongToHandle(g_mixerId), &mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
193+
194+
if (mmres)
195+
{
196+
ERR("Volume_Update failed at MMixer: %d\n", mmres);
197+
return E_FAIL;
198+
}
199+
}
200+
201+
if (pSysTray->lpVolCmd == APPCOMMAND_VOLUME_MUTE || PrevState != g_IsMute)
177202
{
178203
WCHAR strTooltip[128];
179204
HICON icon;
@@ -188,6 +213,7 @@ HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray * pSysTray)
188213
LoadStringW(g_hInstance, IDS_VOL_VOLUME, strTooltip, _countof(strTooltip));
189214
}
190215

216+
pSysTray->lpVolCmd = 0;
191217
return pSysTray->NotifyIcon(NIM_MODIFY, ID_ICON_VOLUME, icon, strTooltip);
192218
}
193219
else

0 commit comments

Comments
 (0)