[MMSYS] Move global variables into a GLOBAL_DATA struct and free allocated memory...
authorEric Kohl <eric.kohl@reactos.org>
Sun, 13 Jan 2019 22:19:25 +0000 (23:19 +0100)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 13 Jan 2019 22:19:25 +0000 (23:19 +0100)
dll/cpl/mmsys/sounds.c

index 1fc9fb9..3250432 100644 (file)
 
 #include <debug.h>
 
-struct __APP_MAP__;
-
-typedef struct __LABEL_MAP__
+typedef struct _LABEL_MAP
 {
-    TCHAR * szName;
-    TCHAR * szDesc;
-    TCHAR * szIcon;
-    struct __APP_MAP__ * AppMap;
-    struct __LABEL_MAP__ * Next;
+    TCHAR *szName;
+    TCHAR *szDesc;
+    TCHAR *szIcon;
+    struct _APP_MAP *AppMap;
+    struct _LABEL_MAP *Next;
 } LABEL_MAP, *PLABEL_MAP;
 
-typedef struct __APP_MAP__
+typedef struct _APP_MAP
 {
     TCHAR szName[MAX_PATH];
     TCHAR szDesc[MAX_PATH];
     TCHAR szIcon[MAX_PATH];
 
-    struct __APP_MAP__ *Next;
+    struct _APP_MAP *Next;
     PLABEL_MAP LabelMap;
 } APP_MAP, *PAPP_MAP;
 
-typedef struct __LABEL_CONTEXT__
+typedef struct _LABEL_CONTEXT
 {
     PLABEL_MAP LabelMap;
     PAPP_MAP AppMap;
     TCHAR szValue[MAX_PATH];
-    struct __LABEL_CONTEXT__ *Next;
+    struct _LABEL_CONTEXT *Next;
 } LABEL_CONTEXT, *PLABEL_CONTEXT;
 
-typedef struct __SOUND_SCHEME_CONTEXT__
+typedef struct _SOUND_SCHEME_CONTEXT
 {
     TCHAR szName[MAX_PATH];
     TCHAR szDesc[MAX_PATH];
     PLABEL_CONTEXT LabelContext;
 } SOUND_SCHEME_CONTEXT, *PSOUND_SCHEME_CONTEXT;
 
-static PLABEL_MAP s_Map = NULL;
-static PAPP_MAP s_App = NULL;
+typedef struct _GLOBAL_DATA
+{
+    TCHAR szDefault[MAX_PATH];
+    HIMAGELIST hSoundsImageList;
+    PLABEL_MAP pLabelMap;
+    PAPP_MAP pAppMap;
+} GLOBAL_DATA, *PGLOBAL_DATA;
 
-TCHAR szDefault[MAX_PATH];
-HIMAGELIST hSoundsImageList = NULL;
 
 /* A filter string is a list separated by NULL and ends with double NULLs. */
 LPWSTR MakeFilter(LPWSTR psz)
@@ -77,9 +78,9 @@ LPWSTR MakeFilter(LPWSTR psz)
     return psz;
 }
 
-PLABEL_MAP FindLabel(PAPP_MAP pAppMap, TCHAR * szName)
+PLABEL_MAP FindLabel(PGLOBAL_DATA pGlobalData, PAPP_MAP pAppMap, TCHAR * szName)
 {
-    PLABEL_MAP pMap = s_Map;
+    PLABEL_MAP pMap = pGlobalData->pLabelMap;
 
     while (pMap)
     {
@@ -115,20 +116,20 @@ PLABEL_MAP FindLabel(PAPP_MAP pAppMap, TCHAR * szName)
     }
 
     pMap->AppMap = pAppMap;
-    pMap->Next = s_Map;
-    s_Map = pMap;
+    pMap->Next = pGlobalData->pLabelMap;
+    pGlobalData->pLabelMap = pMap;
 
     return pMap;
 }
 
 
-VOID RemoveLabel(PLABEL_MAP pMap)
+VOID RemoveLabel(PGLOBAL_DATA pGlobalData, PLABEL_MAP pMap)
 {
-    PLABEL_MAP pCurMap = s_Map;
+    PLABEL_MAP pCurMap = pGlobalData->pLabelMap;
 
     if (pCurMap == pMap)
     {
-        s_Map = s_Map->Next;
+        pGlobalData->pLabelMap = pGlobalData->pLabelMap->Next;
         return;
     }
 
@@ -143,10 +144,23 @@ VOID RemoveLabel(PLABEL_MAP pMap)
     }
 }
 
+static
+VOID
+FreeLabelMap(PGLOBAL_DATA pGlobalData)
+{
+    PLABEL_MAP pCurMap;
 
-PAPP_MAP FindApp(TCHAR * szName)
+    while (pGlobalData->pLabelMap)
+    {
+        pCurMap = pGlobalData->pLabelMap->Next;
+        HeapFree(GetProcessHeap(), 0, pGlobalData->pLabelMap);
+        pGlobalData->pLabelMap = pCurMap;
+    }
+}
+
+PAPP_MAP FindApp(PGLOBAL_DATA pGlobalData, TCHAR *szName)
 {
-    PAPP_MAP pMap = s_App;
+    PAPP_MAP pMap = pGlobalData->pAppMap;
 
     while (pMap)
     {
@@ -159,8 +173,21 @@ PAPP_MAP FindApp(TCHAR * szName)
     return NULL;
 }
 
+static
+VOID
+FreeAppMap(PGLOBAL_DATA pGlobalData)
+{
+    PAPP_MAP pCurMap;
+
+    while (pGlobalData->pAppMap)
+    {
+        pCurMap = pGlobalData->pAppMap->Next;
+        HeapFree(GetProcessHeap(), 0, pGlobalData->pAppMap);
+        pGlobalData->pAppMap = pCurMap;
+    }
+}
 
-PLABEL_CONTEXT FindLabelContext(PSOUND_SCHEME_CONTEXT pSoundScheme, TCHAR * AppName, TCHAR * LabelName)
+PLABEL_CONTEXT FindLabelContext(PGLOBAL_DATA pGlobalData, PSOUND_SCHEME_CONTEXT pSoundScheme, TCHAR * AppName, TCHAR * LabelName)
 {
     PLABEL_CONTEXT pLabelContext;
 
@@ -182,8 +209,8 @@ PLABEL_CONTEXT FindLabelContext(PSOUND_SCHEME_CONTEXT pSoundScheme, TCHAR * AppN
     if (!pLabelContext)
         return NULL;
 
-    pLabelContext->AppMap = FindApp(AppName);
-    pLabelContext->LabelMap = FindLabel(pLabelContext->AppMap, LabelName);
+    pLabelContext->AppMap = FindApp(pGlobalData, AppName);
+    pLabelContext->LabelMap = FindLabel(pGlobalData, pLabelContext->AppMap, LabelName);
     ASSERT(pLabelContext->AppMap);
     ASSERT(pLabelContext->LabelMap);
     pLabelContext->szValue[0] = _T('\0');
@@ -195,7 +222,7 @@ PLABEL_CONTEXT FindLabelContext(PSOUND_SCHEME_CONTEXT pSoundScheme, TCHAR * AppN
 
 
 BOOL
-LoadEventLabel(HKEY hKey, TCHAR * szSubKey)
+LoadEventLabel(PGLOBAL_DATA pGlobalData, HKEY hKey, TCHAR * szSubKey)
 {
     HKEY hSubKey;
     DWORD cbValue;
@@ -241,26 +268,27 @@ LoadEventLabel(HKEY hKey, TCHAR * szSubKey)
     {
         return FALSE;
     }
+
     pMap->szName = _tcsdup(szSubKey);
     pMap->szDesc = _tcsdup(szDesc);
     pMap->szIcon = _tcsdup(szData);
 
-    if (s_Map)
+    if (pGlobalData->pLabelMap)
     {
-        pMap->Next = s_Map;
-        s_Map = pMap;
+        pMap->Next = pGlobalData->pLabelMap;
+        pGlobalData->pLabelMap = pMap;
     }
     else
     {
-        s_Map = pMap;
-        s_Map->Next = 0;
+        pGlobalData->pLabelMap = pMap;
+        pGlobalData->pLabelMap->Next = NULL;
     }
     return TRUE;
 }
 
 
 BOOL
-LoadEventLabels()
+LoadEventLabels(PGLOBAL_DATA pGlobalData)
 {
     HKEY hSubKey;
     DWORD dwCurKey;
@@ -293,7 +321,7 @@ LoadEventLabels()
 
         if (dwResult == ERROR_SUCCESS)
         {
-            if (LoadEventLabel(hSubKey, szName))
+            if (LoadEventLabel(pGlobalData, hSubKey, szName))
             {
                 dwCount++;
             }
@@ -368,26 +396,24 @@ AddSoundProfile(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault)
 
 
 DWORD
-EnumerateSoundProfiles(HWND hwndDlg, HKEY hKey)
+EnumerateSoundProfiles(PGLOBAL_DATA pGlobalData, HWND hwndDlg, HKEY hKey)
 {
     HKEY hSubKey;
     DWORD dwName, dwCurKey, dwResult, dwNumSchemes;
     DWORD cbDefault;
     TCHAR szName[MAX_PATH];
 
-    cbDefault = sizeof(szDefault);
+    cbDefault = sizeof(pGlobalData->szDefault);
     if (RegQueryValueEx(hKey,
                         NULL,
                         NULL,
                         NULL,
-                        (LPBYTE)szDefault,
+                        (LPBYTE)pGlobalData->szDefault,
                         &cbDefault) != ERROR_SUCCESS)
     {
         return FALSE;
     }
 
-
-
     if (RegOpenKeyEx(hKey,
                      _T("Names"),
                      0,
@@ -413,7 +439,7 @@ EnumerateSoundProfiles(HWND hwndDlg, HKEY hKey)
 
         if (dwResult == ERROR_SUCCESS)
         {
-            if (AddSoundProfile(hwndDlg, hSubKey, szName, (!_tcsicmp(szName, szDefault))))
+            if (AddSoundProfile(hwndDlg, hSubKey, szName, (!_tcsicmp(szName, pGlobalData->szDefault))))
             {
                 dwNumSchemes++;
             }
@@ -431,16 +457,18 @@ PSOUND_SCHEME_CONTEXT FindSoundProfile(HWND hwndDlg, TCHAR * szName)
 {
     LRESULT lCount, lIndex, lResult;
     PSOUND_SCHEME_CONTEXT pScheme;
+    HWND hwndComboBox;
 
-    lCount = ComboBox_GetCount(GetDlgItem(hwndDlg, IDC_SOUND_SCHEME));
+    hwndComboBox = GetDlgItem(hwndDlg, IDC_SOUND_SCHEME);
+    lCount = ComboBox_GetCount(hwndComboBox);
     if (lCount == CB_ERR)
     {
         return NULL;
     }
 
-    for(lIndex = 0; lIndex < lCount; lIndex++)
+    for (lIndex = 0; lIndex < lCount; lIndex++)
     {
-        lResult = ComboBox_GetItemData(GetDlgItem(hwndDlg, IDC_SOUND_SCHEME), lIndex);
+        lResult = ComboBox_GetItemData(hwndComboBox, lIndex);
         if (lResult == CB_ERR)
         {
             continue;
@@ -455,9 +483,43 @@ PSOUND_SCHEME_CONTEXT FindSoundProfile(HWND hwndDlg, TCHAR * szName)
     return NULL;
 }
 
+static
+VOID
+FreeSoundProfiles(HWND hwndDlg)
+{
+    LRESULT lCount, lIndex, lResult;
+    PSOUND_SCHEME_CONTEXT pScheme;
+    PLABEL_CONTEXT pLabelContext;
+    HWND hwndComboBox;
+
+    hwndComboBox = GetDlgItem(hwndDlg, IDC_SOUND_SCHEME);
+    lCount = ComboBox_GetCount(hwndComboBox);
+    if (lCount == CB_ERR)
+        return;
+
+    for (lIndex = 0; lIndex < lCount; lIndex++)
+    {
+        lResult = ComboBox_GetItemData(hwndComboBox, lIndex);
+        if (lResult == CB_ERR)
+        {
+            continue;
+        }
+
+        pScheme = (PSOUND_SCHEME_CONTEXT)lResult;
+
+        while (pScheme->LabelContext)
+        {
+            pLabelContext = pScheme->LabelContext->Next;
+            HeapFree(GetProcessHeap(), 0, pScheme->LabelContext);
+            pScheme->LabelContext = pLabelContext;
+        }
+
+        HeapFree(GetProcessHeap(), 0, pScheme);
+    }
+}
 
 BOOL
-ImportSoundLabel(HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName, TCHAR * szAppName, PAPP_MAP AppMap, PLABEL_MAP LabelMap)
+ImportSoundLabel(PGLOBAL_DATA pGlobalData, HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName, TCHAR * szAppName, PAPP_MAP AppMap, PLABEL_MAP LabelMap)
 {
     HKEY hSubKey;
     TCHAR szValue[MAX_PATH];
@@ -470,7 +532,7 @@ ImportSoundLabel(HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName
     //MessageBox(hwndDlg, szProfile, szLabelName, MB_OK);
 
     bCurrentProfile = !_tcsicmp(szProfile, _T(".Current"));
-    bActiveProfile = !_tcsicmp(szProfile, szDefault);
+    bActiveProfile = !_tcsicmp(szProfile, pGlobalData->szDefault);
 
     if (RegOpenKeyEx(hKey,
                      szProfile,
@@ -493,7 +555,7 @@ ImportSoundLabel(HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName
     }
 
     if (bCurrentProfile)
-        pScheme = FindSoundProfile(hwndDlg, szDefault);
+        pScheme = FindSoundProfile(hwndDlg, pGlobalData->szDefault);
     else
         pScheme = FindSoundProfile(hwndDlg, szProfile);
 
@@ -502,7 +564,7 @@ ImportSoundLabel(HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName
         //MessageBox(hwndDlg, szProfile, _T("no profile!!"), MB_OK);
         return FALSE;
     }
-    pLabelContext = FindLabelContext(pScheme, AppMap->szName, LabelMap->szName);
+    pLabelContext = FindLabelContext(pGlobalData, pScheme, AppMap->szName, LabelMap->szName);
 
     cchLength = ExpandEnvironmentStrings(szValue, szBuffer, _countof(szBuffer));
     if (cchLength == 0 || cchLength > _countof(szBuffer))
@@ -521,7 +583,7 @@ ImportSoundLabel(HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName
 
 
 DWORD
-ImportSoundEntry(HWND hwndDlg, HKEY hKey, TCHAR * szLabelName, TCHAR * szAppName, PAPP_MAP pAppMap)
+ImportSoundEntry(PGLOBAL_DATA pGlobalData, HWND hwndDlg, HKEY hKey, TCHAR * szLabelName, TCHAR * szAppName, PAPP_MAP pAppMap)
 {
     HKEY hSubKey;
     DWORD dwNumProfiles;
@@ -539,10 +601,10 @@ ImportSoundEntry(HWND hwndDlg, HKEY hKey, TCHAR * szLabelName, TCHAR * szAppName
     {
         return FALSE;
     }
-    pLabel = FindLabel(pAppMap, szLabelName);
+    pLabel = FindLabel(pGlobalData, pAppMap, szLabelName);
 
     ASSERT(pLabel);
-    RemoveLabel(pLabel);
+    RemoveLabel(pGlobalData, pLabel);
 
     pLabel->AppMap = pAppMap;
     pLabel->Next = pAppMap->LabelMap;
@@ -564,7 +626,7 @@ ImportSoundEntry(HWND hwndDlg, HKEY hKey, TCHAR * szLabelName, TCHAR * szAppName
 
         if (dwResult == ERROR_SUCCESS)
         {
-            if (ImportSoundLabel(hwndDlg, hSubKey, szProfile, szLabelName, szAppName, pAppMap, pLabel))
+            if (ImportSoundLabel(pGlobalData, hwndDlg, hSubKey, szProfile, szLabelName, szAppName, pAppMap, pLabel))
             {
                 dwNumProfiles++;
             }
@@ -580,7 +642,7 @@ ImportSoundEntry(HWND hwndDlg, HKEY hKey, TCHAR * szLabelName, TCHAR * szAppName
 
 
 DWORD
-ImportAppProfile(HWND hwndDlg, HKEY hKey, TCHAR * szAppName)
+ImportAppProfile(PGLOBAL_DATA pGlobalData, HWND hwndDlg, HKEY hKey, TCHAR * szAppName)
 {
     HKEY hSubKey;
     TCHAR szDefault[MAX_PATH];
@@ -638,8 +700,8 @@ ImportAppProfile(HWND hwndDlg, HKEY hKey, TCHAR * szAppName)
     _tcscpy(AppMap->szDesc, szDefault);
     _tcscpy(AppMap->szIcon, szIcon);
 
-    AppMap->Next = s_App;
-    s_App = AppMap;
+    AppMap->Next = pGlobalData->pAppMap;
+    pGlobalData->pAppMap = AppMap;
 
 
     dwCurKey = 0;
@@ -657,7 +719,7 @@ ImportAppProfile(HWND hwndDlg, HKEY hKey, TCHAR * szAppName)
                               NULL);
         if (dwResult == ERROR_SUCCESS)
         {
-            if (ImportSoundEntry(hwndDlg, hSubKey, szName, szAppName, AppMap))
+            if (ImportSoundEntry(pGlobalData, hwndDlg, hSubKey, szName, szAppName, AppMap))
             {
                 dwNumEntry++;
             }
@@ -671,7 +733,7 @@ ImportAppProfile(HWND hwndDlg, HKEY hKey, TCHAR * szAppName)
 
 
 BOOL
-ImportSoundProfiles(HWND hwndDlg, HKEY hKey)
+ImportSoundProfiles(PGLOBAL_DATA pGlobalData, HWND hwndDlg, HKEY hKey)
 {
     DWORD dwCurKey;
     DWORD dwResult;
@@ -699,7 +761,7 @@ ImportSoundProfiles(HWND hwndDlg, HKEY hKey)
 
         if (dwResult == ERROR_SUCCESS)
         {
-            if (ImportAppProfile(hwndDlg, hSubKey, szName))
+            if (ImportAppProfile(pGlobalData, hwndDlg, hSubKey, szName))
             {
                 dwNumApps++;
             }
@@ -714,7 +776,7 @@ ImportSoundProfiles(HWND hwndDlg, HKEY hKey)
 
 
 BOOL
-LoadSoundProfiles(HWND hwndDlg)
+LoadSoundProfiles(PGLOBAL_DATA pGlobalData, HWND hwndDlg)
 {
     HKEY hSubKey;
     DWORD dwNumSchemes;
@@ -728,13 +790,13 @@ LoadSoundProfiles(HWND hwndDlg)
         return FALSE;
     }
 
-    dwNumSchemes = EnumerateSoundProfiles(hwndDlg, hSubKey);
+    dwNumSchemes = EnumerateSoundProfiles(pGlobalData, hwndDlg, hSubKey);
 
 
     if (dwNumSchemes)
     {
         //MessageBox(hwndDlg, _T("importing sound profiles..."), NULL, MB_OK);
-        ImportSoundProfiles(hwndDlg, hSubKey);
+        ImportSoundProfiles(pGlobalData, hwndDlg, hSubKey);
     }
 
     RegCloseKey(hSubKey);
@@ -808,7 +870,7 @@ LoadSoundFiles(HWND hwndDlg)
 
 
 BOOL
-ShowSoundScheme(HWND hwndDlg)
+ShowSoundScheme(PGLOBAL_DATA pGlobalData, HWND hwndDlg)
 {
     LRESULT lIndex;
     PSOUND_SCHEME_CONTEXT pScheme;
@@ -822,9 +884,9 @@ ShowSoundScheme(HWND hwndDlg)
     hDlgCtrl = GetDlgItem(hwndDlg, IDC_SOUND_SCHEME);
     hList = GetDlgItem(hwndDlg, IDC_SCHEME_LIST);
 
-    if (hSoundsImageList != NULL)
+    if (pGlobalData->hSoundsImageList != NULL)
     {
-        TreeView_SetImageList(hList, hSoundsImageList, TVSIL_NORMAL);
+        TreeView_SetImageList(hList, pGlobalData->hSoundsImageList, TVSIL_NORMAL);
     }
 
     lIndex = SendMessage(hDlgCtrl, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
@@ -840,9 +902,9 @@ ShowSoundScheme(HWND hwndDlg)
     }
     pScheme = (PSOUND_SCHEME_CONTEXT)lIndex;
 
-    _tcscpy(szDefault, pScheme->szName);
+    _tcscpy(pGlobalData->szDefault, pScheme->szName);
 
-    pAppMap = s_App;
+    pAppMap = pGlobalData->pAppMap;
     while (pAppMap)
     {
         ZeroMemory(&tvItem, sizeof(tvItem));
@@ -862,10 +924,10 @@ ShowSoundScheme(HWND hwndDlg)
         pLabelMap = pAppMap->LabelMap;
         while (pLabelMap)
         {
-            pLabelContext = FindLabelContext(pScheme, pAppMap->szName, pLabelMap->szName);
+            pLabelContext = FindLabelContext(pGlobalData, pScheme, pAppMap->szName, pLabelMap->szName);
 
             ZeroMemory(&tvItem, sizeof(tvItem));
-            tvItem.hParent = /*TVI_ROOT;*/ hTreeItem;
+            tvItem.hParent = hTreeItem;
             tvItem.hInsertAfter = TVI_SORT;
 
             tvItem.item.mask = TVIF_STATE | TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
@@ -882,7 +944,7 @@ ShowSoundScheme(HWND hwndDlg)
                 tvItem.item.iImage = IMAGE_SOUND_NONE;
                 tvItem.item.iSelectedImage = IMAGE_SOUND_NONE;
             }
-            tvItem.item.lParam = (LPARAM)FindLabelContext(pScheme, pAppMap->szName, pLabelMap->szName);
+            tvItem.item.lParam = (LPARAM)FindLabelContext(pGlobalData, pScheme, pAppMap->szName, pLabelMap->szName);
 
             TreeView_InsertItem(hList, &tvItem);
 
@@ -1031,32 +1093,39 @@ SoundsDlgProc(HWND hwndDlg,
               WPARAM wParam,
               LPARAM lParam)
 {
+    PGLOBAL_DATA pGlobalData;
+
     OPENFILENAMEW ofn;
     WCHAR filename[MAX_PATH];
     WCHAR szFilter[256], szTitle[256];
     LPWSTR pFileName;
     LRESULT lResult;
 
+    pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
     switch (uMsg)
     {
         case WM_INITDIALOG:
         {
             UINT NumWavOut = waveOutGetNumDevs();
 
+            pGlobalData = (PGLOBAL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBAL_DATA));
+            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
+
             SendMessage(GetDlgItem(hwndDlg, IDC_PLAY_SOUND),
                         BM_SETIMAGE,(WPARAM)IMAGE_ICON,
                         (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_PLAY_ICON)));
 
-            hSoundsImageList = InitImageList(IDI_SOUND_SECTION,
-                                             IDI_SOUND_ASSIGNED,
-                                             GetSystemMetrics(SM_CXSMICON),
-                                             GetSystemMetrics(SM_CXSMICON),
-                                             IMAGE_ICON);
+            pGlobalData->hSoundsImageList = InitImageList(IDI_SOUND_SECTION,
+                                                          IDI_SOUND_ASSIGNED,
+                                                          GetSystemMetrics(SM_CXSMICON),
+                                                          GetSystemMetrics(SM_CXSMICON),
+                                                          IMAGE_ICON);
 
-            LoadEventLabels();
-            LoadSoundProfiles(hwndDlg);
+            LoadEventLabels(pGlobalData);
+            LoadSoundProfiles(pGlobalData, hwndDlg);
             LoadSoundFiles(hwndDlg);
-            ShowSoundScheme(hwndDlg);
+            ShowSoundScheme(pGlobalData, hwndDlg);
 
             if (!NumWavOut)
             {
@@ -1132,7 +1201,7 @@ SoundsDlgProc(HWND hwndDlg,
                     if (HIWORD(wParam) == CBN_SELENDOK)
                     {
                         (void)TreeView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_SCHEME_LIST));
-                        ShowSoundScheme(hwndDlg);
+                        ShowSoundScheme(pGlobalData, hwndDlg);
                         EnableWindow(GetDlgItem(hwndDlg, IDC_SOUND_LIST), FALSE);
                         EnableWindow(GetDlgItem(hwndDlg, IDC_TEXT_SOUND), FALSE);
                         EnableWindow(GetDlgItem(hwndDlg, IDC_PLAY_SOUND), FALSE);
@@ -1205,8 +1274,12 @@ SoundsDlgProc(HWND hwndDlg,
         }
         case WM_DESTROY:
         {
-            if (hSoundsImageList)
-                ImageList_Destroy(hSoundsImageList);
+            FreeSoundProfiles(hwndDlg);
+            FreeAppMap(pGlobalData);
+            FreeLabelMap(pGlobalData);
+            if (pGlobalData->hSoundsImageList)
+                ImageList_Destroy(pGlobalData->hSoundsImageList);
+            HeapFree(GetProcessHeap(), 0, pGlobalData);
             break;
         }
         case WM_NOTIFY: