/* * Audio management UI code * * Copyright 2004 Chris Morgan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * */ #define WIN32_LEAN_AND_MEAN #define NONAMELESSSTRUCT #define NONAMELESSUNION #include "config.h" #include "wine/port.h" #include #include #include #include #define COBJMACROS #include #include #include #include #include #include #include #include #include #include #include "ole2.h" #include "initguid.h" #include "devpkey.h" #include "mmdeviceapi.h" #include "audioclient.h" #include "audiopolicy.h" #include "winecfg.h" #include "resource.h" WINE_DEFAULT_DEBUG_CHANNEL(winecfg); static struct DSOUNDACCEL { UINT displayID; UINT visible; const char* settingStr; } DSound_HW_Accels[] = { {IDS_ACCEL_FULL, 1, "Full"}, {IDS_ACCEL_STANDARD, 0, "Standard"}, {IDS_ACCEL_BASIC, 0, "Basic"}, {IDS_ACCEL_EMULATION, 1, "Emulation"}, {0, 0, 0} }; static const char* DSound_Rates[] = { "48000", "44100", "22050", "16000", "11025", "8000", NULL }; static const char* DSound_Bits[] = { "8", "16", NULL }; static void initAudioDlg (HWND hDlg) { int i, j, found; char* buf = NULL; WINE_TRACE("\n"); SendDlgItemMessage(hDlg, IDC_DSOUND_HW_ACCEL, CB_RESETCONTENT, 0, 0); buf = get_reg_key(config_key, keypath("DirectSound"), "HardwareAcceleration", "Full"); j = found = 0; for (i = 0; 0 != DSound_HW_Accels[i].displayID; ++i) { WCHAR accelStr[64]; int match; match = (strcmp(buf, DSound_HW_Accels[i].settingStr) == 0); if (match) { DSound_HW_Accels[i].visible = 1; found = 1; } if (DSound_HW_Accels[i].visible) { LoadStringW (GetModuleHandle (NULL), DSound_HW_Accels[i].displayID, accelStr, sizeof(accelStr)/sizeof(accelStr[0])); SendDlgItemMessageW (hDlg, IDC_DSOUND_HW_ACCEL, CB_ADDSTRING, 0, (LPARAM)accelStr); if (match) SendDlgItemMessage(hDlg, IDC_DSOUND_HW_ACCEL, CB_SETCURSEL, j, 0); j++; } } if (!found) { WINE_ERR("Invalid Direct Sound HW Accel read from registry (%s)\n", buf); } HeapFree(GetProcessHeap(), 0, buf); SendDlgItemMessage(hDlg, IDC_DSOUND_RATES, CB_RESETCONTENT, 0, 0); for (i = 0; NULL != DSound_Rates[i]; ++i) { SendDlgItemMessage(hDlg, IDC_DSOUND_RATES, CB_ADDSTRING, 0, (LPARAM) DSound_Rates[i]); } buf = get_reg_key(config_key, keypath("DirectSound"), "DefaultSampleRate", "44100"); for (i = 0; NULL != DSound_Rates[i]; ++i) { if (strcmp(buf, DSound_Rates[i]) == 0) { SendDlgItemMessage(hDlg, IDC_DSOUND_RATES, CB_SETCURSEL, i, 0); break ; } } SendDlgItemMessage(hDlg, IDC_DSOUND_BITS, CB_RESETCONTENT, 0, 0); for (i = 0; NULL != DSound_Bits[i]; ++i) { SendDlgItemMessage(hDlg, IDC_DSOUND_BITS, CB_ADDSTRING, 0, (LPARAM) DSound_Bits[i]); } buf = get_reg_key(config_key, keypath("DirectSound"), "DefaultBitsPerSample", "16"); for (i = 0; NULL != DSound_Bits[i]; ++i) { if (strcmp(buf, DSound_Bits[i]) == 0) { SendDlgItemMessage(hDlg, IDC_DSOUND_BITS, CB_SETCURSEL, i, 0); break ; } } HeapFree(GetProcessHeap(), 0, buf); } INT_PTR CALLBACK AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_AUDIO_TEST: if(!PlaySound(MAKEINTRESOURCE(IDW_TESTSOUND), NULL, SND_RESOURCE | SND_SYNC)) MessageBox(NULL, "Audio test failed!", "Error", MB_OK | MB_ICONERROR); break; case IDC_DSOUND_HW_ACCEL: if (HIWORD(wParam) == CBN_SELCHANGE) { int selected_dsound_accel; int i, j = 0; SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); selected_dsound_accel = SendDlgItemMessage(hDlg, IDC_DSOUND_HW_ACCEL, CB_GETCURSEL, 0, 0); for (i = 0; DSound_HW_Accels[i].settingStr; ++i) { if (DSound_HW_Accels[i].visible) { if (j == selected_dsound_accel) { set_reg_key(config_key, keypath("DirectSound"), "HardwareAcceleration", DSound_HW_Accels[i].settingStr); break; } j++; } } } break; case IDC_DSOUND_RATES: if (HIWORD(wParam) == CBN_SELCHANGE) { int selected_dsound_rate; SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); selected_dsound_rate = SendDlgItemMessage(hDlg, IDC_DSOUND_RATES, CB_GETCURSEL, 0, 0); set_reg_key(config_key, keypath("DirectSound"), "DefaultSampleRate", DSound_Rates[selected_dsound_rate]); } break; case IDC_DSOUND_BITS: if (HIWORD(wParam) == CBN_SELCHANGE) { int selected_dsound_bits; SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); selected_dsound_bits = SendDlgItemMessage(hDlg, IDC_DSOUND_BITS, CB_GETCURSEL, 0, 0); set_reg_key(config_key, keypath("DirectSound"), "DefaultBitsPerSample", DSound_Bits[selected_dsound_bits]); } break; } break; case WM_SHOWWINDOW: set_window_title(hDlg); break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->code) { case PSN_KILLACTIVE: SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE); break; case PSN_APPLY: apply(); SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR); break; case PSN_SETACTIVE: break; } break; case WM_INITDIALOG: initAudioDlg(hDlg); break; } return FALSE; }