From: Anton Baskanov baskanov@gmail.com
--- programs/winecfg/audio.c | 69 +++++++++++++++++++++++++++++++++++++ programs/winecfg/resource.h | 1 + programs/winecfg/winecfg.rc | 6 ++-- 3 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/programs/winecfg/audio.c b/programs/winecfg/audio.c index b0fa6e8f390..36cad8558c3 100644 --- a/programs/winecfg/audio.c +++ b/programs/winecfg/audio.c @@ -58,9 +58,12 @@ struct DeviceInfo { };
static WCHAR g_drv_keyW[256] = L"Software\Wine\Drivers\"; +static WCHAR g_midimap_keyW[256] = L"Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap";
static UINT num_render_devs, num_capture_devs; static struct DeviceInfo *render_devs, *capture_devs; +static UINT num_midi_devs; +static WCHAR **midi_devs;
static const struct { @@ -178,6 +181,31 @@ static BOOL load_devices(IMMDeviceEnumerator *devenum, EDataFlow dataflow, return TRUE; }
+static BOOL load_midi_devices(UINT *ndevs, WCHAR ***out) +{ + UINT i; + + *ndevs = midiOutGetNumDevs(); + + if(*ndevs > 0){ + *out = malloc(sizeof(struct DeviceInfo) * (*ndevs)); + if(!*out) + return FALSE; + + for(i = 0; i < *ndevs; ++i){ + MIDIOUTCAPSW caps; + if (MMSYSERR_NOERROR != midiOutGetDevCapsW(i, &caps, sizeof(caps))){ + (*out)[i] = NULL; + continue; + } + (*out)[i] = StrDupW(caps.szPname); + } + }else + *out = NULL; + + return TRUE; +} + static BOOL get_driver_name(IMMDeviceEnumerator *devenum, PROPVARIANT *pv) { IMMDevice *device; @@ -214,6 +242,7 @@ static void initAudioDlg (HWND hDlg) WCHAR display_str[256], format_str[256], sysdefault_str[256], disabled_str[64]; IMMDeviceEnumerator *devenum; BOOL have_driver = FALSE; + WCHAR *reg_midi_dev; HRESULT hr; UINT i; LVCOLUMNW lvcol; @@ -248,6 +277,8 @@ static void initAudioDlg (HWND hDlg) IMMDeviceEnumerator_Release(devenum); }
+ load_midi_devices(&num_midi_devs, &midi_devs); + SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_ADDSTRING, 0, (LPARAM)sysdefault_str); SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_SETCURSEL, 0, 0); @@ -261,6 +292,9 @@ static void initAudioDlg (HWND hDlg) SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_ADDSTRING, 0, (LPARAM)sysdefault_str); SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_SETCURSEL, 0, 0); + SendDlgItemMessageW(hDlg, IDC_MIDI_DEVICE, CB_ADDSTRING, + 0, (LPARAM)sysdefault_str); + SendDlgItemMessageW(hDlg, IDC_MIDI_DEVICE, CB_SETCURSEL, 0, 0);
i = 0; while (speaker_configs[i].text_id != 0) { @@ -369,6 +403,20 @@ static void initAudioDlg (HWND hDlg) }else swprintf(display_str, ARRAY_SIZE(display_str), format_str, disabled_str);
+ reg_midi_dev = get_reg_key(HKEY_CURRENT_USER, g_midimap_keyW, L"szPname", NULL); + for(i = 0; i < num_midi_devs; ++i){ + if(!midi_devs[i]) + continue; + + SendDlgItemMessageW(hDlg, IDC_MIDI_DEVICE, CB_ADDSTRING, + 0, (LPARAM)midi_devs[i]); + SendDlgItemMessageW(hDlg, IDC_MIDI_DEVICE, CB_SETITEMDATA, + i + 1, (LPARAM)midi_devs[i]); + if(reg_midi_dev && !wcscmp(midi_devs[i], reg_midi_dev)) + SendDlgItemMessageW(hDlg, IDC_MIDI_DEVICE, CB_SETCURSEL, i + 1, 0); + } + free(reg_midi_dev); + SetDlgItemTextW(hDlg, IDC_AUDIO_DRIVER, display_str); }
@@ -388,6 +436,21 @@ static void set_reg_device(HWND hDlg, int dlgitem, const WCHAR *key_name) set_reg_key(HKEY_CURRENT_USER, g_drv_keyW, key_name, info->id); }
+static void set_reg_midi_device(HWND hDlg, int dlgitem) +{ + UINT idx; + WCHAR *id; + + idx = SendDlgItemMessageW(hDlg, dlgitem, CB_GETCURSEL, 0, 0); + + id = (WCHAR *)SendDlgItemMessageW(hDlg, dlgitem, CB_GETITEMDATA, idx, 0); + + if(!id || id == (void*)CB_ERR) + set_reg_key(HKEY_CURRENT_USER, g_midimap_keyW, L"szPname", NULL); + else + set_reg_key(HKEY_CURRENT_USER, g_midimap_keyW, L"szPname", id); +} + static void test_sound(void) { if(!PlaySoundW(MAKEINTRESOURCEW(IDW_TESTSOUND), NULL, SND_RESOURCE | SND_ASYNC)){ @@ -501,6 +564,12 @@ AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SendMessageW(GetParent(hDlg), PSM_CHANGED, 0, 0); } break; + case IDC_MIDI_DEVICE: + if(HIWORD(wParam) == CBN_SELCHANGE){ + set_reg_midi_device(hDlg, IDC_MIDI_DEVICE); + SendMessageW(GetParent(hDlg), PSM_CHANGED, 0, 0); + } + break; case IDC_SPEAKERCONFIG_SPEAKERS: if(HIWORD(wParam) == CBN_SELCHANGE){ UINT dev, idx; diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h index cd7eaaf711e..b7b237221b0 100644 --- a/programs/winecfg/resource.h +++ b/programs/winecfg/resource.h @@ -156,6 +156,7 @@ #define IDS_AUDIO_SPEAKER_MONO 1317 #define IDC_LIST_AUDIO_DEVICES 1318 #define IDS_AUDIO_SPEAKER_CONFIG 1319 +#define IDC_MIDI_DEVICE 1320
/* desktop integration tab */ #define IDC_THEME_COLORCOMBO 1401 diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc index 779a2f900e3..73a189aa5ed 100644 --- a/programs/winecfg/winecfg.rc +++ b/programs/winecfg/winecfg.rc @@ -267,16 +267,18 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Driver diagnostics",IDC_STATIC,8,4,244,27 LTEXT "",IDC_AUDIO_DRIVER,18,16,230,8 - GROUPBOX "Defaults",IDC_STATIC,8,33,244,76 + PUSHBUTTON "&Test Sound",IDC_AUDIO_TEST,177,13,69,14 + GROUPBOX "Defaults",IDC_STATIC,8,33,244,92 LTEXT "Output device:",IDC_STATIC,18,45,230,8 LTEXT "Voice output device:",IDC_STATIC,18,61,230,8 LTEXT "Input device:",IDC_STATIC,18,77,230,8 LTEXT "Voice input device:",IDC_STATIC,18,93,230,8 + LTEXT "MIDI output device:",IDC_STATIC,18,110,230,8 COMBOBOX IDC_AUDIOOUT_DEVICE,110,43,135,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_VOICEOUT_DEVICE,110,59,135,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_AUDIOIN_DEVICE,110,75,135,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_VOICEIN_DEVICE,110,91,135,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Test Sound",IDC_AUDIO_TEST,8,113,69,14 + COMBOBOX IDC_MIDI_DEVICE,110,107,135,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP GROUPBOX "Speaker configuration",IDC_STATIC,8,132,244,86 CONTROL "",IDC_LIST_AUDIO_DEVICES,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP | LVS_NOSORTHEADER, 15,146,230,52