/*++ Copyright (c) 1997 Microsoft Corporation Module Name: mmedia.c Abstract: Multimedia settings migration functions for Win95 Author: Calin Negreanu (calinn) 02-Dec-1997 Revision History: Ovidiu Temereanca (ovidiut) 29-Jan-1999 --*/ #include "pch.h" #include "mmediap.h" POOLHANDLE g_MmediaPool = NULL; #define MM_POOLGETMEM(STRUCT, COUNT) \ (COUNT * sizeof(STRUCT) < 1024) ? \ (STRUCT*) PoolMemGetMemory (g_MmediaPool, COUNT * sizeof(STRUCT)) : \ NULL static PCTSTR g_UserData = NULL; static HKEY g_UserRoot = NULL; BOOL pSaveSystemValue ( IN PCTSTR KeyName, IN PCTSTR Field, OPTIONAL IN PCTSTR StrValue, OPTIONAL IN DWORD NumValue OPTIONAL ) { return MemDbSetValueEx ( MEMDB_CATEGORY_MMEDIA_SYSTEM, KeyName, Field, StrValue, NumValue, NULL); } BOOL pSaveSystemBinaryValue ( IN PCTSTR KeyName, IN PCTSTR Field, OPTIONAL IN PCBYTE Data, IN DWORD DataSize ) { return MemDbSetBinaryValueEx ( MEMDB_CATEGORY_MMEDIA_SYSTEM, KeyName, Field, Data, DataSize, NULL); } BOOL pSaveMMSystemMixerSettings ( VOID ) { UINT MixerID, MixerMaxID; HMIXER mixer; MIXERCAPS mixerCaps; MIXERLINE mixerLine, mixerLineSource; MIXERLINECONTROLS mixerLineControls; MIXERCONTROL* pmxControl; MIXERCONTROLDETAILS mixerControlDetails; MMRESULT rc; DWORD Dest, Src, Control; TCHAR MixerKey[MAX_PATH], LineKey[MAX_PATH], SrcKey[MAX_PATH], SubKey[MAX_PATH]; DWORD ValuesCount; MixerMaxID = mixerGetNumDevs (); pSaveSystemValue (S_MIXERNUMDEVS, NULL, NULL, MixerMaxID); for (MixerID = 0; MixerID < MixerMaxID; MixerID++) { rc = mixerGetDevCaps (MixerID, &mixerCaps, sizeof (MIXERCAPS)); if (rc != MMSYSERR_NOERROR) { DEBUGMSG ((DBG_MMEDIA, "mixerGetDevCaps failed for mixer %lu [rc=%#X]. No settings will be preserved.", MixerID, rc)); continue; } rc = mixerOpen (&mixer, MixerID, 0L, 0L, MIXER_OBJECTF_MIXER); if (rc != MMSYSERR_NOERROR) { DEBUGMSG ((DBG_MMEDIA, "mixerOpen failed for mixer %lu [rc=%#X]. No settings will be preserved.", MixerID, rc)); continue; } wsprintf (MixerKey, S_MIXERID, MixerID); pSaveSystemValue (MixerKey, S_NUMLINES, NULL, mixerCaps.cDestinations); for (Dest = 0; Dest < mixerCaps.cDestinations; Dest++) { ZeroMemory (&mixerLine, sizeof (MIXERLINE)); mixerLine.cbStruct = sizeof (MIXERLINE); mixerLine.dwDestination = Dest; rc = mixerGetLineInfo ((HMIXEROBJ)mixer, &mixerLine, MIXER_GETLINEINFOF_DESTINATION); if (rc == MMSYSERR_NOERROR) { wsprintf (LineKey, S_LINEID, Dest); if (mixerLine.cControls > 0) { // // get all control values for the destination // ZeroMemory (&mixerLineControls, sizeof (MIXERLINECONTROLS)); mixerLineControls.cbStruct = sizeof (MIXERLINECONTROLS); mixerLineControls.dwLineID = mixerLine.dwLineID; mixerLineControls.cControls = mixerLine.cControls; mixerLineControls.cbmxctrl = sizeof (MIXERCONTROL); mixerLineControls.pamxctrl = MM_POOLGETMEM (MIXERCONTROL, mixerLineControls.cControls); if (mixerLineControls.pamxctrl) { rc = mixerGetLineControls((HMIXEROBJ)mixer, &mixerLineControls, MIXER_GETLINECONTROLSF_ALL); if (rc == MMSYSERR_NOERROR) { pSaveSystemValue (MixerKey, LineKey, S_NUMCONTROLS, mixerLine.cControls); for ( Control = 0, pmxControl = mixerLineControls.pamxctrl; Control < mixerLineControls.cControls; Control++, pmxControl++ ) { ZeroMemory (&mixerControlDetails, sizeof (MIXERCONTROLDETAILS)); mixerControlDetails.cbStruct = sizeof (MIXERCONTROLDETAILS); mixerControlDetails.dwControlID = pmxControl->dwControlID; mixerControlDetails.cMultipleItems = pmxControl->cMultipleItems; mixerControlDetails.cChannels = mixerLine.cChannels; if (pmxControl->fdwControl & MIXERCONTROL_CONTROLF_UNIFORM) { mixerControlDetails.cChannels = 1; } ValuesCount = mixerControlDetails.cChannels; if (pmxControl->fdwControl & MIXERCONTROL_CONTROLF_MULTIPLE) { ValuesCount *= mixerControlDetails.cMultipleItems; } mixerControlDetails.cbDetails = sizeof (DWORD); mixerControlDetails.paDetails = MM_POOLGETMEM (DWORD, ValuesCount); if (mixerControlDetails.paDetails) { rc = mixerGetControlDetails ((HMIXEROBJ)mixer, &mixerControlDetails, MIXER_GETCONTROLDETAILSF_VALUE); if (rc == MMSYSERR_NOERROR) { wsprintf (SubKey, TEXT("%s\\%lu"), LineKey, Control); pSaveSystemBinaryValue ( MixerKey, SubKey, mixerControlDetails.paDetails, mixerControlDetails.cbDetails * ValuesCount ); } else { DEBUGMSG ((DBG_MMEDIA, "mixerGetControlDetails failed for mixer %lu, Line=%lu, Ctl=%lu [rc=%#X]", MixerID, Dest, Control, rc)); } } } } else { DEBUGMSG ((DBG_MMEDIA, "mixerGetLineControls failed for mixer %lu, Line=%#X [rc=%#X].", MixerID, mixerLineControls.dwLineID, rc)); } } } // // get this information for all source connections // pSaveSystemValue (MixerKey, LineKey, S_NUMSOURCES, mixerLine.cConnections); for (Src = 0; Src < mixerLine.cConnections; Src++) { ZeroMemory (&mixerLineSource, sizeof (MIXERLINE)); mixerLineSource.cbStruct = sizeof(MIXERLINE); mixerLineSource.dwDestination = Dest; mixerLineSource.dwSource = Src; rc = mixerGetLineInfo((HMIXEROBJ)mixer, &mixerLineSource, MIXER_GETLINEINFOF_SOURCE); if (rc == MMSYSERR_NOERROR) { wsprintf (SrcKey, S_SRCID, Src); if (mixerLineSource.cControls > 0) { // // get all control values // ZeroMemory (&mixerLineControls, sizeof (MIXERLINECONTROLS)); mixerLineControls.cbStruct = sizeof (MIXERLINECONTROLS); mixerLineControls.dwLineID = mixerLineSource.dwLineID; mixerLineControls.cControls = mixerLineSource.cControls; mixerLineControls.cbmxctrl = sizeof (MIXERCONTROL); mixerLineControls.pamxctrl = MM_POOLGETMEM (MIXERCONTROL, mixerLineControls.cControls); if (mixerLineControls.pamxctrl) { rc = mixerGetLineControls((HMIXEROBJ)mixer, &mixerLineControls, MIXER_GETLINECONTROLSF_ALL); if (rc == MMSYSERR_NOERROR) { wsprintf (SubKey, TEXT("%s\\%s"), SrcKey, S_NUMCONTROLS); pSaveSystemValue ( MixerKey, LineKey, SubKey, mixerLineSource.cControls ); for ( Control = 0, pmxControl = mixerLineControls.pamxctrl; Control < mixerLineControls.cControls; Control++, pmxControl++ ) { ZeroMemory (&mixerControlDetails, sizeof (MIXERCONTROLDETAILS)); mixerControlDetails.cbStruct = sizeof (MIXERCONTROLDETAILS); mixerControlDetails.dwControlID = pmxControl->dwControlID; mixerControlDetails.cMultipleItems = pmxControl->cMultipleItems; mixerControlDetails.cChannels = mixerLineSource.cChannels; if (pmxControl->fdwControl & MIXERCONTROL_CONTROLF_UNIFORM) { mixerControlDetails.cChannels = 1; } ValuesCount = mixerControlDetails.cChannels; if (pmxControl->fdwControl & MIXERCONTROL_CONTROLF_MULTIPLE) { ValuesCount *= mixerControlDetails.cMultipleItems; } mixerControlDetails.cbDetails = sizeof (DWORD); mixerControlDetails.paDetails = MM_POOLGETMEM (DWORD, ValuesCount); if (mixerControlDetails.paDetails) { rc = mixerGetControlDetails ((HMIXEROBJ)mixer, &mixerControlDetails, MIXER_GETCONTROLDETAILSF_VALUE); if (rc == MMSYSERR_NOERROR) { wsprintf (SubKey, TEXT("%s\\%s\\%lu"), LineKey, SrcKey, Control); pSaveSystemBinaryValue ( MixerKey, SubKey, mixerControlDetails.paDetails, mixerControlDetails.cbDetails * ValuesCount ); } else { DEBUGMSG ((DBG_MMEDIA, "mixerGetControlDetails failed for mixer %lu, Line=%lu, Src=%lu, Ctl=%lu [rc=%#X]", MixerID, Dest, Src, Control, rc)); } } } } else { DEBUGMSG ((DBG_MMEDIA, "mixerGetLineControls failed for mixer %lu, Src=%lu, Line=%#X [rc=%#X].", MixerID, Src, mixerLineControls.dwLineID, rc)); } } } } else { DEBUGMSG ((DBG_MMEDIA, "mixerGetLineInfo failed for mixer %lu, Src=%lu [rc=%#X].", MixerID, Src, rc)); } } } else { DEBUGMSG ((DBG_MMEDIA, "mixerGetLineInfo failed for mixer %lu [rc=%#X]. No settings will be preserved.", MixerID, rc)); } } mixerClose (mixer); } return TRUE; } BOOL pGetSoftwareKey ( OUT LPTSTR SoftwareKey, IN DWORD MaxKeyLen, IN DWORD DeviceID, IN HKEY WaveDevices ) { TCHAR Buffer[MAX_PATH]; DWORD Type, Len; HKEY Device; BOOL b; LONG rc; Len = sizeof (Buffer); rc = RegEnumKeyEx (WaveDevices, DeviceID++, Buffer, &Len, NULL, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { return FALSE; } rc = TrackedRegOpenKeyEx (WaveDevices, Buffer, 0, KEY_READ, &Device); if (rc != ERROR_SUCCESS) { return FALSE; } rc = RegQueryValueEx ( Device, S_SOFTWAREKEY, NULL, &Type, (LPBYTE)SoftwareKey, &MaxKeyLen ); b = (rc == ERROR_SUCCESS) && (Type == REG_SZ); CloseRegKey (Device); return b; } VOID pSaveDeviceDSSettings ( IN DWORD DeviceID, IN HKEY Device ) { TCHAR MemDBKey[MAX_PATH]; DWORD Type, Len, Value; HKEY Key; LONG rc; wsprintf (MemDBKey, S_WAVEID, DeviceID); // // DirectSound props // rc = TrackedRegOpenKeyEx (Device, S_DSMIXERDEFAULTS, 0, KEY_READ, &Key); if (rc == ERROR_SUCCESS) { Len = sizeof (Value); rc = RegQueryValueEx (Key, S_ACCELERATION, NULL, &Type, (LPBYTE)&Value, &Len); if (rc == ERROR_SUCCESS && (Type == REG_DWORD)) { pSaveSystemValue (MemDBKey, S_DIRECTSOUND, S_ACCELERATION, Value); } Len = sizeof (Value); rc = RegQueryValueEx (Key, S_SRCQUALITY, NULL, &Type, (LPBYTE)&Value, &Len); if (rc == ERROR_SUCCESS && (Type == REG_DWORD)) { pSaveSystemValue (MemDBKey, S_DIRECTSOUND, S_SRCQUALITY, Value); } CloseRegKey (Key); } rc = TrackedRegOpenKeyEx (Device, S_DSSPEAKERCONFIG, 0, KEY_READ, &Key); if (rc == ERROR_SUCCESS) { Len = sizeof (Value); rc = RegQueryValueEx (Key, S_SPEAKERCONFIG, NULL, &Type, (LPBYTE)&Value, &Len); if (rc == ERROR_SUCCESS && (Type == REG_DWORD)) { pSaveSystemValue (MemDBKey, S_DIRECTSOUND, S_SPEAKERCONFIG, Value); } CloseRegKey (Key); } rc = TrackedRegOpenKeyEx (Device, S_DSSPEAKERTYPE, 0, KEY_READ, &Key); if (rc == ERROR_SUCCESS) { Len = sizeof (Value); rc = RegQueryValueEx (Key, S_SPEAKERTYPE, NULL, &Type, (LPBYTE)&Value, &Len); if (rc == ERROR_SUCCESS && (Type == REG_DWORD)) { pSaveSystemValue (MemDBKey, S_DIRECTSOUND, S_SPEAKERTYPE, Value); } CloseRegKey (Key); } // // DirectSoundCapture props // rc = TrackedRegOpenKeyEx (Device, S_DSCMIXERDEFAULTS, 0, KEY_READ, &Key); if (rc == ERROR_SUCCESS) { Len = sizeof (Value); rc = RegQueryValueEx (Key, S_ACCELERATION, NULL, &Type, (LPBYTE)&Value, &Len); if (rc == ERROR_SUCCESS && (Type == REG_DWORD)) { pSaveSystemValue (MemDBKey, S_DIRECTSOUNDCAPTURE, S_ACCELERATION, Value); } Len = sizeof (Value); rc = RegQueryValueEx (Key, S_SRCQUALITY, NULL, &Type, (LPBYTE)&Value, &Len); if (rc == ERROR_SUCCESS && (Type == REG_DWORD)) { pSaveSystemValue (MemDBKey, S_DIRECTSOUNDCAPTURE, S_SRCQUALITY, Value); } CloseRegKey (Key); } } BOOL pSaveMMSystemDirectSound ( VOID ) { HKEY WaveDevices, Device; DWORD NumDevs; DWORD DeviceID; TCHAR SoftwareKey[MAX_PATH]; LONG rc; rc = TrackedRegOpenKeyEx ( HKEY_LOCAL_MACHINE, S_SKEY_WAVEDEVICES, 0, KEY_READ, &WaveDevices ); if (rc == ERROR_SUCCESS) { if (GetRegSubkeysCount (WaveDevices, &NumDevs, NULL)) { pSaveSystemValue (S_WAVENUMDEVS, NULL, NULL, NumDevs); for (DeviceID = 0; DeviceID < NumDevs; DeviceID++) { if (pGetSoftwareKey (SoftwareKey, sizeof (SoftwareKey), DeviceID, WaveDevices)) { // // got the key, go get DirectSound values // rc = TrackedRegOpenKeyEx ( HKEY_LOCAL_MACHINE, SoftwareKey, 0, KEY_READ, &Device ); if (rc == ERROR_SUCCESS) { pSaveDeviceDSSettings (DeviceID, Device); CloseRegKey (Device); } } } } CloseRegKey (WaveDevices); } return TRUE; } BOOL pSaveMMSystemCDSettings ( VOID ) { HKEY cdKey; HKEY unitKey; PBYTE cdRomNumber = NULL; PBYTE cdRomVolume = NULL; PBYTE cdRomVolInc = NULL; TCHAR unitKeyStr [MAX_TCHAR_PATH]; cdKey = OpenRegKey (HKEY_LOCAL_MACHINE, S_SKEY_CDAUDIO); if (cdKey != NULL) { cdRomNumber = GetRegValueBinary (cdKey, S_DEFAULTDRIVE); if (cdRomNumber != NULL) { pSaveSystemValue (S_CDROM, S_DEFAULTDRIVE, NULL, *cdRomNumber); wsprintf (unitKeyStr, S_SKEY_CDUNIT, *cdRomNumber); unitKey = OpenRegKey (HKEY_LOCAL_MACHINE, unitKeyStr); if (unitKey != NULL) { cdRomVolume = GetRegValueBinary (unitKey, S_VOLUMESETTINGS); if (cdRomVolume != NULL) { pSaveSystemValue (S_CDROM, S_VOLUMESETTINGS, NULL, *(cdRomVolume + 4)); MemFreeWrapper (cdRomVolume); } CloseRegKey (unitKey); } MemFreeWrapper (cdRomNumber); } CloseRegKey (cdKey); } return TRUE; } BOOL pSaveMMSystemMCISoundSettings ( VOID ) { TCHAR Buffer[MAX_PATH]; PTSTR p; PCTSTR infName; DWORD Chars; infName = JoinPaths (g_WinDir, S_SYSTEM_INI); Chars = GetPrivateProfileString ( S_MCI, S_WAVEAUDIO, TEXT(""), Buffer, MAX_PATH, infName ); if (Chars > 0) { // // skip driver name // p = Buffer; while (*p && (*p != TEXT(' ') && *p != TEXT('\t'))) { p++; } // // skip white spaces // while (*p && (*p == TEXT(' ') || *p == TEXT('\t'))) { p++; } if (*p) { // // save this param; legal values for NT driver are 2-9 // if (*(p + 1) == 0 && *p >= TEXT('2') && *p <= TEXT('9')) { pSaveSystemValue (S_MCI, S_WAVEAUDIO, NULL, *p - TEXT('0')); } } } FreePathString (infName); return TRUE; } BOOL pSaveUserValue ( IN PCTSTR KeyName, IN PCTSTR Field, OPTIONAL IN PCTSTR StrValue, OPTIONAL IN DWORD NumValue OPTIONAL ) { return MemDbSetValueEx ( g_UserData, KeyName, Field, StrValue, NumValue, NULL ); } BOOL pSaveMMUserPreferredOnly ( VOID ) { HKEY soundMapperKey; PDWORD preferredOnly; soundMapperKey = OpenRegKey (g_UserRoot, S_SKEY_SOUNDMAPPER); if (soundMapperKey != NULL) { preferredOnly = GetRegValueDword (soundMapperKey, S_PREFERREDONLY); if (preferredOnly != NULL) { pSaveUserValue (S_AUDIO, S_PREFERREDONLY, NULL, *preferredOnly); MemFreeWrapper (preferredOnly); } CloseRegKey (soundMapperKey); } return TRUE; } BOOL pSaveMMUserShowVolume ( VOID ) { HKEY sysTrayKey; PDWORD showVolume; BOOL ShowVolume; sysTrayKey = OpenRegKey (g_UserRoot, S_SKEY_SYSTRAY); if (sysTrayKey != NULL) { showVolume = GetRegValueDword (sysTrayKey, S_SERVICES); if (showVolume != NULL) { ShowVolume = (*showVolume & SERVICE_SHOWVOLUME) != 0; pSaveUserValue (S_AUDIO, S_SHOWVOLUME, NULL, ShowVolume); MemFreeWrapper (showVolume); } CloseRegKey (sysTrayKey); } return TRUE; } BOOL pSaveMMUserVideoSettings ( VOID ) { HKEY videoSetKey; PDWORD videoSettings; videoSetKey = OpenRegKey (g_UserRoot, S_SKEY_VIDEOUSER); if (videoSetKey != NULL) { videoSettings = GetRegValueDword (videoSetKey, S_DEFAULTOPTIONS); if (videoSettings != NULL) { pSaveUserValue (S_VIDEO, S_VIDEOSETTINGS, NULL, *videoSettings); MemFreeWrapper (videoSettings); } CloseRegKey (videoSetKey); } return TRUE; } BOOL pSaveMMUserPreferredPlayback ( VOID ) { HKEY soundMapperKey; PTSTR playbackStr; UINT waveOutNumDevs, waveCrt; WAVEOUTCAPS waveOutCaps; MMRESULT waveOutResult; soundMapperKey = OpenRegKey (g_UserRoot, S_SKEY_SOUNDMAPPER); if (soundMapperKey != NULL) { if (ISMEMPHIS()) { playbackStr = GetRegValueString (soundMapperKey, S_USERPLAYBACK); } else { playbackStr = GetRegValueString (soundMapperKey, S_PLAYBACK); } if (playbackStr != NULL) { if (playbackStr [0] != 0) { waveOutNumDevs = waveOutGetNumDevs(); if (waveOutNumDevs > 1) { // // try to match string with one returned by waveOutGetDevCaps // pSaveSystemValue (S_WAVEOUTNUMDEVS, NULL, NULL, waveOutNumDevs); for (waveCrt = 0; waveCrt < waveOutNumDevs; waveCrt++) { waveOutResult = waveOutGetDevCaps (waveCrt, &waveOutCaps, sizeof (waveOutCaps)); if (waveOutResult == MMSYSERR_NOERROR && StringIMatch (playbackStr, waveOutCaps.szPname) ) { pSaveUserValue (S_AUDIO, S_PREFERREDPLAY, NULL, waveCrt); break; } } } } MemFreeWrapper (playbackStr); } CloseRegKey (soundMapperKey); } return TRUE; } BOOL pSaveMMUserPreferredRecord ( VOID ) { HKEY soundMapperKey; PTSTR recordStr; UINT waveInNumDevs, waveCrt; WAVEINCAPS waveInCaps; MMRESULT waveInResult; soundMapperKey = OpenRegKey (g_UserRoot, S_SKEY_SOUNDMAPPER); if (soundMapperKey != NULL) { if (ISMEMPHIS()) { recordStr = GetRegValueString (soundMapperKey, S_USERRECORD); } else { recordStr = GetRegValueString (soundMapperKey, S_RECORD); } if (recordStr != NULL) { if (recordStr [0] != 0) { waveInNumDevs = waveInGetNumDevs(); if (waveInNumDevs > 1) { // // try to match string with one returned by waveInGetDevCaps // pSaveSystemValue (S_WAVEINNUMDEVS, NULL, NULL, waveInNumDevs); for (waveCrt = 0; waveCrt < waveInNumDevs; waveCrt++) { waveInResult = waveInGetDevCaps (waveCrt, &waveInCaps, sizeof (waveInCaps)); if (waveInResult == MMSYSERR_NOERROR && StringIMatch (recordStr, waveInCaps.szPname) ) { pSaveUserValue (S_AUDIO, S_PREFERREDREC, NULL, waveCrt); break; } } } } MemFreeWrapper (recordStr); } CloseRegKey (soundMapperKey); } return TRUE; } BOOL pSaveMMUserSndVol32 ( VOID ) { HKEY VolControl, Options, MixerKey; PDWORD Style, Value; BOOL ShowAdvanced; UINT MixerID, MixerMaxID; MIXERCAPS mixerCaps; TCHAR MixerNum[MAX_PATH]; TCHAR Buffer[MAX_PATH]; DWORD Len, NumEntries, Index; LONG rc; Options = OpenRegKey (g_UserRoot, S_SKEY_VOLCTL_OPTIONS); if (Options != NULL) { Style = GetRegValueDword (Options, S_STYLE); if (Style != NULL) { ShowAdvanced = (*Style & STYLE_SHOWADVANCED) != 0; pSaveUserValue (S_SNDVOL32, S_SHOWADVANCED, NULL, ShowAdvanced); MemFreeWrapper (Style); } CloseRegKey (Options); } // // save window position for each mixer device // VolControl = OpenRegKey (g_UserRoot, S_SKEY_VOLUMECONTROL); if (VolControl != NULL) { if (GetRegSubkeysCount (VolControl, &NumEntries, NULL)) { MixerMaxID = mixerGetNumDevs (); for (MixerID = 0; MixerID < MixerMaxID; MixerID++) { rc = mixerGetDevCaps (MixerID, &mixerCaps, sizeof (MIXERCAPS)); if (rc == MMSYSERR_NOERROR) { // // find corresponding subkey // wsprintf (MixerNum, S_MIXERID, MixerID); for (Index = 0; Index < NumEntries; Index++) { Len = sizeof (Buffer); rc = RegEnumKeyEx (VolControl, Index, Buffer, &Len, NULL, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { continue; } if (StringMatch (Buffer, mixerCaps.szPname)) { // // this is the one // MixerKey = OpenRegKey (VolControl, Buffer); if (MixerKey) { Value = GetRegValueDword (MixerKey, S_X); if (Value) { pSaveUserValue (S_SNDVOL32, MixerNum, S_X, *Value); MemFreeWrapper (Value); } Value = GetRegValueDword (MixerKey, S_Y); if (Value) { pSaveUserValue (S_SNDVOL32, MixerNum, S_Y, *Value); MemFreeWrapper (Value); } CloseRegKey (MixerKey); } break; } } } } } CloseRegKey (VolControl); } return TRUE; } #define DEFMAC(Item) pSave##Item, static MM_SETTING_ACTION g_MMSaveSystemSettings [] = { MM_SYSTEM_SETTINGS }; static MM_SETTING_ACTION g_MMSaveUserSettings [] = { MM_USER_SETTINGS }; #undef DEFMAC BOOL pSaveMMSettings_System ( VOID ) { int i; g_MmediaPool = PoolMemInitNamedPool ("MMedia9x"); if (!g_MmediaPool) { return FALSE; } for (i = 0; i < sizeof (g_MMSaveSystemSettings) / sizeof (MM_SETTING_ACTION); i++) { (*g_MMSaveSystemSettings[i]) (); } PoolMemDestroyPool (g_MmediaPool); g_MmediaPool = NULL; return TRUE; } BOOL pSaveMMSettings_User ( PCTSTR UserName, HKEY UserRoot ) { int i; if (!UserName || UserName[0] == 0) { return TRUE; } MYASSERT (g_UserData == NULL); g_UserData = JoinPaths (MEMDB_CATEGORY_MMEDIA_USERS, UserName); g_UserRoot = UserRoot; __try { for (i = 0; i < sizeof (g_MMSaveUserSettings) / sizeof (MM_SETTING_ACTION); i++) { (*g_MMSaveUserSettings[i]) (); } } __finally { FreePathString (g_UserData); g_UserData = NULL; g_UserRoot = NULL; } return TRUE; } DWORD SaveMMSettings_System ( IN DWORD Request ) { switch (Request) { case REQUEST_QUERYTICKS: return TICKS_SAVE_MM_SETTINGS_SYSTEM; case REQUEST_RUN: if (!pSaveMMSettings_System ()) { return GetLastError (); } break; default: DEBUGMSG ((DBG_ERROR, "Bad parameter in SaveMMSettings_System")); } return ERROR_SUCCESS; } DWORD SaveMMSettings_User ( IN DWORD Request, IN PUSERENUM EnumPtr ) { switch (Request) { case REQUEST_QUERYTICKS: return TICKS_SAVE_MM_SETTINGS_USER; case REQUEST_BEGINUSERPROCESSING: // // No initialization needed. // break; case REQUEST_RUN: if (!pSaveMMSettings_User (EnumPtr -> UserName, EnumPtr -> UserRegKey )) { return GetLastError (); } break; case REQUEST_ENDUSERPROCESSING: // // No cleanup needed. // break; default: DEBUGMSG ((DBG_ERROR, "Bad parameter in SaveMMSettings_User")); } return ERROR_SUCCESS; }