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;
     }

Reply via email to