diff options
Diffstat (limited to 'utils/winmm_drv/cpl/config_dialog.c')
-rw-r--r-- | utils/winmm_drv/cpl/config_dialog.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/utils/winmm_drv/cpl/config_dialog.c b/utils/winmm_drv/cpl/config_dialog.c index 195524d..3f5c66d 100644 --- a/utils/winmm_drv/cpl/config_dialog.c +++ b/utils/winmm_drv/cpl/config_dialog.c @@ -1,5 +1,6 @@ #define WIN32_LEAN_AND_MEAN #include <windows.h> +#include <mmsystem.h> #include <commctrl.h> #include <commdlg.h> #include <string.h> @@ -38,6 +39,15 @@ static const char *const volume_models_descriptions[] = NULL }; +static const char *const channel_allocation_descriptions[] = +{ + "Auto (defined by bank)", + "Sounding off delay based", + "Same instrument", + "Any first released", + NULL +}; + static const char * const emulator_type_descriptions[] = { "Nuked OPL3 1.8", @@ -50,6 +60,7 @@ static const char * const emulator_type_descriptions[] = static DriverSettings g_setup; static HINSTANCE s_hModule; +static UINT s_audioOutPrev = WAVE_MAPPER; static void syncBankType(HWND hwnd, int type); static void sync4ops(HWND hwnd); @@ -109,6 +120,12 @@ static void syncWidget(HWND hwnd) updateBankName(hwnd, g_setup.bankPath); SendDlgItemMessageA(hwnd, IDC_EMULATOR, CB_SETCURSEL, (WPARAM)g_setup.emulatorId, (LPARAM)0); SendDlgItemMessageA(hwnd, IDC_VOLUMEMODEL, CB_SETCURSEL, (WPARAM)g_setup.volumeModel, (LPARAM)0); + SendDlgItemMessageA(hwnd, IDC_CHANALLOC, CB_SETCURSEL, (WPARAM)g_setup.chanAlloc + 1, (LPARAM)0); + + if(g_setup.outputDevice == WAVE_MAPPER) + SendDlgItemMessageA(hwnd, IDC_AUDIOOUT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + else + SendDlgItemMessageA(hwnd, IDC_AUDIOOUT, CB_SETCURSEL, (WPARAM)g_setup.outputDevice + 1, (LPARAM)0); sync4ops(hwnd); } @@ -116,6 +133,8 @@ static void syncWidget(HWND hwnd) static void buildLists(HWND hwnd) { int i, bMax; + UINT ai, aMax; + WAVEOUTCAPSW wavDev; HMODULE lib; const char *const* list; BankNamesCount adl_getBanksCount; @@ -152,11 +171,27 @@ static void buildLists(HWND hwnd) SendDlgItemMessageA(hwnd, IDC_VOLUMEMODEL, CB_ADDSTRING, (LPARAM)0, (LPARAM)volume_models_descriptions[i]); } + // Channel allocation mode + for(i = 0; channel_allocation_descriptions[i] != NULL; ++i) + { + SendDlgItemMessageA(hwnd, IDC_CHANALLOC, CB_ADDSTRING, (LPARAM)0, (LPARAM)channel_allocation_descriptions[i]); + } + // Emulators list for(i = 0; emulator_type_descriptions[i] != NULL; ++i) { SendDlgItemMessageA(hwnd, IDC_EMULATOR, CB_ADDSTRING, (LPARAM)0, (LPARAM)emulator_type_descriptions[i]); } + + // Audio devices + aMax = waveOutGetNumDevs(); + SendDlgItemMessageW(hwnd, IDC_AUDIOOUT, CB_ADDSTRING, (LPARAM)0, (WPARAM)L"[Default device]"); + for(ai = 0; ai < aMax; ++ai) + { + memset(&wavDev, 0, sizeof(wavDev)); + waveOutGetDevCapsW(ai, &wavDev, sizeof(wavDev)); + SendDlgItemMessageW(hwnd, IDC_AUDIOOUT, CB_ADDSTRING, (LPARAM)0, (WPARAM)wavDev.szPname); + } } static void syncBankType(HWND hwnd, int type) @@ -209,6 +244,18 @@ static void openCustomBank(HWND hwnd) } } +static void warnIfOutChanged(HWND hwnd) +{ + if(s_audioOutPrev != g_setup.outputDevice) + { + s_audioOutPrev = g_setup.outputDevice; + MessageBoxW(hwnd, + L"To apply the change of the audio output device, you should reload your applications.", + L"Audio output device changed", + MB_OK|MB_ICONINFORMATION); + } +} + INT_PTR CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) @@ -230,6 +277,17 @@ INT_PTR CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPar MB_OK); break; + case IDC_AUDIOOUT: + if(HIWORD(wParam) == CBN_SELCHANGE) + { + g_setup.outputDevice = SendMessageW((HWND)lParam, (UINT)CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if(g_setup.outputDevice == 0) + g_setup.outputDevice = WAVE_MAPPER; + else + g_setup.outputDevice--; + } + break; + case IDC_NUM_CHIPS: if(HIWORD(wParam) == CBN_SELCHANGE) { @@ -260,6 +318,13 @@ INT_PTR CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPar } break; + case IDC_CHANALLOC: + if(HIWORD(wParam) == CBN_SELCHANGE) + { + g_setup.chanAlloc = SendMessageW((HWND)lParam, (UINT)CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; + } + break; + case IDC_BANK_INTERNAL: g_setup.useExternalBank = 0; syncBankType(hwnd, FALSE); @@ -329,11 +394,13 @@ INT_PTR CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPar case IDC_APPLYBUTTON: saveSetup(&g_setup); sendSignal(DRV_SIGNAL_RELOAD_SETUP); + warnIfOutChanged(hwnd); break; case IDOK: saveSetup(&g_setup); sendSignal(DRV_SIGNAL_RELOAD_SETUP); + warnIfOutChanged(hwnd); EndDialog(hwnd, IDOK); break; @@ -358,6 +425,8 @@ BOOL runAdlSetupBox(HINSTANCE hModule, HWND hwnd) s_hModule = hModule; loadSetup(&g_setup); + // Keep the last audio output setup for the future + s_audioOutPrev = g_setup.outputDevice; DialogBoxW(hModule, MAKEINTRESOURCEW(IDD_CONFIG_BOX), hwnd, ToolDlgProc); |