windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/w95upg/sysmig/mmedia.c
2020-09-26 16:20:57 +08:00

984 lines
29 KiB
C

/*++
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;
}