[MMSYS] Properly save Audio/MIDI In/Out in the registry

CORE-15582
This commit is contained in:
Stanislav Motylkov 2019-01-12 22:48:07 +03:00 committed by Giannis Adamopoulos
parent 9ae373a023
commit c95f335893

View file

@ -10,8 +10,20 @@
#include "mmsys.h" #include "mmsys.h"
typedef struct _GLOBAL_DATA
{
BOOL bNoAudioOut;
BOOL bNoAudioIn;
BOOL bNoMIDIOut;
BOOL bAudioOutChanged;
BOOL bAudioInChanged;
BOOL bMIDIOutChanged;
} GLOBAL_DATA, *PGLOBAL_DATA;
VOID VOID
InitAudioDlg(HWND hwnd) InitAudioDlg(HWND hwnd, PGLOBAL_DATA pGlobalData)
{ {
WAVEOUTCAPSW waveOutputPaps; WAVEOUTCAPSW waveOutputPaps;
WAVEINCAPS waveInputPaps; WAVEINCAPS waveInputPaps;
@ -32,6 +44,7 @@ InitAudioDlg(HWND hwnd)
{ {
Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices); Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0); SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
pGlobalData->bNoAudioOut = TRUE;
} }
else else
{ {
@ -72,6 +85,7 @@ InitAudioDlg(HWND hwnd)
{ {
Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices); Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0); SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
pGlobalData->bNoAudioIn = TRUE;
} }
else else
{ {
@ -113,6 +127,7 @@ InitAudioDlg(HWND hwnd)
{ {
Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices); Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0); SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
pGlobalData->bNoMIDIOut = TRUE;
} }
else else
{ {
@ -146,6 +161,60 @@ InitAudioDlg(HWND hwnd)
} }
} }
VOID
UpdateRegistryString(HWND hwnd, INT ctrl, LPWSTR key, LPWSTR value)
{
HWND hwndCombo = GetDlgItem(hwnd, ctrl);
INT CurSel = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0);
UINT TextLen;
WCHAR SelectedDevice[MAX_PATH] = {0};
HKEY hKey;
if (CurSel == CB_ERR)
return;
TextLen = SendMessageW(hwndCombo, CB_GETLBTEXTLEN, CurSel, 0) + 1;
if (TextLen > _countof(SelectedDevice))
return;
SendMessageW(hwndCombo, CB_GETLBTEXT, CurSel, (LPARAM)SelectedDevice);
if (RegCreateKeyExW(HKEY_CURRENT_USER, key, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS)
return;
RegSetValueExW(hKey, value, 0, REG_SZ, (BYTE *)SelectedDevice, (wcslen(SelectedDevice) + 1) * sizeof(WCHAR));
RegCloseKey(hKey);
}
VOID
SaveAudioDlg(HWND hwnd, PGLOBAL_DATA pGlobalData)
{
if (pGlobalData->bAudioOutChanged)
{
UpdateRegistryString(hwnd,
IDC_DEVICE_PLAY_LIST,
L"Software\\Microsoft\\Multimedia\\Sound Mapper",
L"Playback");
}
if (pGlobalData->bAudioInChanged)
{
UpdateRegistryString(hwnd,
IDC_DEVICE_REC_LIST,
L"Software\\Microsoft\\Multimedia\\Sound Mapper",
L"Record");
}
if (pGlobalData->bMIDIOutChanged)
{
UpdateRegistryString(hwnd,
IDC_DEVICE_MIDI_LIST,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap",
L"szPname");
}
}
static UINT static UINT
GetDevNum(HWND hControl, DWORD Id) GetDevNum(HWND hControl, DWORD Id)
{ {
@ -174,9 +243,9 @@ AudioDlgProc(HWND hwndDlg,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
{ {
UNREFERENCED_PARAMETER(lParam); PGLOBAL_DATA pGlobalData;
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(hwndDlg); pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch(uMsg) switch(uMsg)
{ {
@ -184,7 +253,13 @@ AudioDlgProc(HWND hwndDlg,
{ {
UINT NumWavOut = waveOutGetNumDevs(); UINT NumWavOut = waveOutGetNumDevs();
InitAudioDlg(hwndDlg); pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBAL_DATA));
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
if (!pGlobalData)
break;
InitAudioDlg(hwndDlg, pGlobalData);
if (!NumWavOut) if (!NumWavOut)
{ {
@ -199,6 +274,27 @@ AudioDlgProc(HWND hwndDlg,
EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME3_BTN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME3_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_ADV3_BTN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ADV3_BTN), FALSE);
} }
if (pGlobalData->bNoAudioOut)
{
EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_PLAY_LIST), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME1_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_ADV2_BTN), FALSE);
}
if (pGlobalData->bNoAudioIn)
{
EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_REC_LIST), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME2_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_ADV1_BTN), FALSE);
}
if (pGlobalData->bNoMIDIOut)
{
EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_MIDI_LIST), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME3_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_ADV3_BTN), FALSE);
}
} }
break; break;
@ -208,6 +304,9 @@ AudioDlgProc(HWND hwndDlg,
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
WCHAR szPath[MAX_PATH]; WCHAR szPath[MAX_PATH];
if (!pGlobalData)
break;
switch(LOWORD(wParam)) switch(LOWORD(wParam))
{ {
case IDC_VOLUME1_BTN: case IDC_VOLUME1_BTN:
@ -269,9 +368,55 @@ AudioDlgProc(HWND hwndDlg,
} }
break; break;
case IDC_DEVICE_PLAY_LIST:
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
pGlobalData->bAudioOutChanged = TRUE;
}
}
break;
case IDC_DEVICE_REC_LIST:
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
pGlobalData->bAudioInChanged = TRUE;
}
}
case IDC_DEVICE_MIDI_LIST:
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
pGlobalData->bMIDIOutChanged = TRUE;
}
}
break;
} }
} }
break; break;
case WM_DESTROY:
if (!pGlobalData)
break;
HeapFree(GetProcessHeap(), 0, pGlobalData);
break;
case WM_NOTIFY:
if (!pGlobalData)
break;
if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
{
SaveAudioDlg(hwndDlg, pGlobalData);
}
return TRUE;
} }
return FALSE; return FALSE;