aboutsummaryrefslogtreecommitdiff
path: root/utils/winmm_drv/cpl
diff options
context:
space:
mode:
Diffstat (limited to 'utils/winmm_drv/cpl')
-rw-r--r--utils/winmm_drv/cpl/adlconfig.rc60
-rw-r--r--utils/winmm_drv/cpl/config_dialog.c84
-rw-r--r--utils/winmm_drv/cpl/resource.h6
3 files changed, 123 insertions, 27 deletions
diff --git a/utils/winmm_drv/cpl/adlconfig.rc b/utils/winmm_drv/cpl/adlconfig.rc
index 455c906..edc5048 100644
--- a/utils/winmm_drv/cpl/adlconfig.rc
+++ b/utils/winmm_drv/cpl/adlconfig.rc
@@ -14,37 +14,43 @@
// Dialog resources
//
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-IDD_CONFIG_BOX DIALOGEX 0, 0, 251, 244
+IDD_CONFIG_BOX DIALOGEX 0, 0, 247, 307
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU
CAPTION "libADLMIDI settings"
FONT 8, "MS Shell Dlg", 400, 0, 1
BEGIN
- GROUPBOX "Instruments bank", IDC_INS_BANK, 9, 4, 233, 51, 0, WS_EX_LEFT
- AUTORADIOBUTTON "Internal bank", IDC_BANK_INTERNAL, 15, 17, 63, 8, WS_GROUP | WS_TABSTOP, WS_EX_LEFT
- COMBOBOX IDC_BANK_ID, 83, 14, 155, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
- AUTORADIOBUTTON "External bank", IDC_BANK_EXTERNAL, 15, 33, 63, 8, WS_TABSTOP, WS_EX_LEFT
- EDITTEXT IDC_BANK_PATH, 83, 31, 107, 14, WS_DISABLED | ES_AUTOHSCROLL, WS_EX_LEFT
- PUSHBUTTON "Browse...", IDC_BROWSE_BANK, 194, 30, 45, 14, 0, WS_EX_LEFT
- LTEXT "Chip emulator type:", IDC_CHIPEMU_LABEL, 11, 60, 67, 10, SS_LEFT, WS_EX_LEFT
- COMBOBOX IDC_EMULATOR, 83, 58, 159, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
- LTEXT "Number of chips", IDC_CHIPNUM_LABEL, 11, 78, 67, 8, SS_LEFT, WS_EX_LEFT
- COMBOBOX IDC_NUM_CHIPS, 83, 76, 34, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
- LTEXT "Number of 4OP voices", IDC_4OPSNUM_LABEL, 128, 78, 72, 8, SS_LEFT, WS_EX_LEFT
- COMBOBOX IDC_NUM_4OPVO, 202, 76, 40, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
- LTEXT "Volume model:", IDC_VM_LABEL, 11, 95, 67, 13, SS_LEFT, WS_EX_LEFT
- COMBOBOX IDC_VOLUMEMODEL, 83, 95, 159, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
- AUTOCHECKBOX "Full-panning stereo", IDC_FLAG_SOFTPAN, 11, 115, 227, 10, 0, WS_EX_LEFT
- AUTO3STATE "Deep tremolo (Auto/Enable/Disable)", IDC_FLAG_TREMOLO, 11, 130, 227, 10, NOT WS_TABSTOP, WS_EX_LEFT
- AUTO3STATE "Deep vibrato (Auto/Enable/Disable)", IDC_FLAG_VIBRATO, 11, 145, 227, 10, NOT WS_TABSTOP, WS_EX_LEFT
- AUTOCHECKBOX "Scalable modulation", IDC_FLAG_SCALE, 11, 160, 227, 10, 0, WS_EX_LEFT
- AUTOCHECKBOX "Full-range brightness (CC74)", IDC_FLAG_FULLBRIGHT, 11, 175, 227, 10, 0, WS_EX_LEFT
- PUSHBUTTON "Reset synth now", IDC_RESET_SYNTH, 73, 195, 80, 14, 0, WS_EX_LEFT
- PUSHBUTTON "Restore defaults", IDC_RESTORE_DEFAULTS, 155, 195, 88, 14, 0, WS_EX_LEFT
- PUSHBUTTON "About...", IDC_ABOUT, 10, 212, 50, 14, 0, WS_EX_LEFT
- DEFPUSHBUTTON "OK", IDOK, 88, 212, 50, 14, 0, WS_EX_LEFT
- PUSHBUTTON "Cancel", IDCANCEL, 141, 212, 50, 14, 0, WS_EX_LEFT
- PUSHBUTTON "Apply", IDC_APPLYBUTTON, 194, 212, 50, 14, 0, WS_EX_LEFT
- RTEXT "Settings will be applied immediately", IDC_BOTTOMNOTE_LABEL, 7, 227, 235, 8, SS_RIGHT, WS_EX_LEFT
+ COMBOBOX IDC_AUDIOOUT, 81, 7, 160, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
+ CONTROL "", IDC_GAIN, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_BOTH, 84, 21, 155, 20, WS_EX_LEFT
+ AUTORADIOBUTTON "Internal bank", IDC_BANK_INTERNAL, 13, 61, 63, 8, WS_GROUP | WS_TABSTOP, WS_EX_LEFT
+ COMBOBOX IDC_BANK_ID, 81, 58, 155, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
+ AUTORADIOBUTTON "External bank", IDC_BANK_EXTERNAL, 13, 77, 63, 8, WS_TABSTOP, WS_EX_LEFT
+ EDITTEXT IDC_BANK_PATH, 81, 75, 107, 14, WS_DISABLED | ES_AUTOHSCROLL, WS_EX_LEFT
+ PUSHBUTTON "Browse...", IDC_BROWSE_BANK, 192, 74, 45, 14, 0, WS_EX_LEFT
+ COMBOBOX IDC_EMULATOR, 81, 103, 160, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
+ COMBOBOX IDC_NUM_CHIPS, 81, 121, 34, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
+ COMBOBOX IDC_NUM_4OPVO, 201, 121, 40, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
+ COMBOBOX IDC_VOLUMEMODEL, 81, 140, 160, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_LEFT
+ COMBOBOX IDC_CHANALLOC, 81, 159, 160, 200, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_LEFT
+ AUTOCHECKBOX "Full-panning stereo", IDC_FLAG_SOFTPAN, 8, 180, 227, 10, 0, WS_EX_LEFT
+ AUTO3STATE "Deep tremolo (Auto/Enable/Disable)", IDC_FLAG_TREMOLO, 8, 195, 227, 10, 0, WS_EX_LEFT
+ AUTO3STATE "Deep vibrato (Auto/Enable/Disable)", IDC_FLAG_VIBRATO, 8, 210, 227, 10, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Scalable modulation", IDC_FLAG_SCALE, 8, 225, 227, 10, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Full-range brightness (CC74)", IDC_FLAG_FULLBRIGHT, 8, 240, 227, 10, 0, WS_EX_LEFT
+ PUSHBUTTON "About...", IDC_ABOUT, 6, 260, 50, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Reset synth now", IDC_RESET_SYNTH, 71, 260, 80, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Restore defaults", IDC_RESTORE_DEFAULTS, 153, 260, 88, 14, 0, WS_EX_LEFT
+ DEFPUSHBUTTON "OK", IDOK, 85, 277, 50, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Cancel", IDCANCEL, 138, 277, 50, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Apply", IDC_APPLYBUTTON, 191, 277, 50, 14, 0, WS_EX_LEFT
+ GROUPBOX "Instruments bank", IDC_INS_BANK, 7, 48, 233, 51, 0, WS_EX_LEFT
+ LTEXT "Chip emulator type:", IDC_CHIPEMU_LABEL, 9, 105, 67, 10, SS_LEFT, WS_EX_LEFT
+ LTEXT "Number of chips", IDC_CHIPNUM_LABEL, 9, 123, 67, 8, SS_LEFT, WS_EX_LEFT
+ LTEXT "Number of 4OP voices", IDC_4OPSNUM_LABEL, 126, 123, 72, 8, SS_LEFT, WS_EX_LEFT
+ LTEXT "Volume model:", IDC_VM_LABEL, 9, 142, 67, 8, SS_LEFT, WS_EX_LEFT
+ RTEXT "Settings will be applied immediately", IDC_BOTTOMNOTE_LABEL, 4, 292, 235, 8, SS_RIGHT, WS_EX_LEFT
+ LTEXT "Channels allocation:", IDC_CA_LABEL, 9, 161, 64, 8, SS_LEFT, WS_EX_LEFT
+ LTEXT "Audio output:", IDC_AUDIOOUT_LABEL, 11, 9, 65, 8, SS_LEFT, WS_EX_LEFT
+ LTEXT "Output gain:", IDC_GAIN_LABEL, 11, 29, 65, 8, SS_LEFT, WS_EX_LEFT
END
diff --git a/utils/winmm_drv/cpl/config_dialog.c b/utils/winmm_drv/cpl/config_dialog.c
index 195524d..1742ab1 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);
@@ -88,6 +99,11 @@ static void syncWidget(HWND hwnd)
else
SendDlgItemMessage(hwnd, IDC_BANK_INTERNAL, BM_SETCHECK, 1, 0);
+ SendDlgItemMessage(hwnd, IDC_GAIN, TBM_SETRANGE, TRUE, MAKELPARAM(0, 1000));
+ SendDlgItemMessage(hwnd, IDC_GAIN, TBM_SETPAGESIZE, 0, 10);
+ SendDlgItemMessage(hwnd, IDC_GAIN, TBM_SETTICFREQ, 100, 0);
+ SendDlgItemMessage(hwnd, IDC_GAIN, TBM_SETPOS, TRUE, g_setup.gain100);
+
syncBankType(hwnd, g_setup.useExternalBank);
SendDlgItemMessage(hwnd, IDC_FLAG_TREMOLO, BM_SETCHECK, g_setup.flagDeepTremolo, 0);
@@ -109,6 +125,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 +138,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 +176,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 +249,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)
@@ -218,6 +270,16 @@ INT_PTR CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPar
syncWidget(hwnd);
return TRUE;
+ case WM_HSCROLL:
+ if(lParam == (LPARAM)GetDlgItem(hwnd, IDC_GAIN))
+ {
+ g_setup.gain100 = SendMessageW((HWND)lParam, (UINT)TBM_GETPOS, (WPARAM)0, (LPARAM)0);
+ saveGain(&g_setup);
+ sendSignal(DRV_SIGNAL_UPDATE_GAIN);
+ break;
+ }
+ break;
+
case WM_COMMAND:
switch(LOWORD(wParam))
{
@@ -230,6 +292,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 +333,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 +409,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 +440,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);
diff --git a/utils/winmm_drv/cpl/resource.h b/utils/winmm_drv/cpl/resource.h
index 4d41e9f..78461c5 100644
--- a/utils/winmm_drv/cpl/resource.h
+++ b/utils/winmm_drv/cpl/resource.h
@@ -28,5 +28,11 @@
#define IDC_4OPSNUM_LABEL 1025
#define IDC_RESET_SYNTH 1026
#define IDC_BOTTOMNOTE_LABEL 1027
+#define IDC_CHANALLOC 1028
+#define IDC_CA_LABEL 1029
+#define IDC_AUDIOOUT 1030
+#define IDC_AUDIOOUT_LABEL 1031
+#define IDC_GAIN 1032
+#define IDC_GAIN_LABEL 1033
#define IDC_DRIVERNAME 40000
#define IDC_DRIVERDESC 40001