https://git.reactos.org/?p=reactos.git;a=commitdiff;h=bb4fc96939acaa234ec44c61fabaf91373d27e30
commit bb4fc96939acaa234ec44c61fabaf91373d27e30 Author: Eric Kohl <eric.k...@reactos.org> AuthorDate: Sun May 19 16:26:22 2019 +0200 Commit: Eric Kohl <eric.k...@reactos.org> CommitDate: Sun May 19 16:27:10 2019 +0200 [MMSYS] Reset the speaker volume to its initial value when the user clicks the "Cancel" button CORE-13815 --- dll/cpl/mmsys/volume.c | 82 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/dll/cpl/mmsys/volume.c b/dll/cpl/mmsys/volume.c index b8e546e2763..17c86808269 100644 --- a/dll/cpl/mmsys/volume.c +++ b/dll/cpl/mmsys/volume.c @@ -37,7 +37,8 @@ typedef struct _GLOBAL_DATA DWORD volumeStep; DWORD maxVolume; - PMIXERCONTROLDETAILS_UNSIGNED volumeInitValues; + PMIXERCONTROLDETAILS_UNSIGNED volumeInitialValues; + PMIXERCONTROLDETAILS_UNSIGNED volumePreviousValues; PMIXERCONTROLDETAILS_UNSIGNED volumeCurrentValues; } GLOBAL_DATA, *PGLOBAL_DATA; @@ -176,10 +177,16 @@ GetVolumeControl(PGLOBAL_DATA pGlobalData) pGlobalData->volumeControlID = mxc.dwControlID; pGlobalData->volumeStep = (pGlobalData->volumeMaximum - pGlobalData->volumeMinimum) / (VOLUME_MAX - VOLUME_MIN); - pGlobalData->volumeInitValues = HeapAlloc(GetProcessHeap(), - 0, - mxln.cChannels * sizeof(MIXERCONTROLDETAILS_UNSIGNED)); - if (pGlobalData->volumeInitValues == NULL) + pGlobalData->volumeInitialValues = HeapAlloc(GetProcessHeap(), + 0, + mxln.cChannels * sizeof(MIXERCONTROLDETAILS_UNSIGNED)); + if (pGlobalData->volumeInitialValues == NULL) + return; + + pGlobalData->volumePreviousValues = HeapAlloc(GetProcessHeap(), + 0, + mxln.cChannels * sizeof(MIXERCONTROLDETAILS_UNSIGNED)); + if (pGlobalData->volumePreviousValues == NULL) return; pGlobalData->volumeCurrentValues = HeapAlloc(GetProcessHeap(), @@ -191,7 +198,9 @@ GetVolumeControl(PGLOBAL_DATA pGlobalData) VOID -GetVolumeValue(PGLOBAL_DATA pGlobalData) +GetVolumeValue( + PGLOBAL_DATA pGlobalData, + BOOL bInit) { MIXERCONTROLDETAILS mxcd; DWORD i; @@ -204,7 +213,7 @@ GetVolumeValue(PGLOBAL_DATA pGlobalData) mxcd.cChannels = pGlobalData->volumeChannels; mxcd.cMultipleItems = 0; mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); - mxcd.paDetails = pGlobalData->volumeInitValues; + mxcd.paDetails = pGlobalData->volumePreviousValues; if (mixerGetControlDetails((HMIXEROBJ)pGlobalData->hMixer, &mxcd, MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR) @@ -213,10 +222,13 @@ GetVolumeValue(PGLOBAL_DATA pGlobalData) pGlobalData->maxVolume = 0; for (i = 0; i < pGlobalData->volumeChannels; i++) { - pGlobalData->volumeCurrentValues[i].dwValue = pGlobalData->volumeInitValues[i].dwValue; + pGlobalData->volumeCurrentValues[i].dwValue = pGlobalData->volumePreviousValues[i].dwValue; - if (pGlobalData->volumeInitValues[i].dwValue > pGlobalData->maxVolume) - pGlobalData->maxVolume = pGlobalData->volumeInitValues[i].dwValue; + if (pGlobalData->volumePreviousValues[i].dwValue > pGlobalData->maxVolume) + pGlobalData->maxVolume = pGlobalData->volumePreviousValues[i].dwValue; + + if (bInit) + pGlobalData->volumeInitialValues[i].dwValue = pGlobalData->volumeCurrentValues[i].dwValue; } } @@ -240,14 +252,14 @@ SetVolumeValue(PGLOBAL_DATA pGlobalData, for (i = 0; i < pGlobalData->volumeChannels; i++) { - if (pGlobalData->volumeInitValues[i].dwValue == pGlobalData->maxVolume) + if (pGlobalData->volumePreviousValues[i].dwValue == pGlobalData->maxVolume) { pGlobalData->volumeCurrentValues[i].dwValue = dwVolume; } else { pGlobalData->volumeCurrentValues[i].dwValue = - pGlobalData->volumeInitValues[i].dwValue * dwVolume / pGlobalData-> maxVolume; + pGlobalData->volumePreviousValues[i].dwValue * dwVolume / pGlobalData-> maxVolume; } } @@ -264,6 +276,29 @@ SetVolumeValue(PGLOBAL_DATA pGlobalData, } +static +VOID +RestoreVolumeValue( + PGLOBAL_DATA pGlobalData) +{ + MIXERCONTROLDETAILS mxcd; + + if (pGlobalData->hMixer == NULL) + return; + + mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS); + mxcd.dwControlID = pGlobalData->volumeControlID; + mxcd.cChannels = pGlobalData->volumeChannels; + mxcd.cMultipleItems = 0; + mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); + mxcd.paDetails = pGlobalData->volumeInitialValues; + + mixerSetControlDetails((HMIXEROBJ)pGlobalData->hMixer, + &mxcd, + MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE); +} + + static VOID SetSystrayVolumeIconState(BOOL bEnabled) @@ -352,7 +387,7 @@ InitVolumeControls(HWND hwndDlg, PGLOBAL_DATA pGlobalData) } GetVolumeControl(pGlobalData); - GetVolumeValue(pGlobalData); + GetVolumeValue(pGlobalData, TRUE); SendDlgItemMessage(hwndDlg, IDC_DEVICE_NAME, WM_SETTEXT, 0, (LPARAM)mxc.szPname); SendDlgItemMessage(hwndDlg, IDC_VOLUME_TRACKBAR, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(pGlobalData->maxVolume - pGlobalData->volumeMinimum) / pGlobalData->volumeStep); @@ -410,7 +445,7 @@ VolumeDlgProc(HWND hwndDlg, } case MM_MIXM_CONTROL_CHANGE: { - GetVolumeValue(pGlobalData); + GetVolumeValue(pGlobalData, FALSE); SendDlgItemMessage(hwndDlg, IDC_VOLUME_TRACKBAR, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(pGlobalData->maxVolume - pGlobalData->volumeMinimum) / pGlobalData->volumeStep); break; } @@ -524,12 +559,15 @@ VolumeDlgProc(HWND hwndDlg, case WM_DESTROY: if (pGlobalData) { - if (pGlobalData->volumeInitValues) - HeapFree(GetProcessHeap(), 0, pGlobalData->volumeInitValues); - if (pGlobalData->volumeCurrentValues) HeapFree(GetProcessHeap(), 0, pGlobalData->volumeCurrentValues); + if (pGlobalData->volumePreviousValues) + HeapFree(GetProcessHeap(), 0, pGlobalData->volumePreviousValues); + + if (pGlobalData->volumeInitialValues) + HeapFree(GetProcessHeap(), 0, pGlobalData->volumeInitialValues); + mixerClose(pGlobalData->hMixer); DestroyIcon(pGlobalData->hIconMuted); DestroyIcon(pGlobalData->hIconUnMuted); @@ -539,9 +577,15 @@ VolumeDlgProc(HWND hwndDlg, break; case WM_NOTIFY: - if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) + switch (((LPNMHDR)lParam)->code) { - SaveData(hwndDlg); + case PSN_APPLY: + SaveData(hwndDlg); + break; + + case PSN_RESET: + RestoreVolumeValue(pGlobalData); + break; } return TRUE; }