Skip to content

Commit 5eb255c

Browse files
committed
[STOBJECT] Thoughts on volume button detection
1 parent 90cfaa5 commit 5eb255c

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

dll/shellext/stobject/volume.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray * pSysTray)
176176
// Unmute if volume is increased or unmuted explicitly
177177
if (pSysTray->lpVolCmd)
178178
{
179+
MMRESULT mmres;
179180
g_IsMute = pSysTray->lpVolCmd == APPCOMMAND_VOLUME_UP ? FALSE : !g_IsMute;
180181

181182
MIXERCONTROLDETAILS_BOOLEAN mxcdMute = {0};
@@ -189,13 +190,52 @@ HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray * pSysTray)
189190
mxcd.paDetails = &mxcdMute;
190191
mxcd.cbDetails = sizeof(mxcdMute);
191192

192-
MMRESULT mmres = mixerSetControlDetails((HMIXEROBJ)UlongToHandle(g_mixerId), &mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
193+
mmres = mixerSetControlDetails((HMIXEROBJ)UlongToHandle(g_mixerId), &mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
193194

194195
if (mmres)
195196
{
196-
ERR("Volume_Update failed at MMixer: %d\n", mmres);
197+
ERR("Volume_Update failed at updating mute state: %d\n", mmres);
197198
return E_FAIL;
198199
}
200+
201+
// Update volume depending on pressed button.
202+
if (pSysTray->lpVolCmd != APPCOMMAND_VOLUME_MUTE)
203+
{
204+
MIXERLINECONTROLSW mxlc;
205+
MIXERCONTROLW mxctrl;
206+
207+
mxlc.cbStruct = sizeof(mxlc);
208+
mxlc.dwLineID = g_mixerLineID;
209+
mxlc.cControls = 1;
210+
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
211+
mxlc.pamxctrl = &mxctrl;
212+
mxlc.cbmxctrl = sizeof(mxctrl);
213+
214+
mmres = mixerGetLineControlsW((HMIXEROBJ)UlongToHandle(g_mixerId), &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
215+
216+
if (mmres)
217+
{
218+
ERR("Volume_Update failed retrieving line control: %d\n", mmres);
219+
return E_FAIL;
220+
}
221+
222+
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
223+
224+
mxcd.dwControlID = mxctrl.dwControlID;
225+
mxcd.paDetails = &mxcdVolume;
226+
mxcd.cbDetails = sizeof(mxcdVolume);
227+
228+
mmres = mixerGetControlDetailsW((HMIXEROBJ)UlongToHandle(g_mixerId), &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
229+
230+
if (mmres)
231+
{
232+
ERR("Volume_Update failed reading current volume: %d\n", mmres);
233+
return E_FAIL;
234+
}
235+
236+
pSysTray->lpVolCmd = 0;
237+
DPRINTF("Volume_Update: Current volume is %d\n", mxcdVolume.dwValue);
238+
}
199239
}
200240

201241
if (pSysTray->lpVolCmd == APPCOMMAND_VOLUME_MUTE || PrevState != g_IsMute)

0 commit comments

Comments
 (0)