Author: janderwald Date: Thu Sep 13 00:22:41 2007 New Revision: 29023
URL: http://svn.reactos.org/svn/reactos?rev=29023&view=rev Log: - implement loading of sound items
Modified: trunk/reactos/dll/cpl/mmsys/sounds.c
Modified: trunk/reactos/dll/cpl/mmsys/sounds.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/mmsys/sounds.c?rev=... ============================================================================== --- trunk/reactos/dll/cpl/mmsys/sounds.c (original) +++ trunk/reactos/dll/cpl/mmsys/sounds.c Thu Sep 13 00:22:41 2007 @@ -12,9 +12,34 @@ #include <setupapi.h> #include <cpl.h> #include <tchar.h> - +#include <stdio.h> #include "mmsys.h" #include "resource.h" + +typedef struct __LABEL_CONTEXT__ +{ + TCHAR szName[MAX_PATH]; + TCHAR szValue[MAX_PATH]; + struct __LABEL_CONTEXT__ *Next; +}LABEL_CONTEXT, *PLABEL_CONTEXT; + +typedef struct __APP_CONTEXT__ +{ + TCHAR szName[MAX_PATH]; + TCHAR szDesc[MAX_PATH]; + TCHAR szIcon[MAX_PATH]; + PLABEL_CONTEXT LabelContext; + struct __APP_CONTEXT__ * Next; +}APP_CONTEXT, *PAPP_CONTEXT; + + +typedef struct __SOUND_SCHEME_CONTEXT__ +{ + TCHAR szName[MAX_PATH]; + TCHAR szDesc[MAX_PATH]; + PAPP_CONTEXT AppContext; +}SOUND_SCHEME_CONTEXT, *PSOUND_SCHEME_CONTEXT; +
BOOL LoadEventLabel(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey) @@ -117,7 +142,7 @@ }
BOOL -AddSoundScheme(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault) +AddSoundProfile(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault) { HKEY hSubKey; TCHAR szValue[MAX_PATH]; @@ -145,10 +170,15 @@ LRESULT lResult = SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_ADDSTRING, (WPARAM)0, (LPARAM)szValue); if (lResult != CB_ERR) { - /// - /// FIXME store a context struct - /// - SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETITEMDATA, (WPARAM)lResult, (LPARAM)szSubKey); + PSOUND_SCHEME_CONTEXT pScheme = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SOUND_SCHEME_CONTEXT)); + if (pScheme != NULL) + { + _tcscpy(pScheme->szDesc, szValue); + _tcscpy(pScheme->szName, szSubKey); + pScheme->AppContext = NULL; + } + + SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETITEMDATA, (WPARAM)lResult, (LPARAM)pScheme); if (SetDefault) { SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETCURSEL, (WPARAM)lResult, (LPARAM)0); @@ -161,8 +191,8 @@
-BOOL -EnumerateSoundSchemes(HWND hwndDlg, HKEY hKey) +DWORD +EnumerateSoundProfiles(HWND hwndDlg, HKEY hKey) { HKEY hSubKey; DWORD dwName, dwCurKey, dwResult, dwNumSchemes; @@ -207,7 +237,7 @@
if (dwResult == ERROR_SUCCESS) { - if (AddSoundScheme(hwndDlg, hSubKey, szName, (!_tcscmp(szName, szDefault)))) + if (AddSoundProfile(hwndDlg, hSubKey, szName, (!_tcscmp(szName, szDefault)))) { dwNumSchemes++; } @@ -217,15 +247,286 @@ }while(dwResult == ERROR_SUCCESS);
RegCloseKey(hSubKey); - return (dwNumSchemes != 0); -} - - -BOOL -LoadSoundSchemes(HWND hwndDlg, HKEY hKey) -{ - HKEY hSubKey; - BOOL Result; + return dwNumSchemes; +} + +PSOUND_SCHEME_CONTEXT FindSoundProfile(HWND hwndDlg, TCHAR * szName) +{ + LRESULT lCount, lIndex, lResult; + PSOUND_SCHEME_CONTEXT pScheme; + + lCount = SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_GETCOUNT, (WPARAM)0, (LPARAM)0); + if (lCount == CB_ERR) + { + return NULL; + } + + for(lIndex = 0; lIndex < lCount; lIndex++) + { + lResult = SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_GETITEMDATA, (WPARAM)lIndex, (LPARAM)0); + if (lResult == CB_ERR) + { + continue; + } + + pScheme = (PSOUND_SCHEME_CONTEXT)lResult; + if (!_tcsicmp(pScheme->szName, szName)) + { + return pScheme; + } + } + return FALSE; +} +PAPP_CONTEXT FindAppContext(PSOUND_SCHEME_CONTEXT pScheme, TCHAR * szAppName) +{ + PAPP_CONTEXT pAppContext = pScheme->AppContext; + while(pAppContext) + { + if (!_tcsicmp(pAppContext->szName, szAppName)) + return pScheme->AppContext; + pAppContext = pAppContext->Next; + } + return FALSE; +} + + + +BOOL +ImportSoundLabel(HWND hwndDlg, HKEY hKey, TCHAR * szProfile, TCHAR * szLabelName, TCHAR * szAppName, TCHAR * szDefault) +{ + HKEY hSubKey; + TCHAR szValue[MAX_PATH]; + DWORD dwValue; + PSOUND_SCHEME_CONTEXT pScheme; + PAPP_CONTEXT pAppContext; + PLABEL_CONTEXT pLabelContext; + BOOL Create = FALSE; + + //MessageBox(hwndDlg, szProfile, szLabelName, MB_OK); + + if (!_tcsicmp(szProfile, _T(".Current"))) + { + //ignore current settings for now + return TRUE; + } + + if (RegOpenKeyEx(hKey, + szProfile, + 0, + KEY_READ, + &hSubKey) != ERROR_SUCCESS) + { + return FALSE; + } + + dwValue = sizeof(szValue) / sizeof(TCHAR); + if (RegQueryValueEx(hSubKey, + NULL, + NULL, + NULL, + (LPBYTE)szValue, + &dwValue) != ERROR_SUCCESS) + { + return FALSE; + } + pScheme = FindSoundProfile(hwndDlg, szProfile); + if (!pScheme) + { + //MessageBox(hwndDlg, szProfile, _T("no profile!!"), MB_OK); + return FALSE; + } + + pAppContext = FindAppContext(pScheme, szAppName); + if (!pAppContext) + { + pAppContext = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APP_CONTEXT)); + Create = TRUE; + } + + if (!pAppContext) + { + + //MessageBox(hwndDlg, szAppName, _T("no appcontext"), MB_OK); + return FALSE; + } + + pLabelContext = (PLABEL_CONTEXT)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LABEL_CONTEXT)); + _tcscpy(pLabelContext->szName, szLabelName); + _tcscpy(pLabelContext->szValue, szValue); + pLabelContext->Next = pAppContext->LabelContext; + pAppContext->LabelContext = pLabelContext; + + if (Create) + { + _tcscpy(pAppContext->szName, szAppName); + pAppContext->Next = pScheme->AppContext; + pScheme->AppContext = pAppContext; + } + return TRUE; +} + + +DWORD +ImportSoundEntry(HWND hwndDlg, HKEY hKey, TCHAR * szLabelName, TCHAR * szAppName, TCHAR * szDefault) +{ + HKEY hSubKey; + DWORD dwNumProfiles; + DWORD dwCurKey; + DWORD dwResult; + DWORD dwProfile; + TCHAR szProfile[MAX_PATH]; + + if (RegOpenKeyEx(hKey, + szLabelName, + 0, + KEY_READ, + &hSubKey) != ERROR_SUCCESS) + { + return FALSE; + } + + //MessageBox(hwndDlg, szLabelName, szAppName, MB_OK); + + dwNumProfiles = 0; + dwCurKey = 0; + do + { + dwProfile = sizeof(szProfile) / sizeof(TCHAR); + dwResult = RegEnumKeyEx(hSubKey, + dwCurKey, + szProfile, + &dwProfile, + NULL, + NULL, + NULL, + NULL); + + if (dwResult == ERROR_SUCCESS) + { + if (ImportSoundLabel(hwndDlg, hSubKey, szProfile, szLabelName, szAppName, szDefault)) + { + dwNumProfiles++; + } + } + + dwCurKey++; + }while(dwResult == ERROR_SUCCESS); + + RegCloseKey(hSubKey); + return dwNumProfiles; +} + + + +DWORD +ImportAppProfile(HWND hwndDlg, HKEY hKey, TCHAR * szAppName) +{ + HKEY hSubKey; + TCHAR szDefault[MAX_PATH]; + DWORD dwDefault; + DWORD dwCurKey; + DWORD dwResult; + DWORD dwNumEntry; + DWORD dwName; + TCHAR szName[MAX_PATH]; + + //MessageBox(hwndDlg, szAppName, _T("Importing...\n"), MB_OK); + + if (RegOpenKeyEx(hKey, + szAppName, + 0, + KEY_READ, + &hSubKey) != ERROR_SUCCESS) + { + return FALSE; + } + + dwDefault = sizeof(szDefault) / sizeof(TCHAR); + if (RegQueryValueEx(hSubKey, + NULL, + NULL, + NULL, + (LPBYTE)szDefault, + &dwDefault) != ERROR_SUCCESS) + { + RegCloseKey(hSubKey); + return FALSE; + } + + dwCurKey = 0; + dwNumEntry = 0; + do + { + dwName = sizeof(szName) / sizeof(TCHAR); + dwResult = RegEnumKeyEx(hSubKey, + dwCurKey, + szName, + &dwName, + NULL, + NULL, + NULL, + NULL); + if (dwResult == ERROR_SUCCESS) + { + if (ImportSoundEntry(hwndDlg, hSubKey, szName, szAppName, szDefault)) + { + dwNumEntry++; + } + } + dwCurKey++; + }while(dwResult == ERROR_SUCCESS); + RegCloseKey(hSubKey); + return dwNumEntry; +} + +BOOL +ImportSoundProfiles(HWND hwndDlg, HKEY hKey) +{ + DWORD dwCurKey; + DWORD dwResult; + DWORD dwNumApps; + TCHAR szName[MAX_PATH]; + HKEY hSubKey; + + if (RegOpenKeyEx(hKey, + _T("Apps"), + 0, + KEY_READ, + &hSubKey) != ERROR_SUCCESS) + { + return FALSE; + } + + dwNumApps = 0; + dwCurKey = 0; + do + { + dwResult = RegEnumKey(hSubKey, + dwCurKey, + szName, + sizeof(szName) / sizeof(TCHAR)); + + if (dwResult == ERROR_SUCCESS) + { + if (ImportAppProfile(hwndDlg, hSubKey, szName)) + { + dwNumApps++; + } + } + dwCurKey++; + }while(dwResult == ERROR_SUCCESS); + RegCloseKey(hSubKey); + + return (dwNumApps != 0); +} + + + +BOOL +LoadSoundProfiles(HWND hwndDlg, HKEY hKey) +{ + HKEY hSubKey; + DWORD dwNumSchemes;
if (RegOpenKeyEx(hKey, _T("Schemes"), @@ -236,12 +537,16 @@ return FALSE; }
- - - Result = EnumerateSoundSchemes(hwndDlg, hSubKey); - RegCloseKey(hSubKey); - - return Result; + dwNumSchemes = EnumerateSoundProfiles(hwndDlg, hSubKey); + + + if (dwNumSchemes) + { + //MessageBox(hwndDlg, _T("importing sound profiles..."), NULL, MB_OK); + ImportSoundProfiles(hwndDlg, hSubKey); + } + RegCloseKey(hSubKey); + return FALSE; }
@@ -257,9 +562,8 @@ { return FALSE; } - - LoadEventLabels(hwndDlg, hKey); - LoadSoundSchemes(hwndDlg, hKey); + LoadSoundProfiles(hwndDlg, hKey); + //LoadEventLabels(hwndDlg, hKey);
RegCloseKey(hKey);