From 13ff9af7e13bb23b720cf4541fb2e3cad0af9ac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Thu, 26 Aug 2021 20:30:37 +0200 Subject: [PATCH 01/75] Add support for overridable VM name - A global variable added as vm_name - This variable can be filled with the `--vmname "Name"` or `-V "Name"` parameter. - If there are no such a parameter definied this variable will filled up with the directory name. - The Discord module displays this global variable, as VM name. - Various 86Box managers can use this feature to display fancy VM names, instead of GUID folder names. - This variable can be easily used later for adding cool things, like the VM name in title bar, etc. --- src/86box.c | 21 +++++++++++++++++++++ src/include/86box/86box.h | 1 + src/win/win_discord.c | 8 +++----- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/86box.c b/src/86box.c index 0a5c59258..7611732b6 100644 --- a/src/86box.c +++ b/src/86box.c @@ -110,6 +110,7 @@ uint64_t unique_id = 0; uint64_t source_hwnd = 0; #endif char log_path[1024] = { '\0'}; /* (O) full path of logfile */ +char vm_name[1024] = { '\0'}; /* (O) display name of the VM */ /* Configuration values. */ int window_w; /* (C) window size and */ @@ -417,6 +418,7 @@ usage: printf("-F or --fullscreen - start in fullscreen mode\n"); printf("-L or --logfile path - set 'path' to be the logfile\n"); printf("-P or --vmpath path - set 'path' to be root for vm\n"); + printf("-V or --vmname name - overrides the name of the running VM.\n"); printf("-S or --settings - show only the settings dialog\n"); printf("-N or --noconfirm - do not ask for confirmation on quit\n"); #ifdef _WIN32 @@ -446,6 +448,11 @@ usage: if ((c+1) == argc) goto usage; strcpy(path, argv[++c]); + } else if (!strcasecmp(argv[c], "--vmname") || + !strcasecmp(argv[c], "-V")) { + if ((c+1) == argc) goto usage; + + strcpy(vm_name, argv[++c]); } else if (!strcasecmp(argv[c], "--settings") || !strcasecmp(argv[c], "-S")) { settings_only = 1; @@ -551,6 +558,20 @@ usage: /* At this point, we can safely create the full path name. */ plat_append_filename(cfg_path, usr_path, p); + /* + * Get the current directory's name + * + * At this point usr_path is perfectly initialized. + * If no --vmname parameter specified we'll use the + * working directory name as the VM's name. + */ + if (strlen(vm_name) == 0) + { + plat_get_dirname(vm_name, usr_path); + p = plat_get_filename(vm_name); + strcpy(vm_name, p); + } + /* * This is where we start outputting to the log file, * if there is one. Create a little info header first. diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 5879a632e..20738ab6b 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -73,6 +73,7 @@ extern uint64_t unique_id; extern uint64_t source_hwnd; #endif extern char log_path[1024]; /* (O) full path of logfile */ +extern char vm_name[1024]; /* (O) display name of the VM */ extern int window_w, window_h, /* (C) window size and */ diff --git a/src/win/win_discord.c b/src/win/win_discord.c index 73d15855d..61b300341 100644 --- a/src/win/win_discord.c +++ b/src/win/win_discord.c @@ -68,7 +68,7 @@ void discord_update_activity(int paused) { struct DiscordActivity activity; - char config_name[1024], cpufamily[1024]; + char cpufamily[1024]; char *paren; if(discord_activities == NULL) @@ -78,16 +78,14 @@ discord_update_activity(int paused) memset(&activity, 0x00, sizeof(activity)); - plat_get_dirname(config_name, usr_path); - strncpy(cpufamily, cpu_f->name, sizeof(cpufamily) - 1); paren = strchr(cpufamily, '('); if (paren) *(paren - 1) = '\0'; - if (strlen(plat_get_filename(config_name)) < 100) + if (strlen(vm_name) < 100) { - sprintf_s(activity.details, sizeof(activity.details), "Running \"%s\"", plat_get_filename(config_name)); + sprintf_s(activity.details, sizeof(activity.details), "Running \"%s\"", vm_name); sprintf_s(activity.state, sizeof(activity.state), "%s (%s/%s)", strchr(machine_getname(), ']') + 2, cpufamily, cpu_s->name); } else From 2634909dbd77979ed28db53145b802baf00b130a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Thu, 26 Aug 2021 21:49:25 +0200 Subject: [PATCH 02/75] Fix to avoid undefined behavior at strcpy - Using the `path` buffer to store the directory name, the possible overlapping areas can be avoided at strcpy. - The `path` buffer is unused in further parts of this function, so can be used freely here. The `temp` buffer is too small for this task. --- src/86box.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/86box.c b/src/86box.c index 7611732b6..3f5e897e0 100644 --- a/src/86box.c +++ b/src/86box.c @@ -564,11 +564,14 @@ usage: * At this point usr_path is perfectly initialized. * If no --vmname parameter specified we'll use the * working directory name as the VM's name. + * The directory name will stored in local buffer + * named `path` since it's unused in further parts + * of this function. */ if (strlen(vm_name) == 0) { - plat_get_dirname(vm_name, usr_path); - p = plat_get_filename(vm_name); + plat_get_dirname(path, usr_path); + p = plat_get_filename(path); strcpy(vm_name, p); } From 1980155e34a75d1ca70c4b28104d9e10e7931a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Fri, 27 Aug 2021 09:02:31 +0200 Subject: [PATCH 03/75] Fix to avoid repurposing variables --- src/86box.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/86box.c b/src/86box.c index 3f5e897e0..155c5925a 100644 --- a/src/86box.c +++ b/src/86box.c @@ -564,15 +564,12 @@ usage: * At this point usr_path is perfectly initialized. * If no --vmname parameter specified we'll use the * working directory name as the VM's name. - * The directory name will stored in local buffer - * named `path` since it's unused in further parts - * of this function. */ if (strlen(vm_name) == 0) { - plat_get_dirname(path, usr_path); - p = plat_get_filename(path); - strcpy(vm_name, p); + char ltemp[1024] = {'/0'}; + plat_get_dirname(ltemp, usr_path); + strcpy(vm_name, plat_get_filename(ltemp)); } /* From 3da83e3ffee0efc83676bd8410a48924a4344402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Fri, 27 Aug 2021 09:09:46 +0200 Subject: [PATCH 04/75] Fix a typo in initialization of `ltemp` --- src/86box.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index 155c5925a..452e9b448 100644 --- a/src/86box.c +++ b/src/86box.c @@ -567,7 +567,7 @@ usage: */ if (strlen(vm_name) == 0) { - char ltemp[1024] = {'/0'}; + char ltemp[1024] = { '\0'}; plat_get_dirname(ltemp, usr_path); strcpy(vm_name, plat_get_filename(ltemp)); } From 09ff45c394b039bdc7aa674bfd40e87f53264d04 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 29 Aug 2021 13:34:51 +0200 Subject: [PATCH 05/75] LDS, LSS, LES, LFS, and LGS instructions now perform segment limit and present bit checks. --- src/cpu/x86_ops_mov_seg.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/cpu/x86_ops_mov_seg.h b/src/cpu/x86_ops_mov_seg.h index da7727143..02a74eb9c 100644 --- a/src/cpu/x86_ops_mov_seg.h +++ b/src/cpu/x86_ops_mov_seg.h @@ -231,6 +231,7 @@ static int opLDS_w_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state. eaaddr + 3); addr = readmemw(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ds); if (cpu_state.abrt) return 1; @@ -247,6 +248,7 @@ static int opLDS_w_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state. eaaddr + 3); addr = readmemw(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ds); if (cpu_state.abrt) return 1; @@ -264,6 +266,7 @@ static int opLDS_l_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state. eaaddr + 5); addr = readmeml(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ds); if (cpu_state.abrt) return 1; @@ -281,6 +284,7 @@ static int opLDS_l_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state. eaaddr + 5); addr = readmeml(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ds); if (cpu_state.abrt) return 1; @@ -298,6 +302,7 @@ static int opLSS_w_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); addr = readmemw(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ss); if (cpu_state.abrt) return 1; @@ -314,6 +319,7 @@ static int opLSS_w_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); addr = readmemw(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ss); if (cpu_state.abrt) return 1; @@ -331,6 +337,7 @@ static int opLSS_l_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); addr = readmeml(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ss); if (cpu_state.abrt) return 1; @@ -348,6 +355,7 @@ static int opLSS_l_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); addr = readmeml(easeg, cpu_state.eaaddr); seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; loadseg(seg, &cpu_state.seg_ss); if (cpu_state.abrt) return 1; @@ -366,6 +374,7 @@ static int opLSS_l_a32(uint32_t fetchdat) fetch_ea_16(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); \ addr = readmemw(easeg, cpu_state.eaaddr); \ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; \ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \ @@ -383,6 +392,7 @@ static int opLSS_l_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); \ addr = readmemw(easeg, cpu_state.eaaddr); \ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; \ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \ @@ -401,6 +411,7 @@ static int opLSS_l_a32(uint32_t fetchdat) fetch_ea_16(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); \ addr = readmeml(easeg, cpu_state.eaaddr); \ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; \ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \ @@ -419,6 +430,7 @@ static int opLSS_l_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); \ addr = readmeml(easeg, cpu_state.eaaddr); \ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; \ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \ From 64aee0481cd139886db411fa11e9e05705bceef0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 29 Aug 2021 13:59:05 +0200 Subject: [PATCH 06/75] Removed the non-working keyboard hook, and with it, the NOHOOK make parameter. --- src/win/Makefile.mingw | 51 ++++++++++++++--------- src/win/win_ui.c | 92 ------------------------------------------ 2 files changed, 31 insertions(+), 112 deletions(-) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index b0ca0ad57..5fe5790b0 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -297,22 +297,39 @@ TOOL_PREFIX := x86_64-w64-mingw32- else TOOL_PREFIX := i686-w64-mingw32- endif -CPP := ${TOOL_PREFIX}g++ -CC := ${TOOL_PREFIX}gcc WINDRES := windres STRIP := strip ifeq ($(ARM64), y) -CPP := aarch64-w64-mingw32-g++ -CC := aarch64-w64-mingw32-gcc WINDRES := aarch64-w64-mingw32-windres STRIP := aarch64-w64-mingw32-strip endif ifeq ($(ARM), y) -CPP := armv7-w64-mingw32-g++ -CC := armv7-w64-mingw32-gcc WINDRES := armv7-w64-mingw32-windres STRIP := armv7-w64-mingw32-strip endif +ifeq ($(CLANG), y) +CPP := clang++ +CC := clang +ifeq ($(ARM64), y) +CPP := aarch64-w64-mingw32-clang++ +CC := aarch64-w64-mingw32-clang +endif +ifeq ($(ARM), y) +CPP := armv7-w64-mingw32-clang++ +CC := armv7-w64-mingw32-clang +endif +else +CPP := ${TOOL_PREFIX}g++ +CC := ${TOOL_PREFIX}gcc +ifeq ($(ARM64), y) +CPP := aarch64-w64-mingw32-g++ +CC := aarch64-w64-mingw32-gcc +endif +ifeq ($(ARM), y) +CPP := armv7-w64-mingw32-g++ +CC := armv7-w64-mingw32-gcc +endif +endif DEPS = -MMD -MF $*.d -c $< DEPFILE := win/.depends @@ -326,15 +343,11 @@ endif ifdef EXINC OPTS += -I$(EXINC) endif -ifeq ($(X64), y) - ifeq ($(OPTIM), y) - DFLAGS := -march=native - else - DFLAGS := - endif +ifeq ($(OPTIM), y) + DFLAGS := -march=native else - ifeq ($(OPTIM), y) - DFLAGS := -march=native + ifeq ($(X64), y) + DFLAGS := else DFLAGS := -march=i686 endif @@ -378,10 +391,6 @@ ifeq ($(VRAMDUMP), y) OPTS += -DENABLE_VRAM_DUMP RFLAGS += -DENABLE_VRAM_DUMP endif -ifeq ($(NOHOOK), y) -OPTS += -DNO_KEYBOARD_HOOK -RFLAGS += -DNO_KEYBOARD_HOOK -endif # Optional modules. @@ -829,7 +838,7 @@ LIBS += -static ifeq ($(AUTODEP), y) %.o: %.c @echo $< - @$(CC) $(CFLAGS) $(DEPS) -c $< + $(CC) $(CFLAGS) $(DEPS) -c $< %.o: %.cc @echo $< @@ -866,7 +875,9 @@ endif # Suppress false positive warnings in vid_voodoo_codegen_x86[-64].h # that cause ~3000 lines to be output into the logs each time. -$(VOODOOOBJ): CFLAGS += -Wstringop-overflow=0 +ifneq ($(CLANG), y) + $(VOODOOOBJ): CFLAGS += -Wstringop-overflow=0 +endif all: $(PROG).exe diff --git a/src/win/win_ui.c b/src/win/win_ui.c index e83260d45..a7cf7be8f 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -76,10 +76,6 @@ extern WCHAR wopenfilestring[512]; /* Local data. */ static wchar_t wTitle[512]; -#ifndef NO_KEYBOARD_HOOK -static HHOOK hKeyboardHook; -static int hook_enabled = 0; -#endif static int manager_wm = 0; static int save_window_pos = 0, pause_state = 0; static int dpi = 96; @@ -399,42 +395,6 @@ ResetAllMenus(void) } -#ifndef NO_KEYBOARD_HOOK -static LRESULT CALLBACK -LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) -{ - BOOL bControlKeyDown; - KBDLLHOOKSTRUCT *p; - - if (nCode < 0 || nCode != HC_ACTION || - (!mouse_capture && !video_fullscreen) || (kbd_req_capture && !mouse_capture && !video_fullscreen)) - return(CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)); - - p = (KBDLLHOOKSTRUCT*)lParam; - - /* disable alt-tab */ - if (p->vkCode == VK_TAB && p->flags & LLKHF_ALTDOWN) return(1); - - /* disable alt-space */ - if (p->vkCode == VK_SPACE && p->flags & LLKHF_ALTDOWN) return(1); - - /* disable alt-escape */ - if (p->vkCode == VK_ESCAPE && p->flags & LLKHF_ALTDOWN) return(1); - - /* disable windows keys */ - if((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)) return(1); - - /* checks ctrl key pressed */ - bControlKeyDown = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT)*8)-1); - - /* disable ctrl-escape */ - if (p->vkCode == VK_ESCAPE && bControlKeyDown) return(1); - - return(CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)); -} -#endif - - void win_notify_dlg_open(void) { @@ -467,10 +427,6 @@ plat_power_off(void) run before the main thread is terminated */ cycles -= 99999999; -#ifndef NO_KEYBOARD_HOOK - UnhookWindowsHookEx(hKeyboardHook); -#endif - KillTimer(hwndMain, TIMER_1SEC); PostQuitMessage(0); @@ -532,26 +488,11 @@ input_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_SETFOCUS: infocus = 1; -#ifndef NO_KEYBOARD_HOOK - if (! hook_enabled) { - hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, - LowLevelKeyboardProc, - GetModuleHandle(NULL), - 0); - hook_enabled = 1; - } -#endif break; case WM_KILLFOCUS: infocus = 0; plat_mouse_capture(0); -#ifndef NO_KEYBOARD_HOOK - if (hook_enabled) { - UnhookWindowsHookEx(hKeyboardHook); - hook_enabled = 0; - } -#endif break; case WM_LBUTTONDOWN: @@ -597,12 +538,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message) { case WM_CREATE: SetTimer(hwnd, TIMER_1SEC, 1000, NULL); -#ifndef NO_KEYBOARD_HOOK - hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, - LowLevelKeyboardProc, - GetModuleHandle(NULL), 0); - hook_enabled = 1; -#endif break; case WM_COMMAND: @@ -654,9 +589,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) nvr_save(); config_save(); } -#ifndef NO_KEYBOARD_HOOK - UnhookWindowsHookEx(hKeyboardHook); -#endif KillTimer(hwnd, TIMER_1SEC); PostQuitMessage(0); } @@ -1125,9 +1057,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) nvr_save(); config_save(); } -#ifndef NO_KEYBOARD_HOOK - UnhookWindowsHookEx(hKeyboardHook); -#endif KillTimer(hwnd, TIMER_1SEC); PostQuitMessage(0); } @@ -1135,9 +1064,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_DESTROY: -#ifndef NO_KEYBOARD_HOOK - UnhookWindowsHookEx(hKeyboardHook); -#endif KillTimer(hwnd, TIMER_1SEC); PostQuitMessage(0); break; @@ -1192,9 +1118,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) nvr_save(); config_save(); } -#ifndef NO_KEYBOARD_HOOK - UnhookWindowsHookEx(hKeyboardHook); -#endif KillTimer(hwnd, TIMER_1SEC); PostQuitMessage(0); } @@ -1224,26 +1147,11 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_SETFOCUS: infocus = 1; -#ifndef NO_KEYBOARD_HOOK - if (! hook_enabled) { - hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, - LowLevelKeyboardProc, - GetModuleHandle(NULL), - 0); - hook_enabled = 1; - } -#endif break; case WM_KILLFOCUS: infocus = 0; plat_mouse_capture(0); -#ifndef NO_KEYBOARD_HOOK - if (hook_enabled) { - UnhookWindowsHookEx(hKeyboardHook); - hook_enabled = 0; - } -#endif break; case WM_ACTIVATE: From fbf93a6d3222221d5b467a64452605bbb67c38cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 29 Aug 2021 15:04:05 +0200 Subject: [PATCH 07/75] cmake: add presets equivalent to the makefile --- CMakeLists.txt | 2 +- CMakePresets.json | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 CMakePresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 410db2af8..638cc2212 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ # Copyright 2020,2021 David Hrdlička. # -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.15) cmake_policy(SET CMP0091 NEW) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 000000000..b0261cd64 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,68 @@ +{ + "version": 3, + "cmakeMinimumRequired": { + "major": 3, + "minor": 21, + "patch": 0 + }, + "configurePresets": [ + { + "name": "flags-base", + "cacheVariables": { + "CMAKE_C_FLAGS": "-msse2 -mfpmath=sse -fomit-frame-pointer -mstackrealign -Wall -fno-strict-aliasing", + "CMAKE_CXX_FLAGS": "-msse2 -mfpmath=sse -fomit-frame-pointer -mstackrealign -Wall -fno-strict-aliasing", + "CMAKE_C_FLAGS_RELEASE": "-g0 -O3", + "CMAKE_CXX_FLAGS_RELEASE": "-g0 -O3", + "CMAKE_C_FLAGS_DEBUG": "-ggdb -Og", + "CMAKE_CXX_FLAGS_DEBUG": "-ggdb -Og", + "CMAKE_C_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=last -flto", + "CMAKE_CXX_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=last -flto" + }, + "hidden": true + }, + { + "name": "regular", + "inherits": [ + "flags-base" + ], + "generator": "Ninja", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "DEV_BRANCH": "OFF" + } + }, + { + "name": "optimized", + "inherits": [ + "flags-base" + ], + "generator": "Ninja", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Optimized", + "DEV_BRANCH": "OFF" + } + }, + { + "name": "debug", + "inherits": [ + "flags-base" + ], + "generator": "Ninja", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "DEV_BRANCH": "OFF" + } + }, + { + "name": "experimental", + "inherits": [ + "flags-base" + ], + "generator": "Ninja", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "DEV_BRANCH": "ON" + } + } + ] +} \ No newline at end of file From 98c344729d35079c7738ffc9ab6ccfca3f16775e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 29 Aug 2021 15:17:18 +0200 Subject: [PATCH 08/75] ignore CMakeUserPresets.json --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5c05ee308..968c8d4bc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ src/NUL src/nvr/ src/roms/ /.vs +/CMakeUserPresets.json \ No newline at end of file From df93b11d454d92231407204a25c179595f1d2da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 29 Aug 2021 15:22:19 +0200 Subject: [PATCH 09/75] cmake: actually add the Optimized build type --- CMakePresets.json | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakePresets.json b/CMakePresets.json index b0261cd64..89e6db4f3 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -9,6 +9,7 @@ { "name": "flags-base", "cacheVariables": { + "CMAKE_CONFIGURATION_TYPES": "Debug;Release;Optimized", "CMAKE_C_FLAGS": "-msse2 -mfpmath=sse -fomit-frame-pointer -mstackrealign -Wall -fno-strict-aliasing", "CMAKE_CXX_FLAGS": "-msse2 -mfpmath=sse -fomit-frame-pointer -mstackrealign -Wall -fno-strict-aliasing", "CMAKE_C_FLAGS_RELEASE": "-g0 -O3", From edce4dca1892a96bae2221edbbee9fde69572652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 29 Aug 2021 15:28:23 +0200 Subject: [PATCH 10/75] cmake: experimental preset should use new dynarec --- CMakePresets.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 89e6db4f3..8fc5f21a1 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -29,7 +29,8 @@ "generator": "Ninja", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", - "DEV_BRANCH": "OFF" + "DEV_BRANCH": "OFF", + "NEW_DYNAREC": "OFF" } }, { @@ -40,7 +41,8 @@ "generator": "Ninja", "cacheVariables": { "CMAKE_BUILD_TYPE": "Optimized", - "DEV_BRANCH": "OFF" + "DEV_BRANCH": "OFF", + "NEW_DYNAREC": "OFF" } }, { @@ -51,7 +53,8 @@ "generator": "Ninja", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", - "DEV_BRANCH": "OFF" + "DEV_BRANCH": "OFF", + "NEW_DYNAREC": "OFF" } }, { @@ -62,7 +65,8 @@ "generator": "Ninja", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", - "DEV_BRANCH": "ON" + "DEV_BRANCH": "ON", + "NEW_DYNAREC": "ON" } } ] From 48e9165b13e237cead98ffffbe7382e123d927bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 29 Aug 2021 15:36:47 +0200 Subject: [PATCH 11/75] workflows: use the new presets --- .github/workflows/cmake.yml | 42 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 0b585ef14..7ff2216da 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -6,6 +6,7 @@ on: paths: - src/** - "**/CMakeLists.txt" + - "CMakePresets.json" - .github/workflows/cmake.yml - vcpkg.json - "!**/Makefile*" @@ -14,6 +15,7 @@ on: paths: - src/** - "**/CMakeLists.txt" + - "CMakePresets.json" - .github/workflows/** - .github/workflows/cmake.yml - vcpkg.json @@ -21,7 +23,7 @@ on: jobs: mingw: - name: MSYS2 ${{ matrix.build.name }} build (${{ matrix.target-arch.msystem }}) + name: MSYS2 ${{ matrix.build.name }} build (${{ matrix.environment.msystem }}) runs-on: windows-latest @@ -33,15 +35,13 @@ jobs: fail-fast: false matrix: build: + - name: Regular + preset: regular - name: Debug - dev-build: off - new-dynarec: off - type: Debug + preset: debug - name: Dev - dev-build: on - new-dynarec: on - type: Debug - target-arch: + preset: experimental + environment: - msystem: MINGW32 prefix: mingw-w64-i686 - msystem: MINGW64 @@ -56,30 +56,28 @@ jobs: with: path-type: inherit update: true - msystem: ${{ matrix.target-arch.msystem }} + msystem: ${{ matrix.environment.msystem }} install: >- - ${{ matrix.target-arch.prefix }}-toolchain - ${{ matrix.target-arch.prefix }}-openal - ${{ matrix.target-arch.prefix }}-freetype - ${{ matrix.target-arch.prefix }}-SDL2 - ${{ matrix.target-arch.prefix }}-zlib - ${{ matrix.target-arch.prefix }}-libpng - ${{ matrix.target-arch.prefix }}-libvncserver + ${{ matrix.environment.prefix }}-ninja + ${{ matrix.environment.prefix }}-toolchain + ${{ matrix.environment.prefix }}-openal + ${{ matrix.environment.prefix }}-freetype + ${{ matrix.environment.prefix }}-SDL2 + ${{ matrix.environment.prefix }}-zlib + ${{ matrix.environment.prefix }}-libpng + ${{ matrix.environment.prefix }}-libvncserver - uses: actions/checkout@v2 - name: Configure CMake run: >- cmake -S . -B build - -G "MSYS Makefiles" + --preset ${{ matrix.build.preset }} -D CMAKE_INSTALL_PREFIX=./build/artifacts - -D CMAKE_BUILD_TYPE=${{ env.build.type }} - -D DEV_BRANCH=${{ matrix.build.dev-build }} - -D NEW_DYNAREC=${{ matrix.build.new-dynarec }} -D VNC=OFF - name: Build run: cmake --build build --target install - uses: actions/upload-artifact@v2 with: - name: '86Box-MSYS2-${{ matrix.target-arch.msystem }}-${{ matrix.build.name }}-${{ github.sha }}' + name: '86Box-${{ matrix.build.name }}-MSYS2-${{ matrix.environment.msystem }}-${{ github.sha }}' path: build/artifacts/bin/** vs2019: @@ -125,5 +123,5 @@ jobs: run: cmake --build build --config ${{ matrix.build.type }} --target install - uses: actions/upload-artifact@v2 with: - name: '86Box-VS2019-${{ matrix.build.name }}-${{ matrix.target-arch }}-${{ matrix.toolset }}-${{ github.sha }}' + name: '86Box-${{ matrix.build.name }}-VS2019-${{ matrix.target-arch }}-${{ matrix.toolset }}-${{ github.sha }}' path: build/artifacts/bin/** From a0c8f9aa9e33e1da4b3d7cf83fb3f5f58c25b49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 29 Aug 2021 15:51:17 +0200 Subject: [PATCH 12/75] workflows: add clang/mingw build --- .github/workflows/c-cpp.yml | 38 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 5ab4f0117..36b9010e3 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -16,7 +16,7 @@ on: jobs: build: - name: ${{ matrix.build-target.msystem }} makefile build (DEV_BUILD=${{ matrix.dev-build }}, NEW_DYNAREC=${{ matrix.new-dynarec }}) + name: ${{ matrix.environment.msystem }} makefile build (DEV_BUILD=${{ matrix.dev-build }}, NEW_DYNAREC=${{ matrix.new-dynarec }}, CLANG=${{ matrix.clang }}) runs-on: windows-latest @@ -24,50 +24,40 @@ jobs: run: shell: msys2 {0} - continue-on-error: ${{ matrix.build-target.continue-on-error }} - strategy: fail-fast: false matrix: dev-build: ['y', 'n'] new-dynarec: ['y', 'n'] - build-target: + clang: ['y', 'n'] + environment: - msystem: MINGW32 prefix: mingw-w64-i686 x64: n - clang: n - continue-on-error: false - msystem: MINGW64 prefix: mingw-w64-x86_64 x64: y - clang: n - continue-on-error: false - msystem: UCRT64 prefix: mingw-w64-ucrt-x86_64 x64: y - clang: n - continue-on-error: false -# - msystem: CLANG64 -# prefix: mingw-w64-clang-x86_64 -# x64: y -# clang: y -# continue-on-error: true steps: - uses: msys2/setup-msys2@v2 with: update: true - msystem: ${{ matrix.build-target.msystem }} + msystem: ${{ matrix.environment.msystem }} install: >- make - ${{ matrix.build-target.prefix }}-toolchain - ${{ matrix.build-target.prefix }}-openal - ${{ matrix.build-target.prefix }}-freetype - ${{ matrix.build-target.prefix }}-SDL2 - ${{ matrix.build-target.prefix }}-zlib - ${{ matrix.build-target.prefix }}-libpng - ${{ matrix.build-target.prefix }}-libvncserver + ${{ matrix.environment.prefix }}-gcc + ${{ matrix.environment.prefix }}-clang + ${{ matrix.environment.prefix }}-pkg-config + ${{ matrix.environment.prefix }}-openal + ${{ matrix.environment.prefix }}-freetype + ${{ matrix.environment.prefix }}-SDL2 + ${{ matrix.environment.prefix }}-zlib + ${{ matrix.environment.prefix }}-libpng + ${{ matrix.environment.prefix }}-libvncserver - uses: actions/checkout@v2 - name: make - run: make -fwin/makefile.mingw -j DEV_BUILD=${{ matrix.dev-build }} NEW_DYNAREC=${{ matrix.new-dynarec }} X64=${{ matrix.build-target.x64 }} CLANG=${{ matrix.build-target.clang }} VNC=n + run: make -fwin/makefile.mingw -j DEV_BUILD=${{ matrix.dev-build }} NEW_DYNAREC=${{ matrix.new-dynarec }} X64=${{ matrix.environment.x64 }} CLANG=${{ matrix.clang }} VNC=n working-directory: ./src From 1b93e8e98964f64df12009a9ce3d48feaa893536 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 22 Aug 2021 16:32:52 +0600 Subject: [PATCH 13/75] Initial Linux/Unix code --- .gitignore | 4 +- src/CMakeLists.txt | 7 +- src/include/86box/unix_sdl.h | 12 + src/network/slirp/CMakeLists.txt | 6 +- src/unix/CMakeLists.txt | 5 + src/unix/unix.c | 502 +++++++++++++++++++++++++++++++ src/unix/unix_cdrom.c | 264 ++++++++++++++++ src/unix/unix_midi.c | 57 ++++ src/unix/unix_sdl.c | 420 ++++++++++++++++++++++++++ src/unix/unix_thread.c | 158 ++++++++++ 10 files changed, 1432 insertions(+), 3 deletions(-) create mode 100644 src/include/86box/unix_sdl.h create mode 100644 src/unix/CMakeLists.txt create mode 100644 src/unix/unix.c create mode 100644 src/unix/unix_cdrom.c create mode 100644 src/unix/unix_midi.c create mode 100644 src/unix/unix_sdl.c create mode 100644 src/unix/unix_thread.c diff --git a/.gitignore b/.gitignore index 968c8d4bc..ac3c080a8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ src/NUL src/nvr/ src/roms/ /.vs -/CMakeUserPresets.json \ No newline at end of file +/CMakeUserPresets.json +/build +/.vscode diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cbe6f79f5..67cf3eca0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -123,4 +123,9 @@ add_subdirectory(sio) add_subdirectory(scsi) add_subdirectory(sound) add_subdirectory(video) -add_subdirectory(win) +if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") + add_subdirectory(win) +else() + add_subdirectory(unix) + target_link_libraries(86Box glib-2.0) +endif() diff --git a/src/include/86box/unix_sdl.h b/src/include/86box/unix_sdl.h new file mode 100644 index 000000000..7019f0b85 --- /dev/null +++ b/src/include/86box/unix_sdl.h @@ -0,0 +1,12 @@ +#ifndef _UNIX_SDL_H +#define _UNIX_SDL_H +extern void sdl_close(void); +extern int sdl_inits(); +extern int sdl_inith(); +extern int sdl_initho(); +extern int sdl_pause(void); +extern void sdl_resize(int x, int y); +extern void sdl_enable(int enable); +extern void sdl_set_fs(int fs); +extern void sdl_reload(void); +#endif \ No newline at end of file diff --git a/src/network/slirp/CMakeLists.txt b/src/network/slirp/CMakeLists.txt index 4393d9d55..c04790265 100644 --- a/src/network/slirp/CMakeLists.txt +++ b/src/network/slirp/CMakeLists.txt @@ -17,4 +17,8 @@ add_library(slirp STATIC tinyglib.c arp_table.c bootp.c cksum.c dnssearch.c if.c ip_input.c ip_output.c mbuf.c misc.c sbuf.c slirp.c socket.c tcp_input.c tcp_output.c tcp_subr.c tcp_timer.c udp.c util.c version.c) -target_link_libraries(slirp wsock32 iphlpapi) \ No newline at end of file +#target_link_libraries(slirp wsock32 iphlpapi) +#target_link_libraries(slirp) +if (CMAKE_SYSTEM_NAME MATCHES "Windows") +target_link_libraries(wsock32 iphlpapi) +endif() diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt new file mode 100644 index 000000000..e3f5b5780 --- /dev/null +++ b/src/unix/CMakeLists.txt @@ -0,0 +1,5 @@ +add_library(plat STATIC unix_thread.c unix_midi.c) +add_library(ui STATIC unix.c unix_sdl.c unix_cdrom.c) +target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64) +target_link_libraries(ui dl) +target_link_libraries(plat pthread) \ No newline at end of file diff --git a/src/unix/unix.c b/src/unix/unix.c new file mode 100644 index 000000000..99fffbc77 --- /dev/null +++ b/src/unix/unix.c @@ -0,0 +1,502 @@ +#ifdef __linux__ +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE64_SOURCE 1 +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/config.h> +#include <86box/plat.h> +#include <86box/plat_dynld.h> +#include <86box/device.h> +#include <86box/gameport.h> +#include <86box/unix_sdl.h> +#include <86box/timer.h> +#include <86box/nvr.h> +#include <86box/unix_sdl.h> +static int first_use = 1; +static uint64_t StartingTime; +static uint64_t Frequency; +int rctrl_is_lalt; +int update_icons; +int kbd_req_capture; +int hide_status_bar; +int fixed_size_x = 640; +int fixed_size_y = 480; +plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; +joystick_t joystick_state[MAX_JOYSTICKS]; +int joysticks_present; +SDL_mutex *blitmtx; + +typedef struct sdl_blit_params +{ + int x, y, y1, y2, w, h; +} sdl_blit_params; + +sdl_blit_params params = { 0, 0, 0, 0, 0, 0 }; +int blitreq = 0; + +void* dynld_module(const char *name, dllimp_t *table) +{ + dllimp_t* imp; + void* modhandle = dlopen(name, RTLD_LAZY | RTLD_GLOBAL); + if (modhandle) + { + for (imp = table; imp->name != NULL; imp++) + { + if ((imp->func = dlsym(modhandle, imp->name)) == NULL) + { + dlclose(modhandle); + return NULL; + } + } + } + return modhandle; +} + +void +plat_tempfile(char *bufp, char *prefix, char *suffix) +{ + struct tm* calendertime; + struct timeval t; + time_t curtime; + + if (prefix != NULL) + sprintf(bufp, "%s-", prefix); + else + strcpy(bufp, ""); + gettimeofday(&t, NULL); + curtime = time(NULL); + calendertime = localtime(&curtime); + sprintf(&bufp[strlen(bufp)], "%d%02d%02d-%02d%02d%02d-%03d%s", calendertime->tm_year, calendertime->tm_mon, calendertime->tm_mday, calendertime->tm_hour, calendertime->tm_min, calendertime->tm_sec, t.tv_usec / 1000, suffix); +} + +int +plat_getcwd(char *bufp, int max) +{ + return getcwd(bufp, max) != 0; +} + +int +plat_chdir(char* str) +{ + return chdir(str); +} + +void dynld_close(void *handle) +{ + dlclose(handle); +} + +wchar_t* plat_get_string(int i) +{ + return L""; +} + +FILE * +plat_fopen(const char *path, const char *mode) +{ + return fopen(path, mode); +} + +FILE * +plat_fopen64(const char *path, const char *mode) +{ + return fopen(path, mode); +} + +int +plat_path_abs(char *path) +{ + return path[0] == '/'; +} + +void +plat_path_slash(char *path) +{ + if ((path[strlen(path)-1] != '/')) { + strcat(path, "/"); + } +} + +void +plat_put_backslash(char *s) +{ + int c = strlen(s) - 1; + + if (s[c] != '/') + s[c] = '/'; +} + +/* Return the last element of a pathname. */ +char * +plat_get_basename(const char *path) +{ + int c = (int)strlen(path); + + while (c > 0) { + if (path[c] == '/') + return((char *)&path[c]); + c--; + } + + return((char *)path); +} +char * +plat_get_filename(char *s) +{ + int c = strlen(s) - 1; + + while (c > 0) { + if (s[c] == '/' || s[c] == '\\') + return(&s[c+1]); + c--; + } + + return(s); +} + + +char * +plat_get_extension(char *s) +{ + int c = strlen(s) - 1; + + if (c <= 0) + return(s); + + while (c && s[c] != '.') + c--; + + if (!c) + return(&s[strlen(s)]); + + return(&s[c+1]); +} + + +void +plat_append_filename(char *dest, const char *s1, const char *s2) +{ + strcpy(dest, s1); + plat_path_slash(dest); + strcat(dest, s2); +} + +int +plat_dir_check(char *path) +{ + struct stat dummy; + if (stat(path, &dummy) < 0) + { + return 0; + } + return S_ISDIR(dummy.st_mode); +} + +int +plat_dir_create(char *path) +{ + return mkdir(path, S_IRWXU); +} + +uint64_t +plat_timer_read(void) +{ + return SDL_GetPerformanceCounter(); +} + +static uint64_t +plat_get_ticks_common(void) +{ + uint64_t EndingTime, ElapsedMicroseconds; + if (first_use) { + Frequency = SDL_GetPerformanceFrequency(); + StartingTime = SDL_GetPerformanceCounter(); + first_use = 0; + } + EndingTime = SDL_GetPerformanceCounter(); + ElapsedMicroseconds = ((EndingTime - StartingTime) * 1000000) / Frequency; + return ElapsedMicroseconds; +} + +uint32_t +plat_get_ticks(void) +{ + return (uint32_t)(plat_get_ticks_common() / 1000); +} + +uint32_t +plat_get_micro_ticks(void) +{ + return (uint32_t)plat_get_ticks_common(); +} + +void plat_remove(char* path) +{ + remove(path); +} + +void +ui_sb_update_icon_state(int tag, int state) +{ + +} + +void +ui_sb_update_icon(int tag, int active) +{ + +} + +void +plat_delay_ms(uint32_t count) +{ + SDL_Delay(count); +} + +void +ui_sb_update_tip(int arg) +{ + +} + +void +ui_sb_update_panes() +{ + +} + +void +plat_get_dirname(char *dest, const char *path) +{ + int c = (int)strlen(path); + char *ptr; + + ptr = (char *)path; + + while (c > 0) { + if (path[c] == '/' || path[c] == '\\') { + ptr = (char *)&path[c]; + break; + } + c--; + } + + /* Copy to destination. */ + while (path < ptr) + *dest++ = *path++; + *dest = '\0'; +} +volatile int cpu_thread_run = 1; +void ui_sb_set_text_w(wchar_t *wstr) +{ + +} + +int stricmp(const char* s1, const char* s2) +{ + return strcasecmp(s1, s2); +} + +int strnicmp(const char *s1, const char *s2, size_t n) +{ + return strncasecmp(s1, s2, n); +} + +void +main_thread(void *param) +{ + uint32_t old_time, new_time; + int drawits, frames; + + framecountx = 0; + //title_update = 1; + old_time = SDL_GetTicks(); + drawits = frames = 0; + while (!is_quit && cpu_thread_run) { + /* See if it is time to run a frame of code. */ + new_time = SDL_GetTicks(); + drawits += (new_time - old_time); + old_time = new_time; + if (drawits > 0 && !dopause) { + /* Yes, so do one frame now. */ + drawits -= 10; + if (drawits > 50) + drawits = 0; + + /* Run a block of code. */ + pc_run(); + + /* Every 200 frames we save the machine status. */ + if (++frames >= 200 && nvr_dosave) { + nvr_save(); + nvr_dosave = 0; + frames = 0; + } + } else /* Just so we dont overload the host OS. */ + SDL_Delay(1); + + /* If needed, handle a screen resize. */ + if (doresize && !video_fullscreen && !is_quit) { + if (vid_resize & 2) + plat_resize(fixed_size_x, fixed_size_y); + else + plat_resize(scrnsz_x, scrnsz_y); + doresize = 0; + } + } + + is_quit = 1; +} + +thread_t* thMain = NULL; + +void mouse_poll() +{} + +void +do_start(void) +{ + /* We have not stopped yet. */ + is_quit = 0; + + /* Initialize the high-precision timer. */ + SDL_InitSubSystem(SDL_INIT_TIMER); + timer_freq = SDL_GetPerformanceFrequency(); + + /* Start the emulator, really. */ + thMain = thread_create(main_thread, NULL); +} + +void +do_stop(void) +{ + /* Claim the video blitter. */ + startblit(); + + sdl_close(); + + pc_close(thMain); + + thMain = NULL; +} + +int ui_msgbox(int flags, void *message) +{ + return 0; +} + +int ui_msgbox_header(int flags, void *message, void* header) +{ + // Parameters that are passed will crash the program so keep these off for the time being. + return 0; +} + +void plat_get_exe_name(char *s, int size) +{ + char* basepath = SDL_GetBasePath(); + snprintf(s, size, "%s/86box", basepath); +} + +void +plat_power_off(void) +{ + confirm_exit = 0; + nvr_save(); + config_save(); + + /* Deduct a sufficiently large number of cycles that no instructions will + run before the main thread is terminated */ + cycles -= 99999999; + + cpu_thread_run = 0; +} + +wchar_t* ui_sb_bugui(wchar_t *str) +{ + return str; +} +extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); + +void ui_window_title(wchar_t* str) {} +void ui_sb_set_ready(int ready) {} +int main(int argc, char** argv) +{ + SDL_Event event; + + SDL_Init(0); + pc_init(argc, argv); + if (! pc_init_modules()) { + fprintf(stderr, "No ROMs found.\n"); + SDL_Quit(); + return 6; + } + blitmtx = SDL_CreateMutex(); + if (!blitmtx) + { + fprintf(stderr, "Failed to create blit mutex: %s", SDL_GetError()); + return -1; + } + sdl_initho(); + + if (start_in_fullscreen) + sdl_set_fs(1); + + /* Fire up the machine. */ + pc_reset_hard_init(); + + /* Set the PAUSE mode depending on the renderer. */ + //plat_pause(0); + + /* Initialize the rendering window, or fullscreen. */ + + + do_start(); + while (!is_quit) + { + if (SDL_PollEvent(&event)) + switch(event.type) + { + case SDL_QUIT: + do_stop(); + break; + + } + if (blitreq) + { + extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); + sdl_blit(params.x, params.y, params.y1, params.y2, params.w, params.h); + } + } + + SDL_DestroyMutex(blitmtx); + SDL_Quit(); + return 0; +} +char* plat_vidapi_name(int i) +{ + return "default"; +} +void joystick_init(void) {} +void joystick_close(void) {} +void joystick_process(void) {} +void startblit() +{ + SDL_LockMutex(blitmtx); +} + +void endblit() +{ + SDL_UnlockMutex(blitmtx); +} \ No newline at end of file diff --git a/src/unix/unix_cdrom.c b/src/unix/unix_cdrom.c new file mode 100644 index 000000000..9eb3d962a --- /dev/null +++ b/src/unix/unix_cdrom.c @@ -0,0 +1,264 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Handle the platform-side of CDROM/ZIP/MO drives. + * + * + * + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. + */ + +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/config.h> +#include <86box/timer.h> +#include <86box/device.h> +#include <86box/cassette.h> +#include <86box/cartridge.h> +#include <86box/fdd.h> +#include <86box/hdd.h> +#include <86box/scsi_device.h> +#include <86box/cdrom.h> +#include <86box/mo.h> +#include <86box/zip.h> +#include <86box/scsi_disk.h> +#include <86box/plat.h> +#include <86box/ui.h> + + + +void +cassette_mount(char *fn, uint8_t wp) +{ + pc_cas_set_fname(cassette, NULL); + memset(cassette_fname, 0, sizeof(cassette_fname)); + cassette_ui_writeprot = wp; + pc_cas_set_fname(cassette, fn); + if (fn != NULL) + memcpy(cassette_fname, fn, MIN(511, strlen(fn))); + ui_sb_update_icon_state(SB_CASSETTE, (fn == NULL) ? 1 : 0); + //media_menu_update_cassette(); + ui_sb_update_tip(SB_CASSETTE); + config_save(); +} + + +void +cassette_eject(void) +{ + pc_cas_set_fname(cassette, NULL); + memset(cassette_fname, 0x00, sizeof(cassette_fname)); + ui_sb_update_icon_state(SB_CASSETTE, 1); + //media_menu_update_cassette(); + ui_sb_update_tip(SB_CASSETTE); + config_save(); +} + + +void +cartridge_mount(uint8_t id, char *fn, uint8_t wp) +{ + cart_close(id); + cart_load(id, fn); + ui_sb_update_icon_state(SB_CARTRIDGE | id, strlen(cart_fns[id]) ? 0 : 1); + //media_menu_update_cartridge(id); + ui_sb_update_tip(SB_CARTRIDGE | id); + config_save(); +} + + +void +cartridge_eject(uint8_t id) +{ + cart_close(id); + ui_sb_update_icon_state(SB_CARTRIDGE | id, 1); + //media_menu_update_cartridge(id); + ui_sb_update_tip(SB_CARTRIDGE | id); + config_save(); +} + + +void +floppy_mount(uint8_t id, char *fn, uint8_t wp) +{ + fdd_close(id); + ui_writeprot[id] = wp; + fdd_load(id, fn); + ui_sb_update_icon_state(SB_FLOPPY | id, strlen(floppyfns[id]) ? 0 : 1); + //media_menu_update_floppy(id); + ui_sb_update_tip(SB_FLOPPY | id); + config_save(); +} + + +void +floppy_eject(uint8_t id) +{ + fdd_close(id); + ui_sb_update_icon_state(SB_FLOPPY | id, 1); + //media_menu_update_floppy(id); + ui_sb_update_tip(SB_FLOPPY | id); + config_save(); +} + + +void +plat_cdrom_ui_update(uint8_t id, uint8_t reload) +{ + cdrom_t *drv = &cdrom[id]; + + if (drv->host_drive == 0) { + ui_sb_update_icon_state(SB_CDROM|id, 1); + } else { + ui_sb_update_icon_state(SB_CDROM|id, 0); + } + + //media_menu_update_cdrom(id); + ui_sb_update_tip(SB_CDROM|id); +} + +void +cdrom_mount(uint8_t id, char *fn) +{ + cdrom[id].prev_host_drive = cdrom[id].host_drive; + strcpy(cdrom[id].prev_image_path, cdrom[id].image_path); + if (cdrom[id].ops && cdrom[id].ops->exit) + cdrom[id].ops->exit(&(cdrom[id])); + cdrom[id].ops = NULL; + memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); + cdrom_image_open(&(cdrom[id]), fn); + /* Signal media change to the emulated machine. */ + if (cdrom[id].insert) + cdrom[id].insert(cdrom[id].priv); + cdrom[id].host_drive = (strlen(cdrom[id].image_path) == 0) ? 0 : 200; + if (cdrom[id].host_drive == 200) { + ui_sb_update_icon_state(SB_CDROM | id, 0); + } else { + ui_sb_update_icon_state(SB_CDROM | id, 1); + } + //media_menu_update_cdrom(id); + ui_sb_update_tip(SB_CDROM | id); + config_save(); +} + +void +mo_eject(uint8_t id) +{ + mo_t *dev = (mo_t *) mo_drives[id].priv; + + mo_disk_close(dev); + if (mo_drives[id].bus_type) { + /* Signal disk change to the emulated machine. */ + mo_insert(dev); + } + + ui_sb_update_icon_state(SB_MO | id, 1); + //media_menu_update_mo(id); + ui_sb_update_tip(SB_MO | id); + config_save(); +} + + +void +mo_mount(uint8_t id, char *fn, uint8_t wp) +{ + mo_t *dev = (mo_t *) mo_drives[id].priv; + + mo_disk_close(dev); + mo_drives[id].read_only = wp; + mo_load(dev, fn); + mo_insert(dev); + + ui_sb_update_icon_state(SB_MO | id, strlen(mo_drives[id].image_path) ? 0 : 1); + //media_menu_update_mo(id); + ui_sb_update_tip(SB_MO | id); + + config_save(); +} + + +void +mo_reload(uint8_t id) +{ + mo_t *dev = (mo_t *) mo_drives[id].priv; + + mo_disk_reload(dev); + if (strlen(mo_drives[id].image_path) == 0) { + ui_sb_update_icon_state(SB_MO|id, 1); + } else { + ui_sb_update_icon_state(SB_MO|id, 0); + } + + //media_menu_update_mo(id); + ui_sb_update_tip(SB_MO|id); + + config_save(); +} + +void +zip_eject(uint8_t id) +{ + zip_t *dev = (zip_t *) zip_drives[id].priv; + + zip_disk_close(dev); + if (zip_drives[id].bus_type) { + /* Signal disk change to the emulated machine. */ + zip_insert(dev); + } + + ui_sb_update_icon_state(SB_ZIP | id, 1); + //media_menu_update_zip(id); + ui_sb_update_tip(SB_ZIP | id); + config_save(); +} + + +void +zip_mount(uint8_t id, char *fn, uint8_t wp) +{ + zip_t *dev = (zip_t *) zip_drives[id].priv; + + zip_disk_close(dev); + zip_drives[id].read_only = wp; + zip_load(dev, fn); + zip_insert(dev); + + ui_sb_update_icon_state(SB_ZIP | id, strlen(zip_drives[id].image_path) ? 0 : 1); + //media_menu_update_zip(id); + ui_sb_update_tip(SB_ZIP | id); + + config_save(); +} + + +void +zip_reload(uint8_t id) +{ + zip_t *dev = (zip_t *) zip_drives[id].priv; + + zip_disk_reload(dev); + if (strlen(zip_drives[id].image_path) == 0) { + ui_sb_update_icon_state(SB_ZIP|id, 1); + } else { + ui_sb_update_icon_state(SB_ZIP|id, 0); + } + + //media_menu_update_zip(id); + ui_sb_update_tip(SB_ZIP|id); + + config_save(); +} diff --git a/src/unix/unix_midi.c b/src/unix/unix_midi.c new file mode 100644 index 000000000..c92820bef --- /dev/null +++ b/src/unix/unix_midi.c @@ -0,0 +1,57 @@ +#include +void plat_midi_init(void) +{ + +} + +void plat_midi_close(void) +{ + +} + +void plat_midi_play_msg(uint8_t *msg) +{ + +} + +void plat_midi_play_sysex(uint8_t *sysex, unsigned int len) +{ + +} + +int plat_midi_write(uint8_t val) +{ + return 0; +} + +int plat_midi_get_num_devs(void) +{ + return 0; +} + +void plat_midi_get_dev_name(int num, char *s) +{ + s[0] = ' '; + s[1] = 0; +} + +void plat_midi_input_init(void) +{ + +} + +void plat_midi_input_close(void) +{ + +} + +int plat_midi_in_get_num_devs(void) +{ + return 0; +} + +void plat_midi_in_get_dev_name(int num, char *s) +{ + s[0] = ' '; + s[1] = 0; +} \ No newline at end of file diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c new file mode 100644 index 000000000..72b87776e --- /dev/null +++ b/src/unix/unix_sdl.c @@ -0,0 +1,420 @@ +#include +#include + +#include +#include +#include +#include +/* This #undef is needed because a SDL include header redefines HAVE_STDARG_H. */ +#undef HAVE_STDARG_H +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/plat.h> +#include <86box/plat_dynld.h> +#include <86box/video.h> +#include <86box/ui.h> +#include <86box/version.h> + +#define RENDERER_FULL_SCREEN 1 +#define RENDERER_HARDWARE 2 +#define RENDERER_OPENGL 4 + +typedef struct sdl_blit_params +{ + int x, y, y1, y2, w, h; +} sdl_blit_params; +extern sdl_blit_params params; +extern int blitreq; + +static SDL_Window *sdl_win = NULL; +static SDL_Renderer *sdl_render = NULL; +static SDL_Texture *sdl_tex = NULL; +static int sdl_w, sdl_h; +static int sdl_fs, sdl_flags = -1; +static int cur_w, cur_h; +static int cur_wx = 0, cur_wy = 0, cur_ww =0, cur_wh = 0; +static volatile int sdl_enabled = 1; +static SDL_mutex* sdl_mutex = NULL; +int mouse_capture; + +static void +sdl_integer_scale(double *d, double *g) +{ + double ratio; + + if (*d > *g) { + ratio = floor(*d / *g); + *d = *g * ratio; + } else { + ratio = ceil(*d / *g); + *d = *g / ratio; + } +} + +void sdl_reinit_texture(); + +static void +sdl_stretch(int *w, int *h, int *x, int *y) +{ + double hw, gw, hh, gh, dx, dy, dw, dh, gsr, hsr; + + hw = (double) sdl_w; + hh = (double) sdl_h; + gw = (double) *w; + gh = (double) *h; + hsr = hw / hh; + + switch (video_fullscreen_scale) { + case FULLSCR_SCALE_FULL: + default: + *w = sdl_w; + *h = sdl_h; + *x = 0; + *y = 0; + break; + case FULLSCR_SCALE_43: + case FULLSCR_SCALE_KEEPRATIO: + if (video_fullscreen_scale == FULLSCR_SCALE_43) + gsr = 4.0 / 3.0; + else + gsr = gw / gh; + if (gsr <= hsr) { + dw = hh * gsr; + dh = hh; + } else { + dw = hw; + dh = hw / gsr; + } + dx = (hw - dw) / 2.0; + dy = (hh - dh) / 2.0; + *w = (int) dw; + *h = (int) dh; + *x = (int) dx; + *y = (int) dy; + break; + case FULLSCR_SCALE_INT: + gsr = gw / gh; + if (gsr <= hsr) { + dw = hh * gsr; + dh = hh; + } else { + dw = hw; + dh = hw / gsr; + } + sdl_integer_scale(&dw, &gw); + sdl_integer_scale(&dh, &gh); + dx = (hw - dw) / 2.0; + dy = (hh - dh) / 2.0; + *w = (int) dw; + *h = (int) dh; + *x = (int) dx; + *y = (int) dy; + break; + } +} + + +void +sdl_blit_shim(int x, int y, int y1, int y2, int w, int h) +{ + params.x = x; + params.y = y; + params.w = w; + params.h = h; + params.y1 = y1; + params.y2 = y2; + blitreq = 1; +} + +void +sdl_blit(int x, int y, int y1, int y2, int w, int h) +{ + SDL_Rect r_src; + int ret; + + if (!sdl_enabled || (y1 == y2) || (h <= 0) || (render_buffer == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { + video_blit_complete(); + return; + } + + SDL_LockMutex(sdl_mutex); + + r_src.x = 0; + r_src.y = y1; + r_src.w = w; + r_src.h = y2 - y1; + SDL_UpdateTexture(sdl_tex, &r_src, &(render_buffer->dat)[y1 * w], w * 4); + video_blit_complete(); + + SDL_RenderClear(sdl_render); + + r_src.x = 0; + r_src.y = 0; + r_src.w = w; + r_src.h = h; + + ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0); + if (ret) + fprintf(stderr, "SDL: unable to copy texture to renderer (%s)\n", SDL_GetError()); + + SDL_RenderPresent(sdl_render); + SDL_UnlockMutex(sdl_mutex); +} + +static void +sdl_destroy_window(void) +{ + if (sdl_win != NULL) { + SDL_DestroyWindow(sdl_win); + sdl_win = NULL; + } +} + + +static void +sdl_destroy_texture(void) +{ + /* SDL_DestroyRenderer also automatically destroys all associated textures. */ + if (sdl_render != NULL) { + SDL_DestroyRenderer(sdl_render); + sdl_render = NULL; + } +} + +void +sdl_close(void) +{ + SDL_LockMutex(sdl_mutex); + + /* Unregister our renderer! */ + video_setblit(NULL); + + if (sdl_enabled) + sdl_enabled = 0; + + if (sdl_mutex != NULL) { + SDL_DestroyMutex(sdl_mutex); + sdl_mutex = NULL; + } + + sdl_destroy_texture(); + sdl_destroy_window(); + + /* Quit. */ + SDL_Quit(); + sdl_flags = -1; +} + +static int old_capture = 0; + +void +sdl_enable(int enable) +{ + if (sdl_flags == -1) + return; + + SDL_LockMutex(sdl_mutex); + sdl_enabled = !!enable; + + if (enable == 1) { + SDL_SetWindowSize(sdl_win, cur_ww, cur_wh); + sdl_reinit_texture(); + } + + SDL_UnlockMutex(sdl_mutex); +} + +static void +sdl_select_best_hw_driver(void) +{ + int i; + SDL_RendererInfo renderInfo; + + for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) + { + SDL_GetRenderDriverInfo(i, &renderInfo); + if (renderInfo.flags & SDL_RENDERER_ACCELERATED) { + SDL_SetHint(SDL_HINT_RENDER_DRIVER, renderInfo.name); + return; + } + } +} + + +void +sdl_reinit_texture() +{ + if (sdl_flags == -1) + return; + + sdl_destroy_texture(); + + SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); + if (sdl_flags & RENDERER_HARDWARE) { + sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); + } else + sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE); + + sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STREAMING, 2048, 2048); +} + +void +sdl_set_fs(int fs) +{ + SDL_LockMutex(sdl_mutex); + sdl_enabled = 0; + sdl_destroy_texture(); + SDL_SetWindowFullscreen(sdl_win, fs ? SDL_WINDOW_FULLSCREEN : 0); + SDL_SetWindowMouseGrab(sdl_win, mouse_capture); + + sdl_fs = fs; + + if (fs) + sdl_flags |= RENDERER_FULL_SCREEN; + else + sdl_flags &= ~RENDERER_FULL_SCREEN; + + sdl_reinit_texture(); + sdl_enabled = 1; + SDL_UnlockMutex(sdl_mutex); +} + +void +sdl_resize(int x, int y) +{ + int ww = 0, wh = 0, wx = 0, wy = 0; + + if (video_fullscreen & 2) + return; + + if ((x == cur_w) && (y == cur_h)) + return; + + SDL_LockMutex(sdl_mutex); + + ww = x; + wh = y; + + cur_w = x; + cur_h = y; + + cur_wx = wx; + cur_wy = wy; + cur_ww = ww; + cur_wh = wh; + + SDL_SetWindowSize(sdl_win, cur_ww, cur_wh); + SDL_SetWindowPosition(sdl_win, cur_wx, cur_wy); + + sdl_reinit_texture(); + + SDL_UnlockMutex(sdl_mutex); +} +void +sdl_reload(void) +{ + if (sdl_flags & RENDERER_HARDWARE) + { + SDL_LockMutex(sdl_mutex); + + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); + sdl_reinit_texture(); + + SDL_UnlockMutex(sdl_mutex); + } +} + +int +plat_vidapi(char* api) +{ + return 0; +} + +static int +sdl_init_common(int flags) +{ + wchar_t temp[128]; + SDL_version ver; + + /* Get and log the version of the DLL we are using. */ + SDL_GetVersion(&ver); + fprintf(stderr, "SDL: version %d.%d.%d\n", ver.major, ver.minor, ver.patch); + + /* Initialize the SDL system. */ + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "SDL: initialization failed (%s)\n", SDL_GetError()); + return(0); + } + + if (flags & RENDERER_HARDWARE) { + if (flags & RENDERER_OPENGL) { + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "OpenGL"); + } + else + sdl_select_best_hw_driver(); + } + + sdl_mutex = SDL_CreateMutex(); + sdl_win = SDL_CreateWindow("86Box", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, scrnsz_x, scrnsz_y, SDL_WINDOW_OPENGL); + sdl_set_fs(video_fullscreen & 1); + if (!(video_fullscreen & 1)) + { + if (vid_resize & 2) + plat_resize(fixed_size_x, fixed_size_y); + else + plat_resize(scrnsz_x, scrnsz_y); + } + + /* Make sure we get a clean exit. */ + atexit(sdl_close); + + /* Register our renderer! */ + video_setblit(sdl_blit_shim); + + sdl_enabled = 1; + + return(1); +} + +int +sdl_inits() +{ + return sdl_init_common(0); +} + + +int +sdl_inith() +{ + return sdl_init_common(RENDERER_HARDWARE); +} + + +int +sdl_initho() +{ + return sdl_init_common(RENDERER_HARDWARE | RENDERER_OPENGL); +} + + +int +sdl_pause(void) +{ + return(0); +} + +void +plat_mouse_capture(int on) +{ + SDL_LockMutex(sdl_mutex); + SDL_SetWindowMouseGrab(sdl_win, (SDL_bool)on); + SDL_UnlockMutex(sdl_mutex); +} + +void plat_resize(int w, int h) +{ + SDL_SetWindowSize(sdl_win, w, h); +} diff --git a/src/unix/unix_thread.c b/src/unix/unix_thread.c new file mode 100644 index 000000000..2c1561597 --- /dev/null +++ b/src/unix/unix_thread.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/plat.h> + +typedef struct event_pthread_t +{ + pthread_cond_t cond; + pthread_mutex_t mutex; + int state; +} event_pthread_t; + +thread_t *thread_create(void (*thread_rout)(void *param), void *param) +{ + pthread_t *thread = malloc(sizeof(pthread_t)); + + pthread_create(thread, NULL, (void*)thread_rout, param); + + return thread; +} + +int +thread_wait(thread_t *arg, int timeout) +{ + return pthread_join(*(pthread_t*)(arg), NULL) != 0; +} + +event_t *thread_create_event() +{ + event_pthread_t *event = malloc(sizeof(event_pthread_t)); + + pthread_cond_init(&event->cond, NULL); + pthread_mutex_init(&event->mutex, NULL); + event->state = 0; + + return (event_t *)event; +} + +void thread_set_event(event_t *handle) +{ + event_pthread_t *event = (event_pthread_t *)handle; + + pthread_mutex_lock(&event->mutex); + event->state = 1; + pthread_cond_broadcast(&event->cond); + pthread_mutex_unlock(&event->mutex); +} + +void thread_reset_event(event_t *handle) +{ + event_pthread_t *event = (event_pthread_t *)handle; + + pthread_mutex_lock(&event->mutex); + event->state = 0; + pthread_mutex_unlock(&event->mutex); +} + +int thread_wait_event(event_t *handle, int timeout) +{ + event_pthread_t *event = (event_pthread_t *)handle; + struct timespec abstime; + +#if defined __linux__ || defined BSD + clock_gettime(CLOCK_REALTIME, &abstime); +#else + struct timeval now; + gettimeofday(&now, 0); + abstime.tv_sec = now.tv_sec; + abstime.tv_nsec = now.tv_usec*1000UL; +#endif + abstime.tv_nsec += (timeout % 1000) * 1000000; + abstime.tv_sec += (timeout / 1000); + if (abstime.tv_nsec > 1000000000) + { + abstime.tv_nsec -= 1000000000; + abstime.tv_sec++; + } + + pthread_mutex_lock(&event->mutex); + if (timeout == -1) + { + while (!event->state) + pthread_cond_wait(&event->cond, &event->mutex); + } + else if (!event->state) + pthread_cond_timedwait(&event->cond, &event->mutex, &abstime); + pthread_mutex_unlock(&event->mutex); + + return 0; +} + +void thread_destroy_event(event_t *handle) +{ + event_pthread_t *event = (event_pthread_t *)handle; + + pthread_cond_destroy(&event->cond); + pthread_mutex_destroy(&event->mutex); + + free(event); +} + +void thread_sleep(int t) +{ + usleep(t * 1000); +} + + +typedef struct pt_mutex_t +{ + pthread_mutex_t mutex; +} pt_mutex_t; + +mutex_t *thread_create_mutex(void) +{ + pt_mutex_t *mutex = malloc(sizeof(pt_mutex_t)); + + pthread_mutex_init(&mutex->mutex, NULL); + + return mutex; + +} + +mutex_t * +thread_create_mutex_with_spin_count(unsigned int spin_count) +{ + /* Setting spin count of a mutex is not possible with pthreads. */ + return thread_create_mutex(); +} + +int thread_wait_mutex(mutex_t *_mutex) +{ + if (_mutex == NULL) return(0); + pt_mutex_t *mutex = (pt_mutex_t *)_mutex; + + return pthread_mutex_lock(&mutex->mutex) != 0; +} + +int thread_release_mutex(mutex_t *_mutex) +{ + if (_mutex == NULL) return(0); + pt_mutex_t *mutex = (pt_mutex_t *)_mutex; + + return pthread_mutex_unlock(&mutex->mutex) != 0; +} + +void thread_close_mutex(mutex_t *_mutex) +{ + pt_mutex_t *mutex = (pt_mutex_t *)_mutex; + + pthread_mutex_destroy(&mutex->mutex); + + free(mutex); +} \ No newline at end of file From bd74669ad539f00d1ce0282df736d57cc0e378f1 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 22 Aug 2021 18:03:58 +0600 Subject: [PATCH 14/75] Enable CMake policy CMP0079 --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 638cc2212..9e6552571 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ cmake_minimum_required(VERSION 3.15) cmake_policy(SET CMP0091 NEW) +cmake_policy(SET CMP0079 NEW) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") project(86Box From 435174a06a100a2d0d3632ecb99d775c467830b2 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 22 Aug 2021 20:34:19 +0600 Subject: [PATCH 15/75] Fix incorrect typing of function loader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 韩朴宇 --- src/unix/unix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 99fffbc77..15000598e 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -54,7 +54,7 @@ void* dynld_module(const char *name, dllimp_t *table) { for (imp = table; imp->name != NULL; imp++) { - if ((imp->func = dlsym(modhandle, imp->name)) == NULL) + if ((*(void**)imp->func = dlsym(modhandle, imp->name)) == NULL) { dlclose(modhandle); return NULL; From 39fea69d5c13bf47dc6191173a65f94de4e50b89 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 22 Aug 2021 20:50:05 +0600 Subject: [PATCH 16/75] Fix warnings --- src/include/86box/plat.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 497123799..02f7737f8 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -30,6 +30,10 @@ #ifdef _WIN32 # define wcscasecmp _wcsicmp # define strcasecmp _stricmp +#else +/* Declare these functions to avoid warnings. They will redirect to strcasecmp and strncasecmp respectively. */ +extern int stricmp(const char* s1, const char* s2); +extern int strnicmp(const char* s1, const char* s2, int n); #endif #if defined(UNIX) && defined(FREEBSD) || defined(__APPLE__) From f6af2b016270d10b30d660f151674457efad7ba0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 22 Aug 2021 22:37:37 +0600 Subject: [PATCH 17/75] Fix compile errors and get rid of glib dependency --- src/CMakeLists.txt | 1 - src/include/86box/plat.h | 2 +- src/network/slirp/tinyglib.c | 37 ++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 67cf3eca0..616a01772 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -127,5 +127,4 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") add_subdirectory(win) else() add_subdirectory(unix) - target_link_libraries(86Box glib-2.0) endif() diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 02f7737f8..605482638 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -33,7 +33,7 @@ #else /* Declare these functions to avoid warnings. They will redirect to strcasecmp and strncasecmp respectively. */ extern int stricmp(const char* s1, const char* s2); -extern int strnicmp(const char* s1, const char* s2, int n); +extern int strnicmp(const char* s1, const char* s2, size_t n); #endif #if defined(UNIX) && defined(FREEBSD) || defined(__APPLE__) diff --git a/src/network/slirp/tinyglib.c b/src/network/slirp/tinyglib.c index d44658f52..0639e2832 100644 --- a/src/network/slirp/tinyglib.c +++ b/src/network/slirp/tinyglib.c @@ -94,3 +94,40 @@ g_strv_length(gchar **str_array) ++i; return i; } + +/* Implementation borrowed from GLib itself. */ +gsize +g_strlcpy (gchar *dest, + const gchar *src, + gsize dest_size) +{ + gchar *d = dest; + const gchar *s = src; + gsize n = dest_size; + + if (dest == NULL) return 0; + if (src == NULL) return 0; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) + do + { + gchar c = *s++; + + *d++ = c; + if (c == 0) + break; + } + while (--n != 0); + + /* If not enough room in dest, add NUL and traverse rest of src */ + if (n == 0) + { + if (dest_size != 0) + *d = 0; + while (*s++) + ; + } + + return s - src - 1; /* count does not include NUL */ +} From d9fdc5fcc1ed64187893a8039e3abe44547af041 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 00:47:07 +0600 Subject: [PATCH 18/75] Implement keyboard support Numpad will be done eventually --- src/cdrom/cdrom_image_backend.c | 1 + src/unix/unix.c | 109 +++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 34cf643ee..cf4cb0005 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #ifdef _WIN32 # include diff --git a/src/unix/unix.c b/src/unix/unix.c index 15000598e..5985fdb4e 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -15,6 +15,7 @@ #include #include #include <86box/86box.h> +#include <86box/keyboard.h> #include <86box/config.h> #include <86box/plat.h> #include <86box/plat_dynld.h> @@ -38,6 +39,101 @@ joystick_t joystick_state[MAX_JOYSTICKS]; int joysticks_present; SDL_mutex *blitmtx; +static const uint16_t sdl_to_xt[0x200] = +{ + [SDL_SCANCODE_ESCAPE] = 0x01, + [SDL_SCANCODE_1] = 0x02, + [SDL_SCANCODE_2] = 0x03, + [SDL_SCANCODE_3] = 0x04, + [SDL_SCANCODE_4] = 0x05, + [SDL_SCANCODE_5] = 0x06, + [SDL_SCANCODE_6] = 0x07, + [SDL_SCANCODE_7] = 0x08, + [SDL_SCANCODE_8] = 0x09, + [SDL_SCANCODE_9] = 0x0A, + [SDL_SCANCODE_0] = 0x0B, + [SDL_SCANCODE_MINUS] = 0x0C, + [SDL_SCANCODE_EQUALS] = 0x0D, + [SDL_SCANCODE_BACKSPACE] = 0x0E, + [SDL_SCANCODE_TAB] = 0x0F, + [SDL_SCANCODE_Q] = 0x10, + [SDL_SCANCODE_W] = 0x11, + [SDL_SCANCODE_E] = 0x12, + [SDL_SCANCODE_R] = 0x13, + [SDL_SCANCODE_T] = 0x14, + [SDL_SCANCODE_Y] = 0x15, + [SDL_SCANCODE_U] = 0x16, + [SDL_SCANCODE_I] = 0x17, + [SDL_SCANCODE_O] = 0x18, + [SDL_SCANCODE_P] = 0x19, + [SDL_SCANCODE_LEFTBRACKET] = 0x1A, + [SDL_SCANCODE_RIGHTBRACKET] = 0x1B, + [SDL_SCANCODE_RETURN] = 0x1C, + [SDL_SCANCODE_LCTRL] = 0x1D, + [SDL_SCANCODE_A] = 0x1E, + [SDL_SCANCODE_S] = 0x1F, + [SDL_SCANCODE_D] = 0x20, + [SDL_SCANCODE_F] = 0x21, + [SDL_SCANCODE_G] = 0x22, + [SDL_SCANCODE_H] = 0x23, + [SDL_SCANCODE_J] = 0x24, + [SDL_SCANCODE_K] = 0x25, + [SDL_SCANCODE_L] = 0x26, + [SDL_SCANCODE_SEMICOLON] = 0x27, + [SDL_SCANCODE_APOSTROPHE] = 0x28, + [SDL_SCANCODE_GRAVE] = 0x29, + [SDL_SCANCODE_LSHIFT] = 0x2A, + [SDL_SCANCODE_BACKSLASH] = 0x2B, + [SDL_SCANCODE_Z] = 0x2C, + [SDL_SCANCODE_X] = 0x2D, + [SDL_SCANCODE_C] = 0x2E, + [SDL_SCANCODE_V] = 0x2F, + [SDL_SCANCODE_B] = 0x30, + [SDL_SCANCODE_N] = 0x31, + [SDL_SCANCODE_M] = 0x32, + [SDL_SCANCODE_COMMA] = 0x33, + [SDL_SCANCODE_PERIOD] = 0x34, + [SDL_SCANCODE_SLASH] = 0x35, + [SDL_SCANCODE_RSHIFT] = 0x36, + [SDL_SCANCODE_KP_MULTIPLY] = 0x37, + [SDL_SCANCODE_LALT] = 0x38, + [SDL_SCANCODE_SPACE] = 0x39, + [SDL_SCANCODE_CAPSLOCK] = 0x3A, + [SDL_SCANCODE_F1] = 0x3B, + [SDL_SCANCODE_F2] = 0x3C, + [SDL_SCANCODE_F3] = 0x3D, + [SDL_SCANCODE_F4] = 0x3E, + [SDL_SCANCODE_F5] = 0x3F, + [SDL_SCANCODE_F6] = 0x40, + [SDL_SCANCODE_F7] = 0x41, + [SDL_SCANCODE_F8] = 0x42, + [SDL_SCANCODE_F9] = 0x43, + [SDL_SCANCODE_F10] = 0x44, + [SDL_SCANCODE_NUMLOCKCLEAR] = 0x45, + [SDL_SCANCODE_SCROLLLOCK] = 0x46, + [SDL_SCANCODE_HOME] = 0x47, + [SDL_SCANCODE_UP] = 0x48, + [SDL_SCANCODE_PAGEUP] = 0x49, + [SDL_SCANCODE_KP_MINUS] = 0x4A, + [SDL_SCANCODE_LEFT] = 0x4B, + [SDL_SCANCODE_KP_5] = 0x4C, + [SDL_SCANCODE_RIGHT] = 0x4D, + [SDL_SCANCODE_KP_PLUS] = 0x4E, + [SDL_SCANCODE_END] = 0x4F, + [SDL_SCANCODE_DOWN] = 0x50, + [SDL_SCANCODE_PAGEDOWN] = 0x51, + [SDL_SCANCODE_INSERT] = 0x52, + [SDL_SCANCODE_DELETE] = 0x53, + [SDL_SCANCODE_F11] = 0x57, + [SDL_SCANCODE_F12] = 0x58, + + [SDL_SCANCODE_KP_ENTER] = 0x11c, + [SDL_SCANCODE_RCTRL] = 0x11d, + [SDL_SCANCODE_KP_DIVIDE] = 0x135, + [SDL_SCANCODE_RALT] = 0x138 +}; +// TODO: Keypad. + typedef struct sdl_blit_params { int x, y, y1, y2, w, h; @@ -471,7 +567,18 @@ int main(int argc, char** argv) case SDL_QUIT: do_stop(); break; - + case SDL_KEYDOWN: + case SDL_KEYUP: + { + uint16_t xtkey = 0; + switch(event.key.keysym.scancode) + { + default: + xtkey = sdl_to_xt[event.key.keysym.scancode]; + break; + } + keyboard_input(event.key.state == SDL_PRESSED, xtkey); + } } if (blitreq) { From 1678783db55114876783b62f0f9f13ee1334fb65 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 01:17:56 +0600 Subject: [PATCH 19/75] Implement keypad support --- src/unix/unix.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 5985fdb4e..8daf37aaa 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -130,9 +130,16 @@ static const uint16_t sdl_to_xt[0x200] = [SDL_SCANCODE_KP_ENTER] = 0x11c, [SDL_SCANCODE_RCTRL] = 0x11d, [SDL_SCANCODE_KP_DIVIDE] = 0x135, - [SDL_SCANCODE_RALT] = 0x138 + [SDL_SCANCODE_RALT] = 0x138, + [SDL_SCANCODE_KP_9] = 0x49, + [SDL_SCANCODE_KP_8] = 0x48, + [SDL_SCANCODE_KP_7] = 0x47, + [SDL_SCANCODE_KP_6] = 0x4D, + [SDL_SCANCODE_KP_4] = 0x4B, + [SDL_SCANCODE_KP_3] = 0x51, + [SDL_SCANCODE_KP_2] = 0x50, + [SDL_SCANCODE_KP_1] = 0x4F }; -// TODO: Keypad. typedef struct sdl_blit_params { @@ -524,6 +531,7 @@ wchar_t* ui_sb_bugui(wchar_t *str) return str; } extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); +int numlock = 0; void ui_window_title(wchar_t* str) {} void ui_sb_set_ready(int ready) {} @@ -573,6 +581,19 @@ int main(int argc, char** argv) uint16_t xtkey = 0; switch(event.key.keysym.scancode) { + case SDL_SCANCODE_KP_1 ... SDL_SCANCODE_KP_0: + { + if (numlock) + { + xtkey = (event.key.keysym.scancode - SDL_SCANCODE_KP_1) + 2; + } + else xtkey = sdl_to_xt[event.key.keysym.scancode]; + break; + } + case SDL_SCANCODE_NUMLOCKCLEAR: + { + if (event.type == SDL_KEYDOWN) numlock ^= 1; + } default: xtkey = sdl_to_xt[event.key.keysym.scancode]; break; From e0b36b52caa1d66d5d968f7e100463f003faaf78 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 14:09:43 +0600 Subject: [PATCH 20/75] Implement window title setting --- src/unix/unix.c | 23 +++++++++++++++++++---- src/unix/unix_sdl.c | 20 ++++++++++++++++++++ src/unix/unix_thread.c | 19 ++++++++++++++++++- 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 8daf37aaa..c12f1b4df 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -24,7 +24,7 @@ #include <86box/unix_sdl.h> #include <86box/timer.h> #include <86box/nvr.h> -#include <86box/unix_sdl.h> + static int first_use = 1; static uint64_t StartingTime; static uint64_t Frequency; @@ -203,6 +203,15 @@ void dynld_close(void *handle) wchar_t* plat_get_string(int i) { + switch (i) + { + case IDS_2077: + return L"Click to capture mouse."; + case IDS_2078: + return L"Press F12-F8 to release mouse"; + case IDS_2079: + return L"Press F12-F8 or middle button to release mouse"; + } return L""; } @@ -497,19 +506,21 @@ do_stop(void) int ui_msgbox(int flags, void *message) { + fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu\n", flags, (uint64_t) message); return 0; } int ui_msgbox_header(int flags, void *message, void* header) { // Parameters that are passed will crash the program so keep these off for the time being. + fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu, hdrid: %llu\n", flags, (uint64_t) message, (uint64_t) header); return 0; } void plat_get_exe_name(char *s, int size) { char* basepath = SDL_GetBasePath(); - snprintf(s, size, "%s/86box", basepath); + snprintf(s, size, "%s%s", basepath, basepath[strlen(basepath) - 1] == '/' ? "86box" : "/86box"); } void @@ -533,7 +544,6 @@ wchar_t* ui_sb_bugui(wchar_t *str) extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); int numlock = 0; -void ui_window_title(wchar_t* str) {} void ui_sb_set_ready(int ready) {} int main(int argc, char** argv) { @@ -565,10 +575,10 @@ int main(int argc, char** argv) /* Initialize the rendering window, or fullscreen. */ - do_start(); while (!is_quit) { + static int onesec_tic = 0; if (SDL_PollEvent(&event)) switch(event.type) { @@ -606,6 +616,11 @@ int main(int argc, char** argv) extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); sdl_blit(params.x, params.y, params.y1, params.y2, params.w, params.h); } + if (SDL_GetTicks() - onesec_tic >= 1000) + { + onesec_tic = SDL_GetTicks(); + pc_onesec(); + } } SDL_DestroyMutex(blitmtx); diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 72b87776e..eda293504 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -15,6 +15,7 @@ #include <86box/video.h> #include <86box/ui.h> #include <86box/version.h> +#include <86box/unix_sdl.h> #define RENDERER_FULL_SCREEN 1 #define RENDERER_HARDWARE 2 @@ -418,3 +419,22 @@ void plat_resize(int w, int h) { SDL_SetWindowSize(sdl_win, w, h); } +wchar_t sdl_win_title[512] = L"86Box"; +wchar_t* ui_window_title(wchar_t* str) +{ + char* res; + if (!res) return sdl_win_title; + if (sizeof(wchar_t) == 1) + { + SDL_SetWindowTitle(sdl_win, (char*)str); + return str; + } + res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)str, wcslen(str) * sizeof(wchar_t)); + if (res) + { + SDL_SetWindowTitle(sdl_win, res); + wcsncpy(sdl_win_title, str, 512); + SDL_free((void*)res); + } + return str; +} \ No newline at end of file diff --git a/src/unix/unix_thread.c b/src/unix/unix_thread.c index 2c1561597..cdcc7cae1 100644 --- a/src/unix/unix_thread.c +++ b/src/unix/unix_thread.c @@ -15,11 +15,28 @@ typedef struct event_pthread_t int state; } event_pthread_t; +typedef struct thread_param +{ + void (*thread_rout)(void*); + void* param; +} thread_param; + +void* thread_run_wrapper(thread_param* arg) +{ + thread_param localparam = *arg; + free(arg); + localparam.thread_rout(localparam.param); + return NULL; +} + thread_t *thread_create(void (*thread_rout)(void *param), void *param) { pthread_t *thread = malloc(sizeof(pthread_t)); + thread_param *thrparam = malloc(sizeof(thread_param)); + thrparam->thread_rout = thread_rout; + thrparam->param = param; - pthread_create(thread, NULL, (void*)thread_rout, param); + pthread_create(thread, NULL, (void* (*)(void*))thread_run_wrapper, thrparam); return thread; } From 02d698ecaf9a4174cd542b8a8b324323112e7d0a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 14:22:28 +0600 Subject: [PATCH 21/75] Fix wrong variable reference --- src/unix/unix_sdl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index eda293504..633198736 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -423,7 +423,7 @@ wchar_t sdl_win_title[512] = L"86Box"; wchar_t* ui_window_title(wchar_t* str) { char* res; - if (!res) return sdl_win_title; + if (!str) return sdl_win_title; if (sizeof(wchar_t) == 1) { SDL_SetWindowTitle(sdl_win, (char*)str); From 8263fcab1fe88d8794ef95e52a053f4b39fd161a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 15:56:24 +0600 Subject: [PATCH 22/75] Implement mouse support --- src/unix/unix.c | 106 +++++++++++++++++++++++++++++++++++++++++--- src/unix/unix_sdl.c | 6 ++- 2 files changed, 106 insertions(+), 6 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index c12f1b4df..fbcd47a31 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -16,6 +16,7 @@ #include #include <86box/86box.h> #include <86box/keyboard.h> +#include <86box/mouse.h> #include <86box/config.h> #include <86box/plat.h> #include <86box/plat_dynld.h> @@ -208,9 +209,9 @@ wchar_t* plat_get_string(int i) case IDS_2077: return L"Click to capture mouse."; case IDS_2078: - return L"Press F12-F8 to release mouse"; + return L"Press CTRL-END to release mouse"; case IDS_2079: - return L"Press F12-F8 or middle button to release mouse"; + return L"Press CTRL-END or middle button to release mouse"; } return L""; } @@ -474,9 +475,6 @@ main_thread(void *param) thread_t* thMain = NULL; -void mouse_poll() -{} - void do_start(void) { @@ -541,9 +539,30 @@ wchar_t* ui_sb_bugui(wchar_t *str) { return str; } + extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); int numlock = 0; +typedef struct mouseinputdata +{ + int deltax, deltay, deltaz; + int mousebuttons; +} mouseinputdata; +SDL_mutex* mousemutex; +static mouseinputdata mousedata; +void mouse_poll() +{ + SDL_LockMutex(mousemutex); + mouse_x = mousedata.deltax; + mouse_y = mousedata.deltay; + mouse_z = mousedata.deltaz; + mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; + mouse_buttons = mousedata.mousebuttons; + SDL_UnlockMutex(mousemutex); +} + + +extern int real_sdl_w, real_sdl_h; void ui_sb_set_ready(int ready) {} int main(int argc, char** argv) { @@ -562,6 +581,7 @@ int main(int argc, char** argv) fprintf(stderr, "Failed to create blit mutex: %s", SDL_GetError()); return -1; } + sdl_initho(); if (start_in_fullscreen) @@ -585,6 +605,78 @@ int main(int argc, char** argv) case SDL_QUIT: do_stop(); break; + case SDL_MOUSEWHEEL: + { + if (mouse_capture || video_fullscreen) + { + if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) + { + event.wheel.x *= -1; + event.wheel.y *= -1; + } + SDL_LockMutex(mousemutex); + mousedata.deltaz = event.wheel.y; + SDL_UnlockMutex(mousemutex); + } + } + case SDL_MOUSEMOTION: + { + if (mouse_capture || video_fullscreen) + { + SDL_LockMutex(mousemutex); + mousedata.deltax += event.motion.xrel; + mousedata.deltay += event.motion.yrel; + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + if ((event.button.button == SDL_BUTTON_LEFT) + && !(mouse_capture || video_fullscreen) + && event.button.state == SDL_RELEASED + && event.button.x <= real_sdl_w && event.button.y <= real_sdl_h) + { + plat_mouse_capture(1); + break; + } + if (mouse_get_buttons() < 3 && event.button.button == SDL_BUTTON_MIDDLE && !video_fullscreen) + { + plat_mouse_capture(0); + break; + } + if (mouse_capture || video_fullscreen) + { + int buttonmask = 0; + + switch(event.button.button) + { + case SDL_BUTTON_LEFT: + buttonmask = 1; + break; + case SDL_BUTTON_RIGHT: + buttonmask = 2; + break; + case SDL_BUTTON_MIDDLE: + buttonmask = 4; + break; + } + SDL_LockMutex(mousemutex); + if (event.button.state == SDL_PRESSED) + { + mousedata.mousebuttons |= buttonmask; + } + else mousedata.mousebuttons &= ~buttonmask; + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_WINDOWEVENT_FOCUS_LOST: + { + plat_mouse_capture(0); + break; + } case SDL_KEYDOWN: case SDL_KEYUP: { @@ -611,6 +703,10 @@ int main(int argc, char** argv) keyboard_input(event.key.state == SDL_PRESSED, xtkey); } } + if (mouse_capture && keyboard_ismsexit()) + { + plat_mouse_capture(0); + } if (blitreq) { extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 633198736..83428bcfb 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -411,14 +411,18 @@ void plat_mouse_capture(int on) { SDL_LockMutex(sdl_mutex); - SDL_SetWindowMouseGrab(sdl_win, (SDL_bool)on); + SDL_SetRelativeMouseMode((SDL_bool)on); + mouse_capture = on; SDL_UnlockMutex(sdl_mutex); } +int real_sdl_w = SCREEN_RES_X, real_sdl_h = SCREEN_RES_Y; void plat_resize(int w, int h) { SDL_SetWindowSize(sdl_win, w, h); + real_sdl_w = w, real_sdl_h = h; } + wchar_t sdl_win_title[512] = L"86Box"; wchar_t* ui_window_title(wchar_t* str) { From 1418d788a455221a89b39f7b995b9a4cc3ee1e39 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 16:22:39 +0600 Subject: [PATCH 23/75] Remove incorrect focus loss detection code --- src/unix/unix.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index fbcd47a31..014566fad 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -672,11 +672,6 @@ int main(int argc, char** argv) } break; } - case SDL_WINDOWEVENT_FOCUS_LOST: - { - plat_mouse_capture(0); - break; - } case SDL_KEYDOWN: case SDL_KEYUP: { From 7d095da769985232f0352b73b2d953b0775398f9 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 16:38:55 +0600 Subject: [PATCH 24/75] oops, forgot to create the mouse access mutex --- src/unix/unix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 014566fad..4b79e030b 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -494,9 +494,9 @@ do_stop(void) { /* Claim the video blitter. */ startblit(); - + sdl_close(); - + pc_close(thMain); thMain = NULL; @@ -581,7 +581,7 @@ int main(int argc, char** argv) fprintf(stderr, "Failed to create blit mutex: %s", SDL_GetError()); return -1; } - + mousemutex = SDL_CreateMutex(); sdl_initho(); if (start_in_fullscreen) From fa3cb5bcee984800265c6bca1335943afc7a043a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 23 Aug 2021 17:26:04 +0600 Subject: [PATCH 25/75] Don't make the blitter thread wait forever on exit --- src/unix/unix.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 4b79e030b..88b638281 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -139,7 +139,8 @@ static const uint16_t sdl_to_xt[0x200] = [SDL_SCANCODE_KP_4] = 0x4B, [SDL_SCANCODE_KP_3] = 0x51, [SDL_SCANCODE_KP_2] = 0x50, - [SDL_SCANCODE_KP_1] = 0x4F + [SDL_SCANCODE_KP_1] = 0x4F, + [SDL_SCANCODE_KP_0] = 0x52 }; typedef struct sdl_blit_params @@ -492,11 +493,22 @@ do_start(void) void do_stop(void) { - /* Claim the video blitter. */ + + if (blitreq) + { + blitreq = 0; + extern void video_blit_complete(); + video_blit_complete(); + } + + is_quit = 1; + + /* Give the thread the time to shut down. */ + plat_delay_ms(200); startblit(); sdl_close(); - + pc_close(thMain); thMain = NULL; From 5cdfcb099c8b5d659dfdd4b69c0de73b7a87cff5 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 24 Aug 2021 14:21:23 +0600 Subject: [PATCH 26/75] Fix reading config files with UTF-8 BOM signature --- src/config.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 7cc626ee9..341d16c1b 100644 --- a/src/config.c +++ b/src/config.c @@ -279,6 +279,27 @@ config_free(void) } #endif +static int +config_detect_bom(char *fn) +{ + FILE *f; + unsigned char bom[4] = { 0, 0, 0, 0 }; + +#if defined(ANSI_CFG) || !defined(_WIN32) + f = plat_fopen(fn, "rt"); +#else + f = plat_fopen(fn, "rt, ccs=UTF-8"); +#endif + if (f == NULL) return(0); + fread(bom, 1, 3, f); + if (bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF) + { + fclose(f); + return 1; + } + fclose(f); + return 0; +} /* Read and parse the configuration file into memory. */ static int @@ -288,9 +309,10 @@ config_read(char *fn) wchar_t buff[1024]; section_t *sec, *ns; entry_t *ne; - int c, d; + int c, d, bom; FILE *f; + bom = config_detect_bom(fn); #if defined(ANSI_CFG) || !defined(_WIN32) f = plat_fopen(fn, "rt"); #else @@ -302,6 +324,8 @@ config_read(char *fn) memset(sec, 0x00, sizeof(section_t)); memset(&config_head, 0x00, sizeof(list_t)); list_add(&sec->list, &config_head); + if (bom) + fseek(f, 3, SEEK_SET); while (1) { memset(buff, 0x00, sizeof(buff)); From 8251d2b24420905753a83a42ea5c2682a4114cef Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 24 Aug 2021 14:23:12 +0600 Subject: [PATCH 27/75] Change ftello64 to ftell since it got truncated anyway --- src/disk/mo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/mo.c b/src/disk/mo.c index fb02af39d..d6924a438 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -361,7 +361,7 @@ mo_load(mo_t *dev, char *fn) } fseek(dev->drv->f, 0, SEEK_END); - size = (uint32_t) ftello64(dev->drv->f); + size = (uint32_t) ftell(dev->drv->f); if (is_mdi) { /* This is a MDI image. */ From 635ef60c534db3ed856f53ebb10eb02db7ddcd98 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 24 Aug 2021 14:23:38 +0600 Subject: [PATCH 28/75] Fix buffer overflow on window title sets --- src/unix/unix_sdl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 83428bcfb..b7f3fa075 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -433,7 +433,7 @@ wchar_t* ui_window_title(wchar_t* str) SDL_SetWindowTitle(sdl_win, (char*)str); return str; } - res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)str, wcslen(str) * sizeof(wchar_t)); + res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)str, wcslen(str) * sizeof(wchar_t) + sizeof(wchar_t)); if (res) { SDL_SetWindowTitle(sdl_win, res); From 0ea1872d67d1775a744dd3f6be84773152b339e1 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 24 Aug 2021 18:07:23 +0600 Subject: [PATCH 29/75] Change SDL_SetWindowMouseGrab to SDL_SetRelativeMouseMode --- src/unix/unix_sdl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index b7f3fa075..43de3a09d 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -269,7 +269,7 @@ sdl_set_fs(int fs) sdl_enabled = 0; sdl_destroy_texture(); SDL_SetWindowFullscreen(sdl_win, fs ? SDL_WINDOW_FULLSCREEN : 0); - SDL_SetWindowMouseGrab(sdl_win, mouse_capture); + SDL_SetRelativeMouseMode((SDL_bool)mouse_capture); sdl_fs = fs; @@ -441,4 +441,4 @@ wchar_t* ui_window_title(wchar_t* str) SDL_free((void*)res); } return str; -} \ No newline at end of file +} From d24359bc33d49df38e72b6d260213f5e9f26b123 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 00:09:02 +0600 Subject: [PATCH 30/75] Fix incorrect keypad input --- src/unix/unix.c | 51 +++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 88b638281..20fe1183d 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -112,19 +112,19 @@ static const uint16_t sdl_to_xt[0x200] = [SDL_SCANCODE_F10] = 0x44, [SDL_SCANCODE_NUMLOCKCLEAR] = 0x45, [SDL_SCANCODE_SCROLLLOCK] = 0x46, - [SDL_SCANCODE_HOME] = 0x47, - [SDL_SCANCODE_UP] = 0x48, - [SDL_SCANCODE_PAGEUP] = 0x49, + [SDL_SCANCODE_HOME] = 0x147, + [SDL_SCANCODE_UP] = 0x148, + [SDL_SCANCODE_PAGEUP] = 0x149, [SDL_SCANCODE_KP_MINUS] = 0x4A, - [SDL_SCANCODE_LEFT] = 0x4B, + [SDL_SCANCODE_LEFT] = 0x14B, [SDL_SCANCODE_KP_5] = 0x4C, - [SDL_SCANCODE_RIGHT] = 0x4D, + [SDL_SCANCODE_RIGHT] = 0x14D, [SDL_SCANCODE_KP_PLUS] = 0x4E, - [SDL_SCANCODE_END] = 0x4F, - [SDL_SCANCODE_DOWN] = 0x50, - [SDL_SCANCODE_PAGEDOWN] = 0x51, - [SDL_SCANCODE_INSERT] = 0x52, - [SDL_SCANCODE_DELETE] = 0x53, + [SDL_SCANCODE_END] = 0x14F, + [SDL_SCANCODE_DOWN] = 0x150, + [SDL_SCANCODE_PAGEDOWN] = 0x151, + [SDL_SCANCODE_INSERT] = 0x152, + [SDL_SCANCODE_DELETE] = 0x153, [SDL_SCANCODE_F11] = 0x57, [SDL_SCANCODE_F12] = 0x58, @@ -503,8 +503,6 @@ do_stop(void) is_quit = 1; - /* Give the thread the time to shut down. */ - plat_delay_ms(200); startblit(); sdl_close(); @@ -553,7 +551,6 @@ wchar_t* ui_sb_bugui(wchar_t *str) } extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); -int numlock = 0; typedef struct mouseinputdata { @@ -575,6 +572,7 @@ void mouse_poll() extern int real_sdl_w, real_sdl_h; +static int exit_event = 0; void ui_sb_set_ready(int ready) {} int main(int argc, char** argv) { @@ -615,7 +613,7 @@ int main(int argc, char** argv) switch(event.type) { case SDL_QUIT: - do_stop(); + exit_event = 1; break; case SDL_MOUSEWHEEL: { @@ -684,25 +682,19 @@ int main(int argc, char** argv) } break; } + case SDL_RENDER_DEVICE_RESET: + case SDL_RENDER_TARGETS_RESET: + { + extern void sdl_reinit_texture(); + sdl_reinit_texture(); + break; + } case SDL_KEYDOWN: case SDL_KEYUP: { uint16_t xtkey = 0; switch(event.key.keysym.scancode) { - case SDL_SCANCODE_KP_1 ... SDL_SCANCODE_KP_0: - { - if (numlock) - { - xtkey = (event.key.keysym.scancode - SDL_SCANCODE_KP_1) + 2; - } - else xtkey = sdl_to_xt[event.key.keysym.scancode]; - break; - } - case SDL_SCANCODE_NUMLOCKCLEAR: - { - if (event.type == SDL_KEYDOWN) numlock ^= 1; - } default: xtkey = sdl_to_xt[event.key.keysym.scancode]; break; @@ -724,6 +716,11 @@ int main(int argc, char** argv) onesec_tic = SDL_GetTicks(); pc_onesec(); } + if (exit_event) + { + do_stop(); + break; + } } SDL_DestroyMutex(blitmtx); From 91e27c0ffc28da37aca91c934f545c724f08ac1b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 01:28:25 +0600 Subject: [PATCH 31/75] Second shot at fixing macOS compilation --- src/include/tinyglib.h | 1 - src/network/slirp/misc.c | 2 +- src/network/slirp/tinyglib.c | 2 +- src/network/slirp/util.c | 1 + 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/tinyglib.h b/src/include/tinyglib.h index 7c6e0b890..202bf2d7a 100644 --- a/src/include/tinyglib.h +++ b/src/include/tinyglib.h @@ -25,7 +25,6 @@ #include #include #include -#include #include #define HAVE_STDARG_H #include <86box/86box.h> diff --git a/src/network/slirp/misc.c b/src/network/slirp/misc.c index 371212b34..a0b41fa49 100644 --- a/src/network/slirp/misc.c +++ b/src/network/slirp/misc.c @@ -388,4 +388,4 @@ int slirp_bind_outbound(struct socket *so, unsigned short af) ret = bind(so->s, addr, addr_size); } return ret; -} \ No newline at end of file +} diff --git a/src/network/slirp/tinyglib.c b/src/network/slirp/tinyglib.c index 0639e2832..8baa576eb 100644 --- a/src/network/slirp/tinyglib.c +++ b/src/network/slirp/tinyglib.c @@ -15,7 +15,7 @@ * Copyright 2020 RichardG. */ #include - +#include /* Must be a function, as libslirp redefines it as a macro. */ gboolean diff --git a/src/network/slirp/util.c b/src/network/slirp/util.c index 70f9570d0..8478c48d6 100644 --- a/src/network/slirp/util.c +++ b/src/network/slirp/util.c @@ -31,6 +31,7 @@ #include #include #include +#include #if defined(_WIN32) int slirp_inet_aton(const char *cp, struct in_addr *ia) From c46ebc6a5ecf0f7b298fd2a441aff6f7685509ce Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 02:01:39 +0600 Subject: [PATCH 32/75] Fix macOS compilation for real --- src/network/slirp/misc.c | 6 ++++++ src/unix/unix.c | 10 +++++----- src/unix/unix_sdl.c | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/network/slirp/misc.c b/src/network/slirp/misc.c index a0b41fa49..4b520fc43 100644 --- a/src/network/slirp/misc.c +++ b/src/network/slirp/misc.c @@ -7,6 +7,12 @@ #include #ifdef G_OS_UNIX #include +#include +#ifdef BSD +#define g_strlcpy strlcpy +#else +extern int g_strlcpy(gchar* dest, const gchar* src, gsize dest_size); +#endif #endif extern inline void insque(void *a, void *b) diff --git a/src/unix/unix.c b/src/unix/unix.c index 20fe1183d..41cfa9173 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include <86box/86box.h> #include <86box/keyboard.h> #include <86box/mouse.h> @@ -183,7 +183,7 @@ plat_tempfile(char *bufp, char *prefix, char *suffix) gettimeofday(&t, NULL); curtime = time(NULL); calendertime = localtime(&curtime); - sprintf(&bufp[strlen(bufp)], "%d%02d%02d-%02d%02d%02d-%03d%s", calendertime->tm_year, calendertime->tm_mon, calendertime->tm_mday, calendertime->tm_hour, calendertime->tm_min, calendertime->tm_sec, t.tv_usec / 1000, suffix); + sprintf(&bufp[strlen(bufp)], "%d%02d%02d-%02d%02d%02d-%03ld%s", calendertime->tm_year, calendertime->tm_mon, calendertime->tm_mday, calendertime->tm_hour, calendertime->tm_min, calendertime->tm_sec, t.tv_usec / 1000, suffix); } int @@ -514,14 +514,14 @@ do_stop(void) int ui_msgbox(int flags, void *message) { - fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu\n", flags, (uint64_t) message); + fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu\n", flags, (unsigned long long) message); return 0; } int ui_msgbox_header(int flags, void *message, void* header) { // Parameters that are passed will crash the program so keep these off for the time being. - fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu, hdrid: %llu\n", flags, (uint64_t) message, (uint64_t) header); + fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu, hdrid: %llu\n", flags, (unsigned long long) message, (unsigned long long) header); return 0; } @@ -742,4 +742,4 @@ void startblit() void endblit() { SDL_UnlockMutex(blitmtx); -} \ No newline at end of file +} diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 43de3a09d..79e9749ac 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include From d47d41174bd5bcbbb2c00003b185a8d8df99ebe2 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 12:51:58 +0600 Subject: [PATCH 33/75] Default to Z_FILTERED if PNG_Z_DEFAULT_STRATEGY isn't defined --- src/printer/png.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/printer/png.c b/src/printer/png.c index 24a733c76..4941c3098 100644 --- a/src/printer/png.c +++ b/src/printer/png.c @@ -65,6 +65,9 @@ # define PATH_PNG_DLL "libpng16.so" #endif +#ifndef PNG_Z_DEFAULT_STRATEGY +#define PNG_Z_DEFAULT_STRATEGY 1 +#endif # define PNGFUNC(x) png_ ## x From a903e24702a9751dc981c5ba55c201fec3febf73 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 13:45:21 +0600 Subject: [PATCH 34/75] Fix remaining warnings --- src/codegen/codegen_x86-64.c | 1 + src/include/86box/86box.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index b295c251e..e3e6ced89 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #define HAVE_STDARG_H diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 5879a632e..3d9155066 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -45,6 +45,13 @@ # define ENABLE_LOG_COMMANDS 1 #endif +#ifdef MIN +#undef MIN +#endif +#ifdef MAX +#undef MAX +#endif + #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define ABS(x) ((x) > 0 ? (x) : -(x)) From 7856884a2bb2d4bdafe63bf0d1d205bd0fccdaa6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 14:25:10 +0600 Subject: [PATCH 35/75] CMake OpenAL include directory variable is without a S --- src/CMakeLists.txt | 2 +- src/sound/openal.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 616a01772..9d35e510c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,7 +51,7 @@ find_package(Freetype REQUIRED) include_directories(${FREETYPE_INCLUDE_DIRS}) find_package(OpenAL CONFIG REQUIRED) -include_directories(${OPENAL_INCLUDE_DIRS}) +include_directories(${OPENAL_INCLUDE_DIR}) target_link_libraries(86Box OpenAL::OpenAL) find_package(SDL2 CONFIG REQUIRED) diff --git a/src/sound/openal.c b/src/sound/openal.c index 39819f591..f0d62b5b5 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -26,9 +26,9 @@ # undef ALC_API # define AL_LIBTYPE_STATIC # define ALC_LIBTYPE_STATIC -# include -# include -# include +# include +# include +# include #include <86box/86box.h> #include <86box/sound.h> #include <86box/midi.h> From 4090b0fac701734aadf462011f1844bf471ee5b1 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 15:17:46 +0600 Subject: [PATCH 36/75] Change OpenAL include statement to be what CMake docs suggest Also WIP QEMU-like monitor. --- src/sound/openal.c | 6 +++--- src/unix/unix.c | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/sound/openal.c b/src/sound/openal.c index f0d62b5b5..cf6ec9491 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -26,9 +26,9 @@ # undef ALC_API # define AL_LIBTYPE_STATIC # define ALC_LIBTYPE_STATIC -# include -# include -# include +# include "al.h" +# include "alc.h" +# include "alext.h" #include <86box/86box.h> #include <86box/sound.h> #include <86box/midi.h> diff --git a/src/unix/unix.c b/src/unix/unix.c index 41cfa9173..db0f03524 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -574,6 +574,16 @@ void mouse_poll() extern int real_sdl_w, real_sdl_h; static int exit_event = 0; void ui_sb_set_ready(int ready) {} + +void monitor_thread(void* param) +{ + if (isatty(fileno(stdin)) && isatty(fileno(stdout))) + { + printf("86Box monitor console.\n"); + + } +} + int main(int argc, char** argv) { SDL_Event event; From ea641cc0ae9e29df402c8068b7470c947506d325 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 15:34:40 +0600 Subject: [PATCH 37/75] Look for OpenAL in the proper way --- src/CMakeLists.txt | 4 ++-- src/unix/unix.c | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9d35e510c..a13564310 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,9 +50,9 @@ target_link_libraries(86Box cpu chipset mch dev mem fdd game cdrom zip mo hdd find_package(Freetype REQUIRED) include_directories(${FREETYPE_INCLUDE_DIRS}) -find_package(OpenAL CONFIG REQUIRED) +find_package(OpenAL REQUIRED) include_directories(${OPENAL_INCLUDE_DIR}) -target_link_libraries(86Box OpenAL::OpenAL) +target_link_libraries(86Box ${OPENAL_LIBRARY}) find_package(SDL2 CONFIG REQUIRED) include_directories(${SDL2_INCLUDE_DIRS}) diff --git a/src/unix/unix.c b/src/unix/unix.c index db0f03524..d7ead6bde 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -2,6 +2,7 @@ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE64_SOURCE 1 #endif +#define _POSIX_C_SOURCE 200809L #include #include #include @@ -579,8 +580,23 @@ void monitor_thread(void* param) { if (isatty(fileno(stdin)) && isatty(fileno(stdout))) { + char* line = NULL; + size_t n; printf("86Box monitor console.\n"); - + while (!exit_event) + { + printf("(86Box) "); + getline(&line, &n, stdin); + if (line) + { + line[n - 1] = '\0'; + if (strncasecmp(line, "exit", 4) == 0) + { + exit_event = 1; + } + free(line); + } + } } } @@ -616,6 +632,7 @@ int main(int argc, char** argv) /* Initialize the rendering window, or fullscreen. */ do_start(); + thread_create(monitor_thread, NULL); while (!is_quit) { static int onesec_tic = 0; From cb2d0a1046750848a857c471b9a743ec2c5281fc Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 15:47:24 +0600 Subject: [PATCH 38/75] Use local copy of alext.h for the time being --- src/include/alext.h | 516 ++++++++++++++++++++++++++++++++++++++++++++ src/unix/unix.c | 4 + 2 files changed, 520 insertions(+) create mode 100644 src/include/alext.h diff --git a/src/include/alext.h b/src/include/alext.h new file mode 100644 index 000000000..cd7f2750d --- /dev/null +++ b/src/include/alext.h @@ -0,0 +1,516 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2008 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#ifndef AL_ALEXT_H +#define AL_ALEXT_H + +#include +/* Define int64_t and uint64_t types */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif + +#include "alc.h" +#include "al.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef AL_LOKI_IMA_ADPCM_format +#define AL_LOKI_IMA_ADPCM_format 1 +#define AL_FORMAT_IMA_ADPCM_MONO16_EXT 0x10000 +#define AL_FORMAT_IMA_ADPCM_STEREO16_EXT 0x10001 +#endif + +#ifndef AL_LOKI_WAVE_format +#define AL_LOKI_WAVE_format 1 +#define AL_FORMAT_WAVE_EXT 0x10002 +#endif + +#ifndef AL_EXT_vorbis +#define AL_EXT_vorbis 1 +#define AL_FORMAT_VORBIS_EXT 0x10003 +#endif + +#ifndef AL_LOKI_quadriphonic +#define AL_LOKI_quadriphonic 1 +#define AL_FORMAT_QUAD8_LOKI 0x10004 +#define AL_FORMAT_QUAD16_LOKI 0x10005 +#endif + +#ifndef AL_EXT_float32 +#define AL_EXT_float32 1 +#define AL_FORMAT_MONO_FLOAT32 0x10010 +#define AL_FORMAT_STEREO_FLOAT32 0x10011 +#endif + +#ifndef AL_EXT_double +#define AL_EXT_double 1 +#define AL_FORMAT_MONO_DOUBLE_EXT 0x10012 +#define AL_FORMAT_STEREO_DOUBLE_EXT 0x10013 +#endif + +#ifndef AL_EXT_MULAW +#define AL_EXT_MULAW 1 +#define AL_FORMAT_MONO_MULAW_EXT 0x10014 +#define AL_FORMAT_STEREO_MULAW_EXT 0x10015 +#endif + +#ifndef AL_EXT_ALAW +#define AL_EXT_ALAW 1 +#define AL_FORMAT_MONO_ALAW_EXT 0x10016 +#define AL_FORMAT_STEREO_ALAW_EXT 0x10017 +#endif + +#ifndef ALC_LOKI_audio_channel +#define ALC_LOKI_audio_channel 1 +#define ALC_CHAN_MAIN_LOKI 0x500001 +#define ALC_CHAN_PCM_LOKI 0x500002 +#define ALC_CHAN_CD_LOKI 0x500003 +#endif + +#ifndef AL_EXT_MCFORMATS +#define AL_EXT_MCFORMATS 1 +/* Provides support for surround sound buffer formats with 8, 16, and 32-bit + * samples. + * + * QUAD8: Unsigned 8-bit, Quadraphonic (Front Left, Front Right, Rear Left, + * Rear Right). + * QUAD16: Signed 16-bit, Quadraphonic. + * QUAD32: 32-bit float, Quadraphonic. + * REAR8: Unsigned 8-bit, Rear Stereo (Rear Left, Rear Right). + * REAR16: Signed 16-bit, Rear Stereo. + * REAR32: 32-bit float, Rear Stereo. + * 51CHN8: Unsigned 8-bit, 5.1 Surround (Front Left, Front Right, Front Center, + * LFE, Side Left, Side Right). Note that some audio systems may label + * 5.1's Side channels as Rear or Surround; they are equivalent for the + * purposes of this extension. + * 51CHN16: Signed 16-bit, 5.1 Surround. + * 51CHN32: 32-bit float, 5.1 Surround. + * 61CHN8: Unsigned 8-bit, 6.1 Surround (Front Left, Front Right, Front Center, + * LFE, Rear Center, Side Left, Side Right). + * 61CHN16: Signed 16-bit, 6.1 Surround. + * 61CHN32: 32-bit float, 6.1 Surround. + * 71CHN8: Unsigned 8-bit, 7.1 Surround (Front Left, Front Right, Front Center, + * LFE, Rear Left, Rear Right, Side Left, Side Right). + * 71CHN16: Signed 16-bit, 7.1 Surround. + * 71CHN32: 32-bit float, 7.1 Surround. + */ +#define AL_FORMAT_QUAD8 0x1204 +#define AL_FORMAT_QUAD16 0x1205 +#define AL_FORMAT_QUAD32 0x1206 +#define AL_FORMAT_REAR8 0x1207 +#define AL_FORMAT_REAR16 0x1208 +#define AL_FORMAT_REAR32 0x1209 +#define AL_FORMAT_51CHN8 0x120A +#define AL_FORMAT_51CHN16 0x120B +#define AL_FORMAT_51CHN32 0x120C +#define AL_FORMAT_61CHN8 0x120D +#define AL_FORMAT_61CHN16 0x120E +#define AL_FORMAT_61CHN32 0x120F +#define AL_FORMAT_71CHN8 0x1210 +#define AL_FORMAT_71CHN16 0x1211 +#define AL_FORMAT_71CHN32 0x1212 +#endif + +#ifndef AL_EXT_MULAW_MCFORMATS +#define AL_EXT_MULAW_MCFORMATS 1 +#define AL_FORMAT_MONO_MULAW 0x10014 +#define AL_FORMAT_STEREO_MULAW 0x10015 +#define AL_FORMAT_QUAD_MULAW 0x10021 +#define AL_FORMAT_REAR_MULAW 0x10022 +#define AL_FORMAT_51CHN_MULAW 0x10023 +#define AL_FORMAT_61CHN_MULAW 0x10024 +#define AL_FORMAT_71CHN_MULAW 0x10025 +#endif + +#ifndef AL_EXT_IMA4 +#define AL_EXT_IMA4 1 +#define AL_FORMAT_MONO_IMA4 0x1300 +#define AL_FORMAT_STEREO_IMA4 0x1301 +#endif + +#ifndef AL_EXT_STATIC_BUFFER +#define AL_EXT_STATIC_BUFFER 1 +typedef ALvoid (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei); +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq); +#endif +#endif + +#ifndef ALC_EXT_EFX +#define ALC_EXT_EFX 1 +#include "efx.h" +#endif + +#ifndef ALC_EXT_disconnect +#define ALC_EXT_disconnect 1 +#define ALC_CONNECTED 0x313 +#endif + +#ifndef ALC_EXT_thread_local_context +#define ALC_EXT_thread_local_context 1 +typedef ALCboolean (ALC_APIENTRY*PFNALCSETTHREADCONTEXTPROC)(ALCcontext *context); +typedef ALCcontext* (ALC_APIENTRY*PFNALCGETTHREADCONTEXTPROC)(void); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context); +ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void); +#endif +#endif + +#ifndef AL_EXT_source_distance_model +#define AL_EXT_source_distance_model 1 +#define AL_SOURCE_DISTANCE_MODEL 0x200 +#endif + +#ifndef AL_SOFT_buffer_sub_data +#define AL_SOFT_buffer_sub_data 1 +#define AL_BYTE_RW_OFFSETS_SOFT 0x1031 +#define AL_SAMPLE_RW_OFFSETS_SOFT 0x1032 +typedef ALvoid (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei); +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length); +#endif +#endif + +#ifndef AL_SOFT_loop_points +#define AL_SOFT_loop_points 1 +#define AL_LOOP_POINTS_SOFT 0x2015 +#endif + +#ifndef AL_EXT_FOLDBACK +#define AL_EXT_FOLDBACK 1 +#define AL_EXT_FOLDBACK_NAME "AL_EXT_FOLDBACK" +#define AL_FOLDBACK_EVENT_BLOCK 0x4112 +#define AL_FOLDBACK_EVENT_START 0x4111 +#define AL_FOLDBACK_EVENT_STOP 0x4113 +#define AL_FOLDBACK_MODE_MONO 0x4101 +#define AL_FOLDBACK_MODE_STEREO 0x4102 +typedef void (AL_APIENTRY*LPALFOLDBACKCALLBACK)(ALenum,ALsizei); +typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTART)(ALenum,ALsizei,ALsizei,ALfloat*,LPALFOLDBACKCALLBACK); +typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTOP)(void); +#ifdef AL_ALEXT_PROTOTYPES +AL_API void AL_APIENTRY alRequestFoldbackStart(ALenum mode,ALsizei count,ALsizei length,ALfloat *mem,LPALFOLDBACKCALLBACK callback); +AL_API void AL_APIENTRY alRequestFoldbackStop(void); +#endif +#endif + +#ifndef ALC_EXT_DEDICATED +#define ALC_EXT_DEDICATED 1 +#define AL_DEDICATED_GAIN 0x0001 +#define AL_EFFECT_DEDICATED_DIALOGUE 0x9001 +#define AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT 0x9000 +#endif + +#ifndef AL_SOFT_buffer_samples +#define AL_SOFT_buffer_samples 1 +/* Channel configurations */ +#define AL_MONO_SOFT 0x1500 +#define AL_STEREO_SOFT 0x1501 +#define AL_REAR_SOFT 0x1502 +#define AL_QUAD_SOFT 0x1503 +#define AL_5POINT1_SOFT 0x1504 +#define AL_6POINT1_SOFT 0x1505 +#define AL_7POINT1_SOFT 0x1506 + +/* Sample types */ +#define AL_BYTE_SOFT 0x1400 +#define AL_UNSIGNED_BYTE_SOFT 0x1401 +#define AL_SHORT_SOFT 0x1402 +#define AL_UNSIGNED_SHORT_SOFT 0x1403 +#define AL_INT_SOFT 0x1404 +#define AL_UNSIGNED_INT_SOFT 0x1405 +#define AL_FLOAT_SOFT 0x1406 +#define AL_DOUBLE_SOFT 0x1407 +#define AL_BYTE3_SOFT 0x1408 +#define AL_UNSIGNED_BYTE3_SOFT 0x1409 + +/* Storage formats */ +#define AL_MONO8_SOFT 0x1100 +#define AL_MONO16_SOFT 0x1101 +#define AL_MONO32F_SOFT 0x10010 +#define AL_STEREO8_SOFT 0x1102 +#define AL_STEREO16_SOFT 0x1103 +#define AL_STEREO32F_SOFT 0x10011 +#define AL_QUAD8_SOFT 0x1204 +#define AL_QUAD16_SOFT 0x1205 +#define AL_QUAD32F_SOFT 0x1206 +#define AL_REAR8_SOFT 0x1207 +#define AL_REAR16_SOFT 0x1208 +#define AL_REAR32F_SOFT 0x1209 +#define AL_5POINT1_8_SOFT 0x120A +#define AL_5POINT1_16_SOFT 0x120B +#define AL_5POINT1_32F_SOFT 0x120C +#define AL_6POINT1_8_SOFT 0x120D +#define AL_6POINT1_16_SOFT 0x120E +#define AL_6POINT1_32F_SOFT 0x120F +#define AL_7POINT1_8_SOFT 0x1210 +#define AL_7POINT1_16_SOFT 0x1211 +#define AL_7POINT1_32F_SOFT 0x1212 + +/* Buffer attributes */ +#define AL_INTERNAL_FORMAT_SOFT 0x2008 +#define AL_BYTE_LENGTH_SOFT 0x2009 +#define AL_SAMPLE_LENGTH_SOFT 0x200A +#define AL_SEC_LENGTH_SOFT 0x200B + +typedef void (AL_APIENTRY*LPALBUFFERSAMPLESSOFT)(ALuint,ALuint,ALenum,ALsizei,ALenum,ALenum,const ALvoid*); +typedef void (AL_APIENTRY*LPALBUFFERSUBSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,const ALvoid*); +typedef void (AL_APIENTRY*LPALGETBUFFERSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,ALvoid*); +typedef ALboolean (AL_APIENTRY*LPALISBUFFERFORMATSUPPORTEDSOFT)(ALenum); +#ifdef AL_ALEXT_PROTOTYPES +AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, ALuint samplerate, ALenum internalformat, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); +AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); +AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data); +AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format); +#endif +#endif + +#ifndef AL_SOFT_direct_channels +#define AL_SOFT_direct_channels 1 +#define AL_DIRECT_CHANNELS_SOFT 0x1033 +#endif + +#ifndef ALC_SOFT_loopback +#define ALC_SOFT_loopback 1 +#define ALC_FORMAT_CHANNELS_SOFT 0x1990 +#define ALC_FORMAT_TYPE_SOFT 0x1991 + +/* Sample types */ +#define ALC_BYTE_SOFT 0x1400 +#define ALC_UNSIGNED_BYTE_SOFT 0x1401 +#define ALC_SHORT_SOFT 0x1402 +#define ALC_UNSIGNED_SHORT_SOFT 0x1403 +#define ALC_INT_SOFT 0x1404 +#define ALC_UNSIGNED_INT_SOFT 0x1405 +#define ALC_FLOAT_SOFT 0x1406 + +/* Channel configurations */ +#define ALC_MONO_SOFT 0x1500 +#define ALC_STEREO_SOFT 0x1501 +#define ALC_QUAD_SOFT 0x1503 +#define ALC_5POINT1_SOFT 0x1504 +#define ALC_6POINT1_SOFT 0x1505 +#define ALC_7POINT1_SOFT 0x1506 + +typedef ALCdevice* (ALC_APIENTRY*LPALCLOOPBACKOPENDEVICESOFT)(const ALCchar*); +typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice*,ALCsizei,ALCenum,ALCenum); +typedef void (ALC_APIENTRY*LPALCRENDERSAMPLESSOFT)(ALCdevice*,ALCvoid*,ALCsizei); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName); +ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type); +ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); +#endif +#endif + +#ifndef AL_EXT_STEREO_ANGLES +#define AL_EXT_STEREO_ANGLES 1 +#define AL_STEREO_ANGLES 0x1030 +#endif + +#ifndef AL_EXT_SOURCE_RADIUS +#define AL_EXT_SOURCE_RADIUS 1 +#define AL_SOURCE_RADIUS 0x1031 +#endif + +#ifndef AL_SOFT_source_latency +#define AL_SOFT_source_latency 1 +#define AL_SAMPLE_OFFSET_LATENCY_SOFT 0x1200 +#define AL_SEC_OFFSET_LATENCY_SOFT 0x1201 +typedef int64_t ALint64SOFT; +typedef uint64_t ALuint64SOFT; +typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble); +typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble); +typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*); +typedef void (AL_APIENTRY*LPALGETSOURCEDSOFT)(ALuint,ALenum,ALdouble*); +typedef void (AL_APIENTRY*LPALGETSOURCE3DSOFT)(ALuint,ALenum,ALdouble*,ALdouble*,ALdouble*); +typedef void (AL_APIENTRY*LPALGETSOURCEDVSOFT)(ALuint,ALenum,ALdouble*); +typedef void (AL_APIENTRY*LPALSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT); +typedef void (AL_APIENTRY*LPALSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT,ALint64SOFT,ALint64SOFT); +typedef void (AL_APIENTRY*LPALSOURCEI64VSOFT)(ALuint,ALenum,const ALint64SOFT*); +typedef void (AL_APIENTRY*LPALGETSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT*); +typedef void (AL_APIENTRY*LPALGETSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT*,ALint64SOFT*,ALint64SOFT*); +typedef void (AL_APIENTRY*LPALGETSOURCEI64VSOFT)(ALuint,ALenum,ALint64SOFT*); +#ifdef AL_ALEXT_PROTOTYPES +AL_API void AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value); +AL_API void AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3); +AL_API void AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values); +AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value); +AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3); +AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values); +AL_API void AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value); +AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3); +AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values); +AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value); +AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3); +AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values); +#endif +#endif + +#ifndef ALC_EXT_DEFAULT_FILTER_ORDER +#define ALC_EXT_DEFAULT_FILTER_ORDER 1 +#define ALC_DEFAULT_FILTER_ORDER 0x1100 +#endif + +#ifndef AL_SOFT_deferred_updates +#define AL_SOFT_deferred_updates 1 +#define AL_DEFERRED_UPDATES_SOFT 0xC002 +typedef ALvoid (AL_APIENTRY*LPALDEFERUPDATESSOFT)(void); +typedef ALvoid (AL_APIENTRY*LPALPROCESSUPDATESSOFT)(void); +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void); +AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void); +#endif +#endif + +#ifndef AL_SOFT_block_alignment +#define AL_SOFT_block_alignment 1 +#define AL_UNPACK_BLOCK_ALIGNMENT_SOFT 0x200C +#define AL_PACK_BLOCK_ALIGNMENT_SOFT 0x200D +#endif + +#ifndef AL_SOFT_MSADPCM +#define AL_SOFT_MSADPCM 1 +#define AL_FORMAT_MONO_MSADPCM_SOFT 0x1302 +#define AL_FORMAT_STEREO_MSADPCM_SOFT 0x1303 +#endif + +#ifndef AL_SOFT_source_length +#define AL_SOFT_source_length 1 +/*#define AL_BYTE_LENGTH_SOFT 0x2009*/ +/*#define AL_SAMPLE_LENGTH_SOFT 0x200A*/ +/*#define AL_SEC_LENGTH_SOFT 0x200B*/ +#endif + +#ifndef ALC_SOFT_pause_device +#define ALC_SOFT_pause_device 1 +typedef void (ALC_APIENTRY*LPALCDEVICEPAUSESOFT)(ALCdevice *device); +typedef void (ALC_APIENTRY*LPALCDEVICERESUMESOFT)(ALCdevice *device); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device); +ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device); +#endif +#endif + +#ifndef AL_EXT_BFORMAT +#define AL_EXT_BFORMAT 1 +/* Provides support for B-Format ambisonic buffers (first-order, FuMa scaling + * and layout). + * + * BFORMAT2D_8: Unsigned 8-bit, 3-channel non-periphonic (WXY). + * BFORMAT2D_16: Signed 16-bit, 3-channel non-periphonic (WXY). + * BFORMAT2D_FLOAT32: 32-bit float, 3-channel non-periphonic (WXY). + * BFORMAT3D_8: Unsigned 8-bit, 4-channel periphonic (WXYZ). + * BFORMAT3D_16: Signed 16-bit, 4-channel periphonic (WXYZ). + * BFORMAT3D_FLOAT32: 32-bit float, 4-channel periphonic (WXYZ). + */ +#define AL_FORMAT_BFORMAT2D_8 0x20021 +#define AL_FORMAT_BFORMAT2D_16 0x20022 +#define AL_FORMAT_BFORMAT2D_FLOAT32 0x20023 +#define AL_FORMAT_BFORMAT3D_8 0x20031 +#define AL_FORMAT_BFORMAT3D_16 0x20032 +#define AL_FORMAT_BFORMAT3D_FLOAT32 0x20033 +#endif + +#ifndef AL_EXT_MULAW_BFORMAT +#define AL_EXT_MULAW_BFORMAT 1 +#define AL_FORMAT_BFORMAT2D_MULAW 0x10031 +#define AL_FORMAT_BFORMAT3D_MULAW 0x10032 +#endif + +#ifndef ALC_SOFT_HRTF +#define ALC_SOFT_HRTF 1 +#define ALC_HRTF_SOFT 0x1992 +#define ALC_DONT_CARE_SOFT 0x0002 +#define ALC_HRTF_STATUS_SOFT 0x1993 +#define ALC_HRTF_DISABLED_SOFT 0x0000 +#define ALC_HRTF_ENABLED_SOFT 0x0001 +#define ALC_HRTF_DENIED_SOFT 0x0002 +#define ALC_HRTF_REQUIRED_SOFT 0x0003 +#define ALC_HRTF_HEADPHONES_DETECTED_SOFT 0x0004 +#define ALC_HRTF_UNSUPPORTED_FORMAT_SOFT 0x0005 +#define ALC_NUM_HRTF_SPECIFIERS_SOFT 0x1994 +#define ALC_HRTF_SPECIFIER_SOFT 0x1995 +#define ALC_HRTF_ID_SOFT 0x1996 +typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice *device, ALCenum paramName, ALCsizei index); +typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice *device, const ALCint *attribs); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum paramName, ALCsizei index); +ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs); +#endif +#endif + +#ifndef AL_SOFT_gain_clamp_ex +#define AL_SOFT_gain_clamp_ex 1 +#define AL_GAIN_LIMIT_SOFT 0x200E +#endif + +#ifndef AL_SOFT_source_resampler +#define AL_SOFT_source_resampler +#define AL_NUM_RESAMPLERS_SOFT 0x1210 +#define AL_DEFAULT_RESAMPLER_SOFT 0x1211 +#define AL_SOURCE_RESAMPLER_SOFT 0x1212 +#define AL_RESAMPLER_NAME_SOFT 0x1213 +typedef const ALchar* (AL_APIENTRY*LPALGETSTRINGISOFT)(ALenum pname, ALsizei index); +#ifdef AL_ALEXT_PROTOTYPES +AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index); +#endif +#endif + +#ifndef AL_SOFT_source_spatialize +#define AL_SOFT_source_spatialize +#define AL_SOURCE_SPATIALIZE_SOFT 0x1214 +#define AL_AUTO_SOFT 0x0002 +#endif + +#ifndef ALC_SOFT_output_limiter +#define ALC_SOFT_output_limiter +#define ALC_OUTPUT_LIMITER_SOFT 0x199A +#endif + +#ifndef ALC_SOFT_device_clock +#define ALC_SOFT_device_clock 1 +typedef int64_t ALCint64SOFT; +typedef uint64_t ALCuint64SOFT; +#define ALC_DEVICE_CLOCK_SOFT 0x1600 +#define ALC_DEVICE_LATENCY_SOFT 0x1601 +#define ALC_DEVICE_CLOCK_LATENCY_SOFT 0x1602 +#define AL_SAMPLE_OFFSET_CLOCK_SOFT 0x1202 +#define AL_SEC_OFFSET_CLOCK_SOFT 0x1203 +typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values); +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/unix/unix.c b/src/unix/unix.c index d7ead6bde..85c91c081 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -593,6 +593,10 @@ void monitor_thread(void* param) if (strncasecmp(line, "exit", 4) == 0) { exit_event = 1; + } + else if (strncasecmp(line, "fddload", sizeof("fddload") - 1) == 0) + { + } free(line); } From 88d14eb19411b57c6ce3dba4eae5d32b5bfcf4bb Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 20:13:14 +0600 Subject: [PATCH 39/75] Fix MinGW build --- src/network/slirp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/slirp/CMakeLists.txt b/src/network/slirp/CMakeLists.txt index c04790265..2a6a8adb9 100644 --- a/src/network/slirp/CMakeLists.txt +++ b/src/network/slirp/CMakeLists.txt @@ -20,5 +20,5 @@ add_library(slirp STATIC tinyglib.c arp_table.c bootp.c cksum.c dnssearch.c if.c #target_link_libraries(slirp wsock32 iphlpapi) #target_link_libraries(slirp) if (CMAKE_SYSTEM_NAME MATCHES "Windows") -target_link_libraries(wsock32 iphlpapi) +target_link_libraries(slirp wsock32 iphlpapi) endif() From eb14e132a314a8a26bc8edf707de332ece3fcf7e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 20:15:19 +0600 Subject: [PATCH 40/75] Define _DARWIN_C_SOURCE before includes on macOS --- src/unix/unix.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index 85c91c081..ee4e62be5 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -3,6 +3,9 @@ #define _LARGEFILE64_SOURCE 1 #endif #define _POSIX_C_SOURCE 200809L +#ifdef __APPLE__ +#define _DARWIN_C_SOURCE 1 +#endif #include #include #include From 1fa760a1612b1c138b7d44be93f092691b581a24 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 25 Aug 2021 22:34:58 +0600 Subject: [PATCH 41/75] Use local OpenAL headers fddload command implemented --- src/include/AL/al.h | 656 +++++++++++++++++++++++++++++ src/include/AL/alc.h | 237 +++++++++++ src/include/{ => AL}/alext.h | 0 src/include/AL/efx-creative.h | 3 + src/include/AL/efx-presets.h | 402 ++++++++++++++++++ src/include/AL/efx.h | 761 ++++++++++++++++++++++++++++++++++ src/sound/openal.c | 6 +- src/unix/unix.c | 84 +++- 8 files changed, 2142 insertions(+), 7 deletions(-) create mode 100644 src/include/AL/al.h create mode 100644 src/include/AL/alc.h rename src/include/{ => AL}/alext.h (100%) create mode 100644 src/include/AL/efx-creative.h create mode 100644 src/include/AL/efx-presets.h create mode 100644 src/include/AL/efx.h diff --git a/src/include/AL/al.h b/src/include/AL/al.h new file mode 100644 index 000000000..413b38331 --- /dev/null +++ b/src/include/AL/al.h @@ -0,0 +1,656 @@ +#ifndef AL_AL_H +#define AL_AL_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef AL_API + #if defined(AL_LIBTYPE_STATIC) + #define AL_API + #elif defined(_WIN32) + #define AL_API __declspec(dllimport) + #else + #define AL_API extern + #endif +#endif + +#if defined(_WIN32) + #define AL_APIENTRY __cdecl +#else + #define AL_APIENTRY +#endif + + +/** Deprecated macro. */ +#define OPENAL +#define ALAPI AL_API +#define ALAPIENTRY AL_APIENTRY +#define AL_INVALID (-1) +#define AL_ILLEGAL_ENUM AL_INVALID_ENUM +#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION + +/** Supported AL version. */ +#define AL_VERSION_1_0 +#define AL_VERSION_1_1 + +/** 8-bit boolean */ +typedef char ALboolean; + +/** character */ +typedef char ALchar; + +/** signed 8-bit 2's complement integer */ +typedef signed char ALbyte; + +/** unsigned 8-bit integer */ +typedef unsigned char ALubyte; + +/** signed 16-bit 2's complement integer */ +typedef short ALshort; + +/** unsigned 16-bit integer */ +typedef unsigned short ALushort; + +/** signed 32-bit 2's complement integer */ +typedef int ALint; + +/** unsigned 32-bit integer */ +typedef unsigned int ALuint; + +/** non-negative 32-bit binary integer size */ +typedef int ALsizei; + +/** enumerated 32-bit value */ +typedef int ALenum; + +/** 32-bit IEEE754 floating-point */ +typedef float ALfloat; + +/** 64-bit IEEE754 floating-point */ +typedef double ALdouble; + +/** void type (for opaque pointers only) */ +typedef void ALvoid; + + +/* Enumerant values begin at column 50. No tabs. */ + +/** "no distance model" or "no buffer" */ +#define AL_NONE 0 + +/** Boolean False. */ +#define AL_FALSE 0 + +/** Boolean True. */ +#define AL_TRUE 1 + + +/** + * Relative source. + * Type: ALboolean + * Range: [AL_TRUE, AL_FALSE] + * Default: AL_FALSE + * + * Specifies if the Source has relative coordinates. + */ +#define AL_SOURCE_RELATIVE 0x202 + + +/** + * Inner cone angle, in degrees. + * Type: ALint, ALfloat + * Range: [0 - 360] + * Default: 360 + * + * The angle covered by the inner cone, where the source will not attenuate. + */ +#define AL_CONE_INNER_ANGLE 0x1001 + +/** + * Outer cone angle, in degrees. + * Range: [0 - 360] + * Default: 360 + * + * The angle covered by the outer cone, where the source will be fully + * attenuated. + */ +#define AL_CONE_OUTER_ANGLE 0x1002 + +/** + * Source pitch. + * Type: ALfloat + * Range: [0.5 - 2.0] + * Default: 1.0 + * + * A multiplier for the frequency (sample rate) of the source's buffer. + */ +#define AL_PITCH 0x1003 + +/** + * Source or listener position. + * Type: ALfloat[3], ALint[3] + * Default: {0, 0, 0} + * + * The source or listener location in three dimensional space. + * + * OpenAL, like OpenGL, uses a right handed coordinate system, where in a + * frontal default view X (thumb) points right, Y points up (index finger), and + * Z points towards the viewer/camera (middle finger). + * + * To switch from a left handed coordinate system, flip the sign on the Z + * coordinate. + */ +#define AL_POSITION 0x1004 + +/** + * Source direction. + * Type: ALfloat[3], ALint[3] + * Default: {0, 0, 0} + * + * Specifies the current direction in local space. + * A zero-length vector specifies an omni-directional source (cone is ignored). + */ +#define AL_DIRECTION 0x1005 + +/** + * Source or listener velocity. + * Type: ALfloat[3], ALint[3] + * Default: {0, 0, 0} + * + * Specifies the current velocity in local space. + */ +#define AL_VELOCITY 0x1006 + +/** + * Source looping. + * Type: ALboolean + * Range: [AL_TRUE, AL_FALSE] + * Default: AL_FALSE + * + * Specifies whether source is looping. + */ +#define AL_LOOPING 0x1007 + +/** + * Source buffer. + * Type: ALuint + * Range: any valid Buffer. + * + * Specifies the buffer to provide sound samples. + */ +#define AL_BUFFER 0x1009 + +/** + * Source or listener gain. + * Type: ALfloat + * Range: [0.0 - ] + * + * A value of 1.0 means unattenuated. Each division by 2 equals an attenuation + * of about -6dB. Each multiplicaton by 2 equals an amplification of about + * +6dB. + * + * A value of 0.0 is meaningless with respect to a logarithmic scale; it is + * silent. + */ +#define AL_GAIN 0x100A + +/** + * Minimum source gain. + * Type: ALfloat + * Range: [0.0 - 1.0] + * + * The minimum gain allowed for a source, after distance and cone attenation is + * applied (if applicable). + */ +#define AL_MIN_GAIN 0x100D + +/** + * Maximum source gain. + * Type: ALfloat + * Range: [0.0 - 1.0] + * + * The maximum gain allowed for a source, after distance and cone attenation is + * applied (if applicable). + */ +#define AL_MAX_GAIN 0x100E + +/** + * Listener orientation. + * Type: ALfloat[6] + * Default: {0.0, 0.0, -1.0, 0.0, 1.0, 0.0} + * + * Effectively two three dimensional vectors. The first vector is the front (or + * "at") and the second is the top (or "up"). + * + * Both vectors are in local space. + */ +#define AL_ORIENTATION 0x100F + +/** + * Source state (query only). + * Type: ALint + * Range: [AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED] + */ +#define AL_SOURCE_STATE 0x1010 + +/** Source state value. */ +#define AL_INITIAL 0x1011 +#define AL_PLAYING 0x1012 +#define AL_PAUSED 0x1013 +#define AL_STOPPED 0x1014 + +/** + * Source Buffer Queue size (query only). + * Type: ALint + * + * The number of buffers queued using alSourceQueueBuffers, minus the buffers + * removed with alSourceUnqueueBuffers. + */ +#define AL_BUFFERS_QUEUED 0x1015 + +/** + * Source Buffer Queue processed count (query only). + * Type: ALint + * + * The number of queued buffers that have been fully processed, and can be + * removed with alSourceUnqueueBuffers. + * + * Looping sources will never fully process buffers because they will be set to + * play again for when the source loops. + */ +#define AL_BUFFERS_PROCESSED 0x1016 + +/** + * Source reference distance. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + * + * The distance in units that no attenuation occurs. + * + * At 0.0, no distance attenuation ever occurs on non-linear attenuation models. + */ +#define AL_REFERENCE_DISTANCE 0x1020 + +/** + * Source rolloff factor. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + * + * Multiplier to exaggerate or diminish distance attenuation. + * + * At 0.0, no distance attenuation ever occurs. + */ +#define AL_ROLLOFF_FACTOR 0x1021 + +/** + * Outer cone gain. + * Type: ALfloat + * Range: [0.0 - 1.0] + * Default: 0.0 + * + * The gain attenuation applied when the listener is outside of the source's + * outer cone. + */ +#define AL_CONE_OUTER_GAIN 0x1022 + +/** + * Source maximum distance. + * Type: ALfloat + * Range: [0.0 - ] + * Default: +inf + * + * The distance above which the source is not attenuated any further with a + * clamped distance model, or where attenuation reaches 0.0 gain for linear + * distance models with a default rolloff factor. + */ +#define AL_MAX_DISTANCE 0x1023 + +/** Source buffer position, in seconds */ +#define AL_SEC_OFFSET 0x1024 +/** Source buffer position, in sample frames */ +#define AL_SAMPLE_OFFSET 0x1025 +/** Source buffer position, in bytes */ +#define AL_BYTE_OFFSET 0x1026 + +/** + * Source type (query only). + * Type: ALint + * Range: [AL_STATIC, AL_STREAMING, AL_UNDETERMINED] + * + * A Source is Static if a Buffer has been attached using AL_BUFFER. + * + * A Source is Streaming if one or more Buffers have been attached using + * alSourceQueueBuffers. + * + * A Source is Undetermined when it has the NULL buffer attached using + * AL_BUFFER. + */ +#define AL_SOURCE_TYPE 0x1027 + +/** Source type value. */ +#define AL_STATIC 0x1028 +#define AL_STREAMING 0x1029 +#define AL_UNDETERMINED 0x1030 + +/** Buffer format specifier. */ +#define AL_FORMAT_MONO8 0x1100 +#define AL_FORMAT_MONO16 0x1101 +#define AL_FORMAT_STEREO8 0x1102 +#define AL_FORMAT_STEREO16 0x1103 + +/** Buffer frequency (query only). */ +#define AL_FREQUENCY 0x2001 +/** Buffer bits per sample (query only). */ +#define AL_BITS 0x2002 +/** Buffer channel count (query only). */ +#define AL_CHANNELS 0x2003 +/** Buffer data size (query only). */ +#define AL_SIZE 0x2004 + +/** + * Buffer state. + * + * Not for public use. + */ +#define AL_UNUSED 0x2010 +#define AL_PENDING 0x2011 +#define AL_PROCESSED 0x2012 + + +/** No error. */ +#define AL_NO_ERROR 0 + +/** Invalid name paramater passed to AL call. */ +#define AL_INVALID_NAME 0xA001 + +/** Invalid enum parameter passed to AL call. */ +#define AL_INVALID_ENUM 0xA002 + +/** Invalid value parameter passed to AL call. */ +#define AL_INVALID_VALUE 0xA003 + +/** Illegal AL call. */ +#define AL_INVALID_OPERATION 0xA004 + +/** Not enough memory. */ +#define AL_OUT_OF_MEMORY 0xA005 + + +/** Context string: Vendor ID. */ +#define AL_VENDOR 0xB001 +/** Context string: Version. */ +#define AL_VERSION 0xB002 +/** Context string: Renderer ID. */ +#define AL_RENDERER 0xB003 +/** Context string: Space-separated extension list. */ +#define AL_EXTENSIONS 0xB004 + + +/** + * Doppler scale. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + * + * Scale for source and listener velocities. + */ +#define AL_DOPPLER_FACTOR 0xC000 +AL_API void AL_APIENTRY alDopplerFactor(ALfloat value); + +/** + * Doppler velocity (deprecated). + * + * A multiplier applied to the Speed of Sound. + */ +#define AL_DOPPLER_VELOCITY 0xC001 +AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value); + +/** + * Speed of Sound, in units per second. + * Type: ALfloat + * Range: [0.0001 - ] + * Default: 343.3 + * + * The speed at which sound waves are assumed to travel, when calculating the + * doppler effect. + */ +#define AL_SPEED_OF_SOUND 0xC003 +AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value); + +/** + * Distance attenuation model. + * Type: ALint + * Range: [AL_NONE, AL_INVERSE_DISTANCE, AL_INVERSE_DISTANCE_CLAMPED, + * AL_LINEAR_DISTANCE, AL_LINEAR_DISTANCE_CLAMPED, + * AL_EXPONENT_DISTANCE, AL_EXPONENT_DISTANCE_CLAMPED] + * Default: AL_INVERSE_DISTANCE_CLAMPED + * + * The model by which sources attenuate with distance. + * + * None - No distance attenuation. + * Inverse - Doubling the distance halves the source gain. + * Linear - Linear gain scaling between the reference and max distances. + * Exponent - Exponential gain dropoff. + * + * Clamped variations work like the non-clamped counterparts, except the + * distance calculated is clamped between the reference and max distances. + */ +#define AL_DISTANCE_MODEL 0xD000 +AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel); + +/** Distance model value. */ +#define AL_INVERSE_DISTANCE 0xD001 +#define AL_INVERSE_DISTANCE_CLAMPED 0xD002 +#define AL_LINEAR_DISTANCE 0xD003 +#define AL_LINEAR_DISTANCE_CLAMPED 0xD004 +#define AL_EXPONENT_DISTANCE 0xD005 +#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006 + +/** Renderer State management. */ +AL_API void AL_APIENTRY alEnable(ALenum capability); +AL_API void AL_APIENTRY alDisable(ALenum capability); +AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability); + +/** State retrieval. */ +AL_API const ALchar* AL_APIENTRY alGetString(ALenum param); +AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values); +AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values); +AL_API void AL_APIENTRY alGetFloatv(ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetDoublev(ALenum param, ALdouble *values); +AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum param); +AL_API ALint AL_APIENTRY alGetInteger(ALenum param); +AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param); +AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param); + +/** + * Error retrieval. + * + * Obtain the first error generated in the AL context since the last check. + */ +AL_API ALenum AL_APIENTRY alGetError(void); + +/** + * Extension support. + * + * Query for the presence of an extension, and obtain any appropriate function + * pointers and enum values. + */ +AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname); +AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname); +AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename); + + +/** Set Listener parameters */ +AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value); +AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values); +AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value); +AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3); +AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values); + +/** Get Listener parameters */ +AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value); +AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetListeneri(ALenum param, ALint *value); +AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3); +AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values); + + +/** Create Source objects. */ +AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources); +/** Delete Source objects. */ +AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources); +/** Verify a handle is a valid Source. */ +AL_API ALboolean AL_APIENTRY alIsSource(ALuint source); + +/** Set Source parameters. */ +AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value); +AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values); +AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value); +AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); +AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values); + +/** Get Source parameters. */ +AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value); +AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value); +AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); +AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values); + + +/** Play, replay, or resume (if paused) a list of Sources */ +AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources); +/** Stop a list of Sources */ +AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources); +/** Rewind a list of Sources */ +AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources); +/** Pause a list of Sources */ +AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources); + +/** Play, replay, or resume a Source */ +AL_API void AL_APIENTRY alSourcePlay(ALuint source); +/** Stop a Source */ +AL_API void AL_APIENTRY alSourceStop(ALuint source); +/** Rewind a Source (set playback postiton to beginning) */ +AL_API void AL_APIENTRY alSourceRewind(ALuint source); +/** Pause a Source */ +AL_API void AL_APIENTRY alSourcePause(ALuint source); + +/** Queue buffers onto a source */ +AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers); +/** Unqueue processed buffers from a source */ +AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers); + + +/** Create Buffer objects */ +AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers); +/** Delete Buffer objects */ +AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers); +/** Verify a handle is a valid Buffer */ +AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer); + +/** Specifies the data to be copied into a buffer */ +AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); + +/** Set Buffer parameters, */ +AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value); +AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values); +AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value); +AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); +AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values); + +/** Get Buffer parameters. */ +AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value); +AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values); +AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value); +AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); +AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values); + +/** Pointer-to-function type, useful for dynamically getting AL entry points. */ +typedef void (AL_APIENTRY *LPALENABLE)(ALenum capability); +typedef void (AL_APIENTRY *LPALDISABLE)(ALenum capability); +typedef ALboolean (AL_APIENTRY *LPALISENABLED)(ALenum capability); +typedef const ALchar* (AL_APIENTRY *LPALGETSTRING)(ALenum param); +typedef void (AL_APIENTRY *LPALGETBOOLEANV)(ALenum param, ALboolean *values); +typedef void (AL_APIENTRY *LPALGETINTEGERV)(ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALGETFLOATV)(ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETDOUBLEV)(ALenum param, ALdouble *values); +typedef ALboolean (AL_APIENTRY *LPALGETBOOLEAN)(ALenum param); +typedef ALint (AL_APIENTRY *LPALGETINTEGER)(ALenum param); +typedef ALfloat (AL_APIENTRY *LPALGETFLOAT)(ALenum param); +typedef ALdouble (AL_APIENTRY *LPALGETDOUBLE)(ALenum param); +typedef ALenum (AL_APIENTRY *LPALGETERROR)(void); +typedef ALboolean (AL_APIENTRY *LPALISEXTENSIONPRESENT)(const ALchar *extname); +typedef void* (AL_APIENTRY *LPALGETPROCADDRESS)(const ALchar *fname); +typedef ALenum (AL_APIENTRY *LPALGETENUMVALUE)(const ALchar *ename); +typedef void (AL_APIENTRY *LPALLISTENERF)(ALenum param, ALfloat value); +typedef void (AL_APIENTRY *LPALLISTENER3F)(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +typedef void (AL_APIENTRY *LPALLISTENERFV)(ALenum param, const ALfloat *values); +typedef void (AL_APIENTRY *LPALLISTENERI)(ALenum param, ALint value); +typedef void (AL_APIENTRY *LPALLISTENER3I)(ALenum param, ALint value1, ALint value2, ALint value3); +typedef void (AL_APIENTRY *LPALLISTENERIV)(ALenum param, const ALint *values); +typedef void (AL_APIENTRY *LPALGETLISTENERF)(ALenum param, ALfloat *value); +typedef void (AL_APIENTRY *LPALGETLISTENER3F)(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +typedef void (AL_APIENTRY *LPALGETLISTENERFV)(ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETLISTENERI)(ALenum param, ALint *value); +typedef void (AL_APIENTRY *LPALGETLISTENER3I)(ALenum param, ALint *value1, ALint *value2, ALint *value3); +typedef void (AL_APIENTRY *LPALGETLISTENERIV)(ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALGENSOURCES)(ALsizei n, ALuint *sources); +typedef void (AL_APIENTRY *LPALDELETESOURCES)(ALsizei n, const ALuint *sources); +typedef ALboolean (AL_APIENTRY *LPALISSOURCE)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEF)(ALuint source, ALenum param, ALfloat value); +typedef void (AL_APIENTRY *LPALSOURCE3F)(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +typedef void (AL_APIENTRY *LPALSOURCEFV)(ALuint source, ALenum param, const ALfloat *values); +typedef void (AL_APIENTRY *LPALSOURCEI)(ALuint source, ALenum param, ALint value); +typedef void (AL_APIENTRY *LPALSOURCE3I)(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); +typedef void (AL_APIENTRY *LPALSOURCEIV)(ALuint source, ALenum param, const ALint *values); +typedef void (AL_APIENTRY *LPALGETSOURCEF)(ALuint source, ALenum param, ALfloat *value); +typedef void (AL_APIENTRY *LPALGETSOURCE3F)(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +typedef void (AL_APIENTRY *LPALGETSOURCEFV)(ALuint source, ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETSOURCEI)(ALuint source, ALenum param, ALint *value); +typedef void (AL_APIENTRY *LPALGETSOURCE3I)(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3); +typedef void (AL_APIENTRY *LPALGETSOURCEIV)(ALuint source, ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALSOURCEPLAYV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCESTOPV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCEREWINDV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCEPAUSEV)(ALsizei n, const ALuint *sources); +typedef void (AL_APIENTRY *LPALSOURCEPLAY)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCESTOP)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEREWIND)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEPAUSE)(ALuint source); +typedef void (AL_APIENTRY *LPALSOURCEQUEUEBUFFERS)(ALuint source, ALsizei nb, const ALuint *buffers); +typedef void (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERS)(ALuint source, ALsizei nb, ALuint *buffers); +typedef void (AL_APIENTRY *LPALGENBUFFERS)(ALsizei n, ALuint *buffers); +typedef void (AL_APIENTRY *LPALDELETEBUFFERS)(ALsizei n, const ALuint *buffers); +typedef ALboolean (AL_APIENTRY *LPALISBUFFER)(ALuint buffer); +typedef void (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq); +typedef void (AL_APIENTRY *LPALBUFFERF)(ALuint buffer, ALenum param, ALfloat value); +typedef void (AL_APIENTRY *LPALBUFFER3F)(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3); +typedef void (AL_APIENTRY *LPALBUFFERFV)(ALuint buffer, ALenum param, const ALfloat *values); +typedef void (AL_APIENTRY *LPALBUFFERI)(ALuint buffer, ALenum param, ALint value); +typedef void (AL_APIENTRY *LPALBUFFER3I)(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3); +typedef void (AL_APIENTRY *LPALBUFFERIV)(ALuint buffer, ALenum param, const ALint *values); +typedef void (AL_APIENTRY *LPALGETBUFFERF)(ALuint buffer, ALenum param, ALfloat *value); +typedef void (AL_APIENTRY *LPALGETBUFFER3F)(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); +typedef void (AL_APIENTRY *LPALGETBUFFERFV)(ALuint buffer, ALenum param, ALfloat *values); +typedef void (AL_APIENTRY *LPALGETBUFFERI)(ALuint buffer, ALenum param, ALint *value); +typedef void (AL_APIENTRY *LPALGETBUFFER3I)(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3); +typedef void (AL_APIENTRY *LPALGETBUFFERIV)(ALuint buffer, ALenum param, ALint *values); +typedef void (AL_APIENTRY *LPALDOPPLERFACTOR)(ALfloat value); +typedef void (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value); +typedef void (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value); +typedef void (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel); + +#if defined(__cplusplus) +} /* extern "C" */ +#endif + +#endif /* AL_AL_H */ diff --git a/src/include/AL/alc.h b/src/include/AL/alc.h new file mode 100644 index 000000000..294e8b33c --- /dev/null +++ b/src/include/AL/alc.h @@ -0,0 +1,237 @@ +#ifndef AL_ALC_H +#define AL_ALC_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef ALC_API + #if defined(AL_LIBTYPE_STATIC) + #define ALC_API + #elif defined(_WIN32) + #define ALC_API __declspec(dllimport) + #else + #define ALC_API extern + #endif +#endif + +#if defined(_WIN32) + #define ALC_APIENTRY __cdecl +#else + #define ALC_APIENTRY +#endif + + +/** Deprecated macro. */ +#define ALCAPI ALC_API +#define ALCAPIENTRY ALC_APIENTRY +#define ALC_INVALID 0 + +/** Supported ALC version? */ +#define ALC_VERSION_0_1 1 + +/** Opaque device handle */ +typedef struct ALCdevice_struct ALCdevice; +/** Opaque context handle */ +typedef struct ALCcontext_struct ALCcontext; + +/** 8-bit boolean */ +typedef char ALCboolean; + +/** character */ +typedef char ALCchar; + +/** signed 8-bit 2's complement integer */ +typedef signed char ALCbyte; + +/** unsigned 8-bit integer */ +typedef unsigned char ALCubyte; + +/** signed 16-bit 2's complement integer */ +typedef short ALCshort; + +/** unsigned 16-bit integer */ +typedef unsigned short ALCushort; + +/** signed 32-bit 2's complement integer */ +typedef int ALCint; + +/** unsigned 32-bit integer */ +typedef unsigned int ALCuint; + +/** non-negative 32-bit binary integer size */ +typedef int ALCsizei; + +/** enumerated 32-bit value */ +typedef int ALCenum; + +/** 32-bit IEEE754 floating-point */ +typedef float ALCfloat; + +/** 64-bit IEEE754 floating-point */ +typedef double ALCdouble; + +/** void type (for opaque pointers only) */ +typedef void ALCvoid; + + +/* Enumerant values begin at column 50. No tabs. */ + +/** Boolean False. */ +#define ALC_FALSE 0 + +/** Boolean True. */ +#define ALC_TRUE 1 + +/** Context attribute: Hz. */ +#define ALC_FREQUENCY 0x1007 + +/** Context attribute: Hz. */ +#define ALC_REFRESH 0x1008 + +/** Context attribute: AL_TRUE or AL_FALSE. */ +#define ALC_SYNC 0x1009 + +/** Context attribute: requested Mono (3D) Sources. */ +#define ALC_MONO_SOURCES 0x1010 + +/** Context attribute: requested Stereo Sources. */ +#define ALC_STEREO_SOURCES 0x1011 + +/** No error. */ +#define ALC_NO_ERROR 0 + +/** Invalid device handle. */ +#define ALC_INVALID_DEVICE 0xA001 + +/** Invalid context handle. */ +#define ALC_INVALID_CONTEXT 0xA002 + +/** Invalid enum parameter passed to an ALC call. */ +#define ALC_INVALID_ENUM 0xA003 + +/** Invalid value parameter passed to an ALC call. */ +#define ALC_INVALID_VALUE 0xA004 + +/** Out of memory. */ +#define ALC_OUT_OF_MEMORY 0xA005 + + +/** Runtime ALC version. */ +#define ALC_MAJOR_VERSION 0x1000 +#define ALC_MINOR_VERSION 0x1001 + +/** Context attribute list properties. */ +#define ALC_ATTRIBUTES_SIZE 0x1002 +#define ALC_ALL_ATTRIBUTES 0x1003 + +/** String for the default device specifier. */ +#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004 +/** + * String for the given device's specifier. + * + * If device handle is NULL, it is instead a null-char separated list of + * strings of known device specifiers (list ends with an empty string). + */ +#define ALC_DEVICE_SPECIFIER 0x1005 +/** String for space-separated list of ALC extensions. */ +#define ALC_EXTENSIONS 0x1006 + + +/** Capture extension */ +#define ALC_EXT_CAPTURE 1 +/** + * String for the given capture device's specifier. + * + * If device handle is NULL, it is instead a null-char separated list of + * strings of known capture device specifiers (list ends with an empty string). + */ +#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310 +/** String for the default capture device specifier. */ +#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311 +/** Number of sample frames available for capture. */ +#define ALC_CAPTURE_SAMPLES 0x312 + + +/** Enumerate All extension */ +#define ALC_ENUMERATE_ALL_EXT 1 +/** String for the default extended device specifier. */ +#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER 0x1012 +/** + * String for the given extended device's specifier. + * + * If device handle is NULL, it is instead a null-char separated list of + * strings of known extended device specifiers (list ends with an empty string). + */ +#define ALC_ALL_DEVICES_SPECIFIER 0x1013 + + +/** Context management. */ +ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint* attrlist); +ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context); +ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context); +ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context); +ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context); +ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void); +ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context); + +/** Device management. */ +ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename); +ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device); + + +/** + * Error support. + * + * Obtain the most recent Device error. + */ +ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device); + +/** + * Extension support. + * + * Query for the presence of an extension, and obtain any appropriate + * function pointers and enum values. + */ +ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname); +ALC_API void* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname); +ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname); + +/** Query function. */ +ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param); +ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); + +/** Capture function. */ +ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); +ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device); +ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device); +ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device); +ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); + +/** Pointer-to-function type, useful for dynamically getting ALC entry points. */ +typedef ALCcontext* (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist); +typedef ALCboolean (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context); +typedef void (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context); +typedef void (ALC_APIENTRY *LPALCSUSPENDCONTEXT)(ALCcontext *context); +typedef void (ALC_APIENTRY *LPALCDESTROYCONTEXT)(ALCcontext *context); +typedef ALCcontext* (ALC_APIENTRY *LPALCGETCURRENTCONTEXT)(void); +typedef ALCdevice* (ALC_APIENTRY *LPALCGETCONTEXTSDEVICE)(ALCcontext *context); +typedef ALCdevice* (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename); +typedef ALCboolean (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device); +typedef ALCenum (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device); +typedef ALCboolean (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname); +typedef void* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname); +typedef ALCenum (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname); +typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param); +typedef void (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values); +typedef ALCdevice* (ALC_APIENTRY *LPALCCAPTUREOPENDEVICE)(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize); +typedef ALCboolean (ALC_APIENTRY *LPALCCAPTURECLOSEDEVICE)(ALCdevice *device); +typedef void (ALC_APIENTRY *LPALCCAPTURESTART)(ALCdevice *device); +typedef void (ALC_APIENTRY *LPALCCAPTURESTOP)(ALCdevice *device); +typedef void (ALC_APIENTRY *LPALCCAPTURESAMPLES)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples); + +#if defined(__cplusplus) +} +#endif + +#endif /* AL_ALC_H */ diff --git a/src/include/alext.h b/src/include/AL/alext.h similarity index 100% rename from src/include/alext.h rename to src/include/AL/alext.h diff --git a/src/include/AL/efx-creative.h b/src/include/AL/efx-creative.h new file mode 100644 index 000000000..0a04c982e --- /dev/null +++ b/src/include/AL/efx-creative.h @@ -0,0 +1,3 @@ +/* The tokens that would be defined here are already defined in efx.h. This + * empty file is here to provide compatibility with Windows-based projects + * that would include it. */ diff --git a/src/include/AL/efx-presets.h b/src/include/AL/efx-presets.h new file mode 100644 index 000000000..8539fd517 --- /dev/null +++ b/src/include/AL/efx-presets.h @@ -0,0 +1,402 @@ +/* Reverb presets for EFX */ + +#ifndef EFX_PRESETS_H +#define EFX_PRESETS_H + +#ifndef EFXEAXREVERBPROPERTIES_DEFINED +#define EFXEAXREVERBPROPERTIES_DEFINED +typedef struct { + float flDensity; + float flDiffusion; + float flGain; + float flGainHF; + float flGainLF; + float flDecayTime; + float flDecayHFRatio; + float flDecayLFRatio; + float flReflectionsGain; + float flReflectionsDelay; + float flReflectionsPan[3]; + float flLateReverbGain; + float flLateReverbDelay; + float flLateReverbPan[3]; + float flEchoTime; + float flEchoDepth; + float flModulationTime; + float flModulationDepth; + float flAirAbsorptionGainHF; + float flHFReference; + float flLFReference; + float flRoomRolloffFactor; + int iDecayHFLimit; +} EFXEAXREVERBPROPERTIES, *LPEFXEAXREVERBPROPERTIES; +#endif + +/* Default Presets */ + +#define EFX_REVERB_PRESET_GENERIC \ + { 1.0000f, 1.0000f, 0.3162f, 0.8913f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PADDEDCELL \ + { 0.1715f, 1.0000f, 0.3162f, 0.0010f, 1.0000f, 0.1700f, 0.1000f, 1.0000f, 0.2500f, 0.0010f, { 0.0000f, 0.0000f, 0.0000f }, 1.2691f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ROOM \ + { 0.4287f, 1.0000f, 0.3162f, 0.5929f, 1.0000f, 0.4000f, 0.8300f, 1.0000f, 0.1503f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 1.0629f, 0.0030f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_BATHROOM \ + { 0.1715f, 1.0000f, 0.3162f, 0.2512f, 1.0000f, 1.4900f, 0.5400f, 1.0000f, 0.6531f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 3.2734f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_LIVINGROOM \ + { 0.9766f, 1.0000f, 0.3162f, 0.0010f, 1.0000f, 0.5000f, 0.1000f, 1.0000f, 0.2051f, 0.0030f, { 0.0000f, 0.0000f, 0.0000f }, 0.2805f, 0.0040f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_STONEROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.7079f, 1.0000f, 2.3100f, 0.6400f, 1.0000f, 0.4411f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1003f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_AUDITORIUM \ + { 1.0000f, 1.0000f, 0.3162f, 0.5781f, 1.0000f, 4.3200f, 0.5900f, 1.0000f, 0.4032f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.7170f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CONCERTHALL \ + { 1.0000f, 1.0000f, 0.3162f, 0.5623f, 1.0000f, 3.9200f, 0.7000f, 1.0000f, 0.2427f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.9977f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CAVE \ + { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 1.0000f, 2.9100f, 1.3000f, 1.0000f, 0.5000f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.7063f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_ARENA \ + { 1.0000f, 1.0000f, 0.3162f, 0.4477f, 1.0000f, 7.2400f, 0.3300f, 1.0000f, 0.2612f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.0186f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_HANGAR \ + { 1.0000f, 1.0000f, 0.3162f, 0.3162f, 1.0000f, 10.0500f, 0.2300f, 1.0000f, 0.5000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2560f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CARPETEDHALLWAY \ + { 0.4287f, 1.0000f, 0.3162f, 0.0100f, 1.0000f, 0.3000f, 0.1000f, 1.0000f, 0.1215f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 0.1531f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_HALLWAY \ + { 0.3645f, 1.0000f, 0.3162f, 0.7079f, 1.0000f, 1.4900f, 0.5900f, 1.0000f, 0.2458f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.6615f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_STONECORRIDOR \ + { 1.0000f, 1.0000f, 0.3162f, 0.7612f, 1.0000f, 2.7000f, 0.7900f, 1.0000f, 0.2472f, 0.0130f, { 0.0000f, 0.0000f, 0.0000f }, 1.5758f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ALLEY \ + { 1.0000f, 0.3000f, 0.3162f, 0.7328f, 1.0000f, 1.4900f, 0.8600f, 1.0000f, 0.2500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.9954f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.9500f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FOREST \ + { 1.0000f, 0.3000f, 0.3162f, 0.0224f, 1.0000f, 1.4900f, 0.5400f, 1.0000f, 0.0525f, 0.1620f, { 0.0000f, 0.0000f, 0.0000f }, 0.7682f, 0.0880f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY \ + { 1.0000f, 0.5000f, 0.3162f, 0.3981f, 1.0000f, 1.4900f, 0.6700f, 1.0000f, 0.0730f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.1427f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_MOUNTAINS \ + { 1.0000f, 0.2700f, 0.3162f, 0.0562f, 1.0000f, 1.4900f, 0.2100f, 1.0000f, 0.0407f, 0.3000f, { 0.0000f, 0.0000f, 0.0000f }, 0.1919f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_QUARRY \ + { 1.0000f, 1.0000f, 0.3162f, 0.3162f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0000f, 0.0610f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0250f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.7000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PLAIN \ + { 1.0000f, 0.2100f, 0.3162f, 0.1000f, 1.0000f, 1.4900f, 0.5000f, 1.0000f, 0.0585f, 0.1790f, { 0.0000f, 0.0000f, 0.0000f }, 0.1089f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PARKINGLOT \ + { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 1.0000f, 1.6500f, 1.5000f, 1.0000f, 0.2082f, 0.0080f, { 0.0000f, 0.0000f, 0.0000f }, 0.2652f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_SEWERPIPE \ + { 0.3071f, 0.8000f, 0.3162f, 0.3162f, 1.0000f, 2.8100f, 0.1400f, 1.0000f, 1.6387f, 0.0140f, { 0.0000f, 0.0000f, 0.0000f }, 3.2471f, 0.0210f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_UNDERWATER \ + { 0.3645f, 1.0000f, 0.3162f, 0.0100f, 1.0000f, 1.4900f, 0.1000f, 1.0000f, 0.5963f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 7.0795f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 1.1800f, 0.3480f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRUGGED \ + { 0.4287f, 0.5000f, 0.3162f, 1.0000f, 1.0000f, 8.3900f, 1.3900f, 1.0000f, 0.8760f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 3.1081f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 1.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DIZZY \ + { 0.3645f, 0.6000f, 0.3162f, 0.6310f, 1.0000f, 17.2300f, 0.5600f, 1.0000f, 0.1392f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.4937f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.8100f, 0.3100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PSYCHOTIC \ + { 0.0625f, 0.5000f, 0.3162f, 0.8404f, 1.0000f, 7.5600f, 0.9100f, 1.0000f, 0.4864f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 2.4378f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 4.0000f, 1.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +/* Castle Presets */ + +#define EFX_REVERB_PRESET_CASTLE_SMALLROOM \ + { 1.0000f, 0.8900f, 0.3162f, 0.3981f, 0.1000f, 1.2200f, 0.8300f, 0.3100f, 0.8913f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_SHORTPASSAGE \ + { 1.0000f, 0.8900f, 0.3162f, 0.3162f, 0.1000f, 2.3200f, 0.8300f, 0.3100f, 0.8913f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_MEDIUMROOM \ + { 1.0000f, 0.9300f, 0.3162f, 0.2818f, 0.1000f, 2.0400f, 0.8300f, 0.4600f, 0.6310f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1550f, 0.0300f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_LARGEROOM \ + { 1.0000f, 0.8200f, 0.3162f, 0.2818f, 0.1259f, 2.5300f, 0.8300f, 0.5000f, 0.4467f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1850f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_LONGPASSAGE \ + { 1.0000f, 0.8900f, 0.3162f, 0.3981f, 0.1000f, 3.4200f, 0.8300f, 0.3100f, 0.8913f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_HALL \ + { 1.0000f, 0.8100f, 0.3162f, 0.2818f, 0.1778f, 3.1400f, 0.7900f, 0.6200f, 0.1778f, 0.0560f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_CUPBOARD \ + { 1.0000f, 0.8900f, 0.3162f, 0.2818f, 0.1000f, 0.6700f, 0.8700f, 0.3100f, 1.4125f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 3.5481f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CASTLE_COURTYARD \ + { 1.0000f, 0.4200f, 0.3162f, 0.4467f, 0.1995f, 2.1300f, 0.6100f, 0.2300f, 0.2239f, 0.1600f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0360f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.3700f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_CASTLE_ALCOVE \ + { 1.0000f, 0.8900f, 0.3162f, 0.5012f, 0.1000f, 1.6400f, 0.8700f, 0.3100f, 1.0000f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 0.1380f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 5168.6001f, 139.5000f, 0.0000f, 0x1 } + +/* Factory Presets */ + +#define EFX_REVERB_PRESET_FACTORY_SMALLROOM \ + { 0.3645f, 0.8200f, 0.3162f, 0.7943f, 0.5012f, 1.7200f, 0.6500f, 1.3100f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.1190f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_SHORTPASSAGE \ + { 0.3645f, 0.6400f, 0.2512f, 0.7943f, 0.5012f, 2.5300f, 0.6500f, 1.3100f, 1.0000f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.1350f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_MEDIUMROOM \ + { 0.4287f, 0.8200f, 0.2512f, 0.7943f, 0.5012f, 2.7600f, 0.6500f, 1.3100f, 0.2818f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1740f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_LARGEROOM \ + { 0.4287f, 0.7500f, 0.2512f, 0.7079f, 0.6310f, 4.2400f, 0.5100f, 1.3100f, 0.1778f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.2310f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_LONGPASSAGE \ + { 0.3645f, 0.6400f, 0.2512f, 0.7943f, 0.5012f, 4.0600f, 0.6500f, 1.3100f, 1.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0370f, { 0.0000f, 0.0000f, 0.0000f }, 0.1350f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_HALL \ + { 0.4287f, 0.7500f, 0.3162f, 0.7079f, 0.6310f, 7.4300f, 0.5100f, 1.3100f, 0.0631f, 0.0730f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_CUPBOARD \ + { 0.3071f, 0.6300f, 0.2512f, 0.7943f, 0.5012f, 0.4900f, 0.6500f, 1.3100f, 1.2589f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.1070f, 0.0700f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_COURTYARD \ + { 0.3071f, 0.5700f, 0.3162f, 0.3162f, 0.6310f, 2.3200f, 0.2900f, 0.5600f, 0.2239f, 0.1400f, { 0.0000f, 0.0000f, 0.0000f }, 0.3981f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2900f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_FACTORY_ALCOVE \ + { 0.3645f, 0.5900f, 0.2512f, 0.7943f, 0.5012f, 3.1400f, 0.6500f, 1.3100f, 1.4125f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.1140f, 0.1000f, 0.2500f, 0.0000f, 0.9943f, 3762.6001f, 362.5000f, 0.0000f, 0x1 } + +/* Ice Palace Presets */ + +#define EFX_REVERB_PRESET_ICEPALACE_SMALLROOM \ + { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 0.2818f, 1.5100f, 1.5300f, 0.2700f, 0.8913f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1640f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_SHORTPASSAGE \ + { 1.0000f, 0.7500f, 0.3162f, 0.5623f, 0.2818f, 1.7900f, 1.4600f, 0.2800f, 0.5012f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.1770f, 0.0900f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_MEDIUMROOM \ + { 1.0000f, 0.8700f, 0.3162f, 0.5623f, 0.4467f, 2.2200f, 1.5300f, 0.3200f, 0.3981f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.1860f, 0.1200f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_LARGEROOM \ + { 1.0000f, 0.8100f, 0.3162f, 0.5623f, 0.4467f, 3.1400f, 1.5300f, 0.3200f, 0.2512f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0270f, { 0.0000f, 0.0000f, 0.0000f }, 0.2140f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_LONGPASSAGE \ + { 1.0000f, 0.7700f, 0.3162f, 0.5623f, 0.3981f, 3.0100f, 1.4600f, 0.2800f, 0.7943f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0250f, { 0.0000f, 0.0000f, 0.0000f }, 0.1860f, 0.0400f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_HALL \ + { 1.0000f, 0.7600f, 0.3162f, 0.4467f, 0.5623f, 5.4900f, 1.5300f, 0.3800f, 0.1122f, 0.0540f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0520f, { 0.0000f, 0.0000f, 0.0000f }, 0.2260f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_CUPBOARD \ + { 1.0000f, 0.8300f, 0.3162f, 0.5012f, 0.2239f, 0.7600f, 1.5300f, 0.2600f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1430f, 0.0800f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_COURTYARD \ + { 1.0000f, 0.5900f, 0.3162f, 0.2818f, 0.3162f, 2.0400f, 1.2000f, 0.3800f, 0.3162f, 0.1730f, { 0.0000f, 0.0000f, 0.0000f }, 0.3162f, 0.0430f, { 0.0000f, 0.0000f, 0.0000f }, 0.2350f, 0.4800f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_ICEPALACE_ALCOVE \ + { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 0.2818f, 2.7600f, 1.4600f, 0.2800f, 1.1220f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1610f, 0.0900f, 0.2500f, 0.0000f, 0.9943f, 12428.5000f, 99.6000f, 0.0000f, 0x1 } + +/* Space Station Presets */ + +#define EFX_REVERB_PRESET_SPACESTATION_SMALLROOM \ + { 0.2109f, 0.7000f, 0.3162f, 0.7079f, 0.8913f, 1.7200f, 0.8200f, 0.5500f, 0.7943f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0130f, { 0.0000f, 0.0000f, 0.0000f }, 0.1880f, 0.2600f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_SHORTPASSAGE \ + { 0.2109f, 0.8700f, 0.3162f, 0.6310f, 0.8913f, 3.5700f, 0.5000f, 0.5500f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.1720f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_MEDIUMROOM \ + { 0.2109f, 0.7500f, 0.3162f, 0.6310f, 0.8913f, 3.0100f, 0.5000f, 0.5500f, 0.3981f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0350f, { 0.0000f, 0.0000f, 0.0000f }, 0.2090f, 0.3100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_LARGEROOM \ + { 0.3645f, 0.8100f, 0.3162f, 0.6310f, 0.8913f, 3.8900f, 0.3800f, 0.6100f, 0.3162f, 0.0560f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0350f, { 0.0000f, 0.0000f, 0.0000f }, 0.2330f, 0.2800f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_LONGPASSAGE \ + { 0.4287f, 0.8200f, 0.3162f, 0.6310f, 0.8913f, 4.6200f, 0.6200f, 0.5500f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0310f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2300f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_HALL \ + { 0.4287f, 0.8700f, 0.3162f, 0.6310f, 0.8913f, 7.1100f, 0.3800f, 0.6100f, 0.1778f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0470f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2500f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_CUPBOARD \ + { 0.1715f, 0.5600f, 0.3162f, 0.7079f, 0.8913f, 0.7900f, 0.8100f, 0.5500f, 1.4125f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.7783f, 0.0180f, { 0.0000f, 0.0000f, 0.0000f }, 0.1810f, 0.3100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPACESTATION_ALCOVE \ + { 0.2109f, 0.7800f, 0.3162f, 0.7079f, 0.8913f, 1.1600f, 0.8100f, 0.5500f, 1.4125f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0180f, { 0.0000f, 0.0000f, 0.0000f }, 0.1920f, 0.2100f, 0.2500f, 0.0000f, 0.9943f, 3316.1001f, 458.2000f, 0.0000f, 0x1 } + +/* Wooden Galleon Presets */ + +#define EFX_REVERB_PRESET_WOODEN_SMALLROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.1122f, 0.3162f, 0.7900f, 0.3200f, 0.8700f, 1.0000f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_SHORTPASSAGE \ + { 1.0000f, 1.0000f, 0.3162f, 0.1259f, 0.3162f, 1.7500f, 0.5000f, 0.8700f, 0.8913f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.6310f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_MEDIUMROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.1000f, 0.2818f, 1.4700f, 0.4200f, 0.8200f, 0.8913f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_LARGEROOM \ + { 1.0000f, 1.0000f, 0.3162f, 0.0891f, 0.2818f, 2.6500f, 0.3300f, 0.8200f, 0.8913f, 0.0660f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_LONGPASSAGE \ + { 1.0000f, 1.0000f, 0.3162f, 0.1000f, 0.3162f, 1.9900f, 0.4000f, 0.7900f, 1.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.4467f, 0.0360f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_HALL \ + { 1.0000f, 1.0000f, 0.3162f, 0.0794f, 0.2818f, 3.4500f, 0.3000f, 0.8200f, 0.8913f, 0.0880f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0630f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_CUPBOARD \ + { 1.0000f, 1.0000f, 0.3162f, 0.1413f, 0.3162f, 0.5600f, 0.4600f, 0.9100f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_COURTYARD \ + { 1.0000f, 0.6500f, 0.3162f, 0.0794f, 0.3162f, 1.7900f, 0.3500f, 0.7900f, 0.5623f, 0.1230f, { 0.0000f, 0.0000f, 0.0000f }, 0.1000f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_WOODEN_ALCOVE \ + { 1.0000f, 1.0000f, 0.3162f, 0.1259f, 0.3162f, 1.2200f, 0.6200f, 0.9100f, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 4705.0000f, 99.6000f, 0.0000f, 0x1 } + +/* Sports Presets */ + +#define EFX_REVERB_PRESET_SPORT_EMPTYSTADIUM \ + { 1.0000f, 1.0000f, 0.3162f, 0.4467f, 0.7943f, 6.2600f, 0.5100f, 1.1000f, 0.0631f, 0.1830f, { 0.0000f, 0.0000f, 0.0000f }, 0.3981f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_SQUASHCOURT \ + { 1.0000f, 0.7500f, 0.3162f, 0.3162f, 0.7943f, 2.2200f, 0.9100f, 1.1600f, 0.4467f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.1260f, 0.1900f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_SMALLSWIMMINGPOOL \ + { 1.0000f, 0.7000f, 0.3162f, 0.7943f, 0.8913f, 2.7600f, 1.2500f, 1.1400f, 0.6310f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_SPORT_LARGESWIMMINGPOOL \ + { 1.0000f, 0.8200f, 0.3162f, 0.7943f, 1.0000f, 5.4900f, 1.3100f, 1.1400f, 0.4467f, 0.0390f, { 0.0000f, 0.0000f, 0.0000f }, 0.5012f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2220f, 0.5500f, 1.1590f, 0.2100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_SPORT_GYMNASIUM \ + { 1.0000f, 0.8100f, 0.3162f, 0.4467f, 0.8913f, 3.1400f, 1.0600f, 1.3500f, 0.3981f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.5623f, 0.0450f, { 0.0000f, 0.0000f, 0.0000f }, 0.1460f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_FULLSTADIUM \ + { 1.0000f, 1.0000f, 0.3162f, 0.0708f, 0.7943f, 5.2500f, 0.1700f, 0.8000f, 0.1000f, 0.1880f, { 0.0000f, 0.0000f, 0.0000f }, 0.2818f, 0.0380f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SPORT_STADIUMTANNOY \ + { 1.0000f, 0.7800f, 0.3162f, 0.5623f, 0.5012f, 2.5300f, 0.8800f, 0.6800f, 0.2818f, 0.2300f, { 0.0000f, 0.0000f, 0.0000f }, 0.5012f, 0.0630f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +/* Prefab Presets */ + +#define EFX_REVERB_PRESET_PREFAB_WORKSHOP \ + { 0.4287f, 1.0000f, 0.3162f, 0.1413f, 0.3981f, 0.7600f, 1.0000f, 1.0000f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PREFAB_SCHOOLROOM \ + { 0.4022f, 0.6900f, 0.3162f, 0.6310f, 0.5012f, 0.9800f, 0.4500f, 0.1800f, 1.4125f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.0950f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PREFAB_PRACTISEROOM \ + { 0.4022f, 0.8700f, 0.3162f, 0.3981f, 0.5012f, 1.1200f, 0.5600f, 0.1800f, 1.2589f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.0950f, 0.1400f, 0.2500f, 0.0000f, 0.9943f, 7176.8999f, 211.2000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PREFAB_OUTHOUSE \ + { 1.0000f, 0.8200f, 0.3162f, 0.1122f, 0.1585f, 1.3800f, 0.3800f, 0.3500f, 0.8913f, 0.0240f, { 0.0000f, 0.0000f, -0.0000f }, 0.6310f, 0.0440f, { 0.0000f, 0.0000f, 0.0000f }, 0.1210f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PREFAB_CARAVAN \ + { 1.0000f, 1.0000f, 0.3162f, 0.0891f, 0.1259f, 0.4300f, 1.5000f, 1.0000f, 1.0000f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 1.9953f, 0.0120f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +/* Dome and Pipe Presets */ + +#define EFX_REVERB_PRESET_DOME_TOMB \ + { 1.0000f, 0.7900f, 0.3162f, 0.3548f, 0.2239f, 4.1800f, 0.2100f, 0.1000f, 0.3868f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 1.6788f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.1770f, 0.1900f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PIPE_SMALL \ + { 1.0000f, 1.0000f, 0.3162f, 0.3548f, 0.2239f, 5.0400f, 0.1000f, 0.1000f, 0.5012f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 2.5119f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DOME_SAINTPAULS \ + { 1.0000f, 0.8700f, 0.3162f, 0.3548f, 0.2239f, 10.4800f, 0.1900f, 0.1000f, 0.1778f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0420f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1200f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PIPE_LONGTHIN \ + { 0.2560f, 0.9100f, 0.3162f, 0.4467f, 0.2818f, 9.2100f, 0.1800f, 0.1000f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_PIPE_LARGE \ + { 1.0000f, 1.0000f, 0.3162f, 0.3548f, 0.2239f, 8.4500f, 0.1000f, 0.1000f, 0.3981f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_PIPE_RESONANT \ + { 0.1373f, 0.9100f, 0.3162f, 0.4467f, 0.2818f, 6.8100f, 0.1800f, 0.1000f, 0.7079f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.0000f, 0.0220f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 20.0000f, 0.0000f, 0x0 } + +/* Outdoors Presets */ + +#define EFX_REVERB_PRESET_OUTDOORS_BACKYARD \ + { 1.0000f, 0.4500f, 0.3162f, 0.2512f, 0.5012f, 1.1200f, 0.3400f, 0.4600f, 0.4467f, 0.0690f, { 0.0000f, 0.0000f, -0.0000f }, 0.7079f, 0.0230f, { 0.0000f, 0.0000f, 0.0000f }, 0.2180f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_ROLLINGPLAINS \ + { 1.0000f, 0.0000f, 0.3162f, 0.0112f, 0.6310f, 2.1300f, 0.2100f, 0.4600f, 0.1778f, 0.3000f, { 0.0000f, 0.0000f, -0.0000f }, 0.4467f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_DEEPCANYON \ + { 1.0000f, 0.7400f, 0.3162f, 0.1778f, 0.6310f, 3.8900f, 0.2100f, 0.4600f, 0.3162f, 0.2230f, { 0.0000f, 0.0000f, -0.0000f }, 0.3548f, 0.0190f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_CREEK \ + { 1.0000f, 0.3500f, 0.3162f, 0.1778f, 0.5012f, 2.1300f, 0.2100f, 0.4600f, 0.3981f, 0.1150f, { 0.0000f, 0.0000f, -0.0000f }, 0.1995f, 0.0310f, { 0.0000f, 0.0000f, 0.0000f }, 0.2180f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 4399.1001f, 242.9000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_OUTDOORS_VALLEY \ + { 1.0000f, 0.2800f, 0.3162f, 0.0282f, 0.1585f, 2.8800f, 0.2600f, 0.3500f, 0.1413f, 0.2630f, { 0.0000f, 0.0000f, -0.0000f }, 0.3981f, 0.1000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.3400f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +/* Mood Presets */ + +#define EFX_REVERB_PRESET_MOOD_HEAVEN \ + { 1.0000f, 0.9400f, 0.3162f, 0.7943f, 0.4467f, 5.0400f, 1.1200f, 0.5600f, 0.2427f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0290f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0800f, 2.7420f, 0.0500f, 0.9977f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_MOOD_HELL \ + { 1.0000f, 0.5700f, 0.3162f, 0.3548f, 0.4467f, 3.5700f, 0.4900f, 2.0000f, 0.0000f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1100f, 0.0400f, 2.1090f, 0.5200f, 0.9943f, 5000.0000f, 139.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_MOOD_MEMORY \ + { 1.0000f, 0.8500f, 0.3162f, 0.6310f, 0.3548f, 4.0600f, 0.8200f, 0.5600f, 0.0398f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.1220f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.4740f, 0.4500f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +/* Driving Presets */ + +#define EFX_REVERB_PRESET_DRIVING_COMMENTATOR \ + { 1.0000f, 0.0000f, 0.3162f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_PITGARAGE \ + { 0.4287f, 0.5900f, 0.3162f, 0.7079f, 0.5623f, 1.7200f, 0.9300f, 0.8700f, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DRIVING_INCAR_RACER \ + { 0.0832f, 0.8000f, 0.3162f, 1.0000f, 0.7943f, 0.1700f, 2.0000f, 0.4100f, 1.7783f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0150f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_INCAR_SPORTS \ + { 0.0832f, 0.8000f, 0.3162f, 0.6310f, 1.0000f, 0.1700f, 0.7500f, 0.4100f, 1.0000f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_INCAR_LUXURY \ + { 0.2560f, 1.0000f, 0.3162f, 0.1000f, 0.5012f, 0.1300f, 0.4100f, 0.4600f, 0.7943f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 1.5849f, 0.0100f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10268.2002f, 251.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_DRIVING_FULLGRANDSTAND \ + { 1.0000f, 1.0000f, 0.3162f, 0.2818f, 0.6310f, 3.0100f, 1.3700f, 1.2800f, 0.3548f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 0.1778f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10420.2002f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DRIVING_EMPTYGRANDSTAND \ + { 1.0000f, 1.0000f, 0.3162f, 1.0000f, 0.7943f, 4.6200f, 1.7500f, 1.4000f, 0.2082f, 0.0900f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 10420.2002f, 250.0000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_DRIVING_TUNNEL \ + { 1.0000f, 0.8100f, 0.3162f, 0.3981f, 0.8913f, 3.4200f, 0.9400f, 1.3100f, 0.7079f, 0.0510f, { 0.0000f, 0.0000f, 0.0000f }, 0.7079f, 0.0470f, { 0.0000f, 0.0000f, 0.0000f }, 0.2140f, 0.0500f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 155.3000f, 0.0000f, 0x1 } + +/* City Presets */ + +#define EFX_REVERB_PRESET_CITY_STREETS \ + { 1.0000f, 0.7800f, 0.3162f, 0.7079f, 0.8913f, 1.7900f, 1.1200f, 0.9100f, 0.2818f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 0.1995f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY_SUBWAY \ + { 1.0000f, 0.7400f, 0.3162f, 0.7079f, 0.8913f, 3.0100f, 1.2300f, 0.9100f, 0.7079f, 0.0460f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0280f, { 0.0000f, 0.0000f, 0.0000f }, 0.1250f, 0.2100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY_MUSEUM \ + { 1.0000f, 0.8200f, 0.3162f, 0.1778f, 0.1778f, 3.2800f, 1.4000f, 0.5700f, 0.2512f, 0.0390f, { 0.0000f, 0.0000f, -0.0000f }, 0.8913f, 0.0340f, { 0.0000f, 0.0000f, 0.0000f }, 0.1300f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_CITY_LIBRARY \ + { 1.0000f, 0.8200f, 0.3162f, 0.2818f, 0.0891f, 2.7600f, 0.8900f, 0.4100f, 0.3548f, 0.0290f, { 0.0000f, 0.0000f, -0.0000f }, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 0.1300f, 0.1700f, 0.2500f, 0.0000f, 0.9943f, 2854.3999f, 107.5000f, 0.0000f, 0x0 } + +#define EFX_REVERB_PRESET_CITY_UNDERPASS \ + { 1.0000f, 0.8200f, 0.3162f, 0.4467f, 0.8913f, 3.5700f, 1.1200f, 0.9100f, 0.3981f, 0.0590f, { 0.0000f, 0.0000f, 0.0000f }, 0.8913f, 0.0370f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1400f, 0.2500f, 0.0000f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CITY_ABANDONED \ + { 1.0000f, 0.6900f, 0.3162f, 0.7943f, 0.8913f, 3.2800f, 1.1700f, 0.9100f, 0.4467f, 0.0440f, { 0.0000f, 0.0000f, 0.0000f }, 0.2818f, 0.0240f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.2000f, 0.2500f, 0.0000f, 0.9966f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +/* Misc. Presets */ + +#define EFX_REVERB_PRESET_DUSTYROOM \ + { 0.3645f, 0.5600f, 0.3162f, 0.7943f, 0.7079f, 1.7900f, 0.3800f, 0.2100f, 0.5012f, 0.0020f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0060f, { 0.0000f, 0.0000f, 0.0000f }, 0.2020f, 0.0500f, 0.2500f, 0.0000f, 0.9886f, 13046.0000f, 163.3000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_CHAPEL \ + { 1.0000f, 0.8400f, 0.3162f, 0.5623f, 1.0000f, 4.6200f, 0.6400f, 1.2300f, 0.4467f, 0.0320f, { 0.0000f, 0.0000f, 0.0000f }, 0.7943f, 0.0490f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.1100f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 } + +#define EFX_REVERB_PRESET_SMALLWATERROOM \ + { 1.0000f, 0.7000f, 0.3162f, 0.4477f, 1.0000f, 1.5100f, 1.2500f, 1.1400f, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } + +#endif /* EFX_PRESETS_H */ diff --git a/src/include/AL/efx.h b/src/include/AL/efx.h new file mode 100644 index 000000000..57766983f --- /dev/null +++ b/src/include/AL/efx.h @@ -0,0 +1,761 @@ +#ifndef AL_EFX_H +#define AL_EFX_H + + +#include "alc.h" +#include "al.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ALC_EXT_EFX_NAME "ALC_EXT_EFX" + +#define ALC_EFX_MAJOR_VERSION 0x20001 +#define ALC_EFX_MINOR_VERSION 0x20002 +#define ALC_MAX_AUXILIARY_SENDS 0x20003 + + +/* Listener properties. */ +#define AL_METERS_PER_UNIT 0x20004 + +/* Source properties. */ +#define AL_DIRECT_FILTER 0x20005 +#define AL_AUXILIARY_SEND_FILTER 0x20006 +#define AL_AIR_ABSORPTION_FACTOR 0x20007 +#define AL_ROOM_ROLLOFF_FACTOR 0x20008 +#define AL_CONE_OUTER_GAINHF 0x20009 +#define AL_DIRECT_FILTER_GAINHF_AUTO 0x2000A +#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO 0x2000B +#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO 0x2000C + + +/* Effect properties. */ + +/* Reverb effect parameters */ +#define AL_REVERB_DENSITY 0x0001 +#define AL_REVERB_DIFFUSION 0x0002 +#define AL_REVERB_GAIN 0x0003 +#define AL_REVERB_GAINHF 0x0004 +#define AL_REVERB_DECAY_TIME 0x0005 +#define AL_REVERB_DECAY_HFRATIO 0x0006 +#define AL_REVERB_REFLECTIONS_GAIN 0x0007 +#define AL_REVERB_REFLECTIONS_DELAY 0x0008 +#define AL_REVERB_LATE_REVERB_GAIN 0x0009 +#define AL_REVERB_LATE_REVERB_DELAY 0x000A +#define AL_REVERB_AIR_ABSORPTION_GAINHF 0x000B +#define AL_REVERB_ROOM_ROLLOFF_FACTOR 0x000C +#define AL_REVERB_DECAY_HFLIMIT 0x000D + +/* EAX Reverb effect parameters */ +#define AL_EAXREVERB_DENSITY 0x0001 +#define AL_EAXREVERB_DIFFUSION 0x0002 +#define AL_EAXREVERB_GAIN 0x0003 +#define AL_EAXREVERB_GAINHF 0x0004 +#define AL_EAXREVERB_GAINLF 0x0005 +#define AL_EAXREVERB_DECAY_TIME 0x0006 +#define AL_EAXREVERB_DECAY_HFRATIO 0x0007 +#define AL_EAXREVERB_DECAY_LFRATIO 0x0008 +#define AL_EAXREVERB_REFLECTIONS_GAIN 0x0009 +#define AL_EAXREVERB_REFLECTIONS_DELAY 0x000A +#define AL_EAXREVERB_REFLECTIONS_PAN 0x000B +#define AL_EAXREVERB_LATE_REVERB_GAIN 0x000C +#define AL_EAXREVERB_LATE_REVERB_DELAY 0x000D +#define AL_EAXREVERB_LATE_REVERB_PAN 0x000E +#define AL_EAXREVERB_ECHO_TIME 0x000F +#define AL_EAXREVERB_ECHO_DEPTH 0x0010 +#define AL_EAXREVERB_MODULATION_TIME 0x0011 +#define AL_EAXREVERB_MODULATION_DEPTH 0x0012 +#define AL_EAXREVERB_AIR_ABSORPTION_GAINHF 0x0013 +#define AL_EAXREVERB_HFREFERENCE 0x0014 +#define AL_EAXREVERB_LFREFERENCE 0x0015 +#define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR 0x0016 +#define AL_EAXREVERB_DECAY_HFLIMIT 0x0017 + +/* Chorus effect parameters */ +#define AL_CHORUS_WAVEFORM 0x0001 +#define AL_CHORUS_PHASE 0x0002 +#define AL_CHORUS_RATE 0x0003 +#define AL_CHORUS_DEPTH 0x0004 +#define AL_CHORUS_FEEDBACK 0x0005 +#define AL_CHORUS_DELAY 0x0006 + +/* Distortion effect parameters */ +#define AL_DISTORTION_EDGE 0x0001 +#define AL_DISTORTION_GAIN 0x0002 +#define AL_DISTORTION_LOWPASS_CUTOFF 0x0003 +#define AL_DISTORTION_EQCENTER 0x0004 +#define AL_DISTORTION_EQBANDWIDTH 0x0005 + +/* Echo effect parameters */ +#define AL_ECHO_DELAY 0x0001 +#define AL_ECHO_LRDELAY 0x0002 +#define AL_ECHO_DAMPING 0x0003 +#define AL_ECHO_FEEDBACK 0x0004 +#define AL_ECHO_SPREAD 0x0005 + +/* Flanger effect parameters */ +#define AL_FLANGER_WAVEFORM 0x0001 +#define AL_FLANGER_PHASE 0x0002 +#define AL_FLANGER_RATE 0x0003 +#define AL_FLANGER_DEPTH 0x0004 +#define AL_FLANGER_FEEDBACK 0x0005 +#define AL_FLANGER_DELAY 0x0006 + +/* Frequency shifter effect parameters */ +#define AL_FREQUENCY_SHIFTER_FREQUENCY 0x0001 +#define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION 0x0002 +#define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION 0x0003 + +/* Vocal morpher effect parameters */ +#define AL_VOCAL_MORPHER_PHONEMEA 0x0001 +#define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING 0x0002 +#define AL_VOCAL_MORPHER_PHONEMEB 0x0003 +#define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING 0x0004 +#define AL_VOCAL_MORPHER_WAVEFORM 0x0005 +#define AL_VOCAL_MORPHER_RATE 0x0006 + +/* Pitchshifter effect parameters */ +#define AL_PITCH_SHIFTER_COARSE_TUNE 0x0001 +#define AL_PITCH_SHIFTER_FINE_TUNE 0x0002 + +/* Ringmodulator effect parameters */ +#define AL_RING_MODULATOR_FREQUENCY 0x0001 +#define AL_RING_MODULATOR_HIGHPASS_CUTOFF 0x0002 +#define AL_RING_MODULATOR_WAVEFORM 0x0003 + +/* Autowah effect parameters */ +#define AL_AUTOWAH_ATTACK_TIME 0x0001 +#define AL_AUTOWAH_RELEASE_TIME 0x0002 +#define AL_AUTOWAH_RESONANCE 0x0003 +#define AL_AUTOWAH_PEAK_GAIN 0x0004 + +/* Compressor effect parameters */ +#define AL_COMPRESSOR_ONOFF 0x0001 + +/* Equalizer effect parameters */ +#define AL_EQUALIZER_LOW_GAIN 0x0001 +#define AL_EQUALIZER_LOW_CUTOFF 0x0002 +#define AL_EQUALIZER_MID1_GAIN 0x0003 +#define AL_EQUALIZER_MID1_CENTER 0x0004 +#define AL_EQUALIZER_MID1_WIDTH 0x0005 +#define AL_EQUALIZER_MID2_GAIN 0x0006 +#define AL_EQUALIZER_MID2_CENTER 0x0007 +#define AL_EQUALIZER_MID2_WIDTH 0x0008 +#define AL_EQUALIZER_HIGH_GAIN 0x0009 +#define AL_EQUALIZER_HIGH_CUTOFF 0x000A + +/* Effect type */ +#define AL_EFFECT_FIRST_PARAMETER 0x0000 +#define AL_EFFECT_LAST_PARAMETER 0x8000 +#define AL_EFFECT_TYPE 0x8001 + +/* Effect types, used with the AL_EFFECT_TYPE property */ +#define AL_EFFECT_NULL 0x0000 +#define AL_EFFECT_REVERB 0x0001 +#define AL_EFFECT_CHORUS 0x0002 +#define AL_EFFECT_DISTORTION 0x0003 +#define AL_EFFECT_ECHO 0x0004 +#define AL_EFFECT_FLANGER 0x0005 +#define AL_EFFECT_FREQUENCY_SHIFTER 0x0006 +#define AL_EFFECT_VOCAL_MORPHER 0x0007 +#define AL_EFFECT_PITCH_SHIFTER 0x0008 +#define AL_EFFECT_RING_MODULATOR 0x0009 +#define AL_EFFECT_AUTOWAH 0x000A +#define AL_EFFECT_COMPRESSOR 0x000B +#define AL_EFFECT_EQUALIZER 0x000C +#define AL_EFFECT_EAXREVERB 0x8000 + +/* Auxiliary Effect Slot properties. */ +#define AL_EFFECTSLOT_EFFECT 0x0001 +#define AL_EFFECTSLOT_GAIN 0x0002 +#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO 0x0003 + +/* NULL Auxiliary Slot ID to disable a source send. */ +#define AL_EFFECTSLOT_NULL 0x0000 + + +/* Filter properties. */ + +/* Lowpass filter parameters */ +#define AL_LOWPASS_GAIN 0x0001 +#define AL_LOWPASS_GAINHF 0x0002 + +/* Highpass filter parameters */ +#define AL_HIGHPASS_GAIN 0x0001 +#define AL_HIGHPASS_GAINLF 0x0002 + +/* Bandpass filter parameters */ +#define AL_BANDPASS_GAIN 0x0001 +#define AL_BANDPASS_GAINLF 0x0002 +#define AL_BANDPASS_GAINHF 0x0003 + +/* Filter type */ +#define AL_FILTER_FIRST_PARAMETER 0x0000 +#define AL_FILTER_LAST_PARAMETER 0x8000 +#define AL_FILTER_TYPE 0x8001 + +/* Filter types, used with the AL_FILTER_TYPE property */ +#define AL_FILTER_NULL 0x0000 +#define AL_FILTER_LOWPASS 0x0001 +#define AL_FILTER_HIGHPASS 0x0002 +#define AL_FILTER_BANDPASS 0x0003 + + +/* Effect object function types. */ +typedef void (AL_APIENTRY *LPALGENEFFECTS)(ALsizei, ALuint*); +typedef void (AL_APIENTRY *LPALDELETEEFFECTS)(ALsizei, const ALuint*); +typedef ALboolean (AL_APIENTRY *LPALISEFFECT)(ALuint); +typedef void (AL_APIENTRY *LPALEFFECTI)(ALuint, ALenum, ALint); +typedef void (AL_APIENTRY *LPALEFFECTIV)(ALuint, ALenum, const ALint*); +typedef void (AL_APIENTRY *LPALEFFECTF)(ALuint, ALenum, ALfloat); +typedef void (AL_APIENTRY *LPALEFFECTFV)(ALuint, ALenum, const ALfloat*); +typedef void (AL_APIENTRY *LPALGETEFFECTI)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETEFFECTIV)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETEFFECTF)(ALuint, ALenum, ALfloat*); +typedef void (AL_APIENTRY *LPALGETEFFECTFV)(ALuint, ALenum, ALfloat*); + +/* Filter object function types. */ +typedef void (AL_APIENTRY *LPALGENFILTERS)(ALsizei, ALuint*); +typedef void (AL_APIENTRY *LPALDELETEFILTERS)(ALsizei, const ALuint*); +typedef ALboolean (AL_APIENTRY *LPALISFILTER)(ALuint); +typedef void (AL_APIENTRY *LPALFILTERI)(ALuint, ALenum, ALint); +typedef void (AL_APIENTRY *LPALFILTERIV)(ALuint, ALenum, const ALint*); +typedef void (AL_APIENTRY *LPALFILTERF)(ALuint, ALenum, ALfloat); +typedef void (AL_APIENTRY *LPALFILTERFV)(ALuint, ALenum, const ALfloat*); +typedef void (AL_APIENTRY *LPALGETFILTERI)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETFILTERIV)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETFILTERF)(ALuint, ALenum, ALfloat*); +typedef void (AL_APIENTRY *LPALGETFILTERFV)(ALuint, ALenum, ALfloat*); + +/* Auxiliary Effect Slot object function types. */ +typedef void (AL_APIENTRY *LPALGENAUXILIARYEFFECTSLOTS)(ALsizei, ALuint*); +typedef void (AL_APIENTRY *LPALDELETEAUXILIARYEFFECTSLOTS)(ALsizei, const ALuint*); +typedef ALboolean (AL_APIENTRY *LPALISAUXILIARYEFFECTSLOT)(ALuint); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, const ALint*); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat); +typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, const ALfloat*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, ALint*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*); +typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*); + +#ifdef AL_ALEXT_PROTOTYPES +AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects); +AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects); +AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect); +AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue); +AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues); +AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue); +AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues); +AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue); +AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues); +AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue); +AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues); + +AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters); +AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters); +AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter); +AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue); +AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues); +AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue); +AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues); +AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue); +AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues); +AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue); +AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues); + +AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots); +AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots); +AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue); +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue); +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues); +#endif + +/* Filter ranges and defaults. */ + +/* Lowpass filter */ +#define AL_LOWPASS_MIN_GAIN (0.0f) +#define AL_LOWPASS_MAX_GAIN (1.0f) +#define AL_LOWPASS_DEFAULT_GAIN (1.0f) + +#define AL_LOWPASS_MIN_GAINHF (0.0f) +#define AL_LOWPASS_MAX_GAINHF (1.0f) +#define AL_LOWPASS_DEFAULT_GAINHF (1.0f) + +/* Highpass filter */ +#define AL_HIGHPASS_MIN_GAIN (0.0f) +#define AL_HIGHPASS_MAX_GAIN (1.0f) +#define AL_HIGHPASS_DEFAULT_GAIN (1.0f) + +#define AL_HIGHPASS_MIN_GAINLF (0.0f) +#define AL_HIGHPASS_MAX_GAINLF (1.0f) +#define AL_HIGHPASS_DEFAULT_GAINLF (1.0f) + +/* Bandpass filter */ +#define AL_BANDPASS_MIN_GAIN (0.0f) +#define AL_BANDPASS_MAX_GAIN (1.0f) +#define AL_BANDPASS_DEFAULT_GAIN (1.0f) + +#define AL_BANDPASS_MIN_GAINHF (0.0f) +#define AL_BANDPASS_MAX_GAINHF (1.0f) +#define AL_BANDPASS_DEFAULT_GAINHF (1.0f) + +#define AL_BANDPASS_MIN_GAINLF (0.0f) +#define AL_BANDPASS_MAX_GAINLF (1.0f) +#define AL_BANDPASS_DEFAULT_GAINLF (1.0f) + + +/* Effect parameter ranges and defaults. */ + +/* Standard reverb effect */ +#define AL_REVERB_MIN_DENSITY (0.0f) +#define AL_REVERB_MAX_DENSITY (1.0f) +#define AL_REVERB_DEFAULT_DENSITY (1.0f) + +#define AL_REVERB_MIN_DIFFUSION (0.0f) +#define AL_REVERB_MAX_DIFFUSION (1.0f) +#define AL_REVERB_DEFAULT_DIFFUSION (1.0f) + +#define AL_REVERB_MIN_GAIN (0.0f) +#define AL_REVERB_MAX_GAIN (1.0f) +#define AL_REVERB_DEFAULT_GAIN (0.32f) + +#define AL_REVERB_MIN_GAINHF (0.0f) +#define AL_REVERB_MAX_GAINHF (1.0f) +#define AL_REVERB_DEFAULT_GAINHF (0.89f) + +#define AL_REVERB_MIN_DECAY_TIME (0.1f) +#define AL_REVERB_MAX_DECAY_TIME (20.0f) +#define AL_REVERB_DEFAULT_DECAY_TIME (1.49f) + +#define AL_REVERB_MIN_DECAY_HFRATIO (0.1f) +#define AL_REVERB_MAX_DECAY_HFRATIO (2.0f) +#define AL_REVERB_DEFAULT_DECAY_HFRATIO (0.83f) + +#define AL_REVERB_MIN_REFLECTIONS_GAIN (0.0f) +#define AL_REVERB_MAX_REFLECTIONS_GAIN (3.16f) +#define AL_REVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) + +#define AL_REVERB_MIN_REFLECTIONS_DELAY (0.0f) +#define AL_REVERB_MAX_REFLECTIONS_DELAY (0.3f) +#define AL_REVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) + +#define AL_REVERB_MIN_LATE_REVERB_GAIN (0.0f) +#define AL_REVERB_MAX_LATE_REVERB_GAIN (10.0f) +#define AL_REVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) + +#define AL_REVERB_MIN_LATE_REVERB_DELAY (0.0f) +#define AL_REVERB_MAX_LATE_REVERB_DELAY (0.1f) +#define AL_REVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) + +#define AL_REVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) +#define AL_REVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) +#define AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) + +#define AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) +#define AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) +#define AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + +#define AL_REVERB_MIN_DECAY_HFLIMIT AL_FALSE +#define AL_REVERB_MAX_DECAY_HFLIMIT AL_TRUE +#define AL_REVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + +/* EAX reverb effect */ +#define AL_EAXREVERB_MIN_DENSITY (0.0f) +#define AL_EAXREVERB_MAX_DENSITY (1.0f) +#define AL_EAXREVERB_DEFAULT_DENSITY (1.0f) + +#define AL_EAXREVERB_MIN_DIFFUSION (0.0f) +#define AL_EAXREVERB_MAX_DIFFUSION (1.0f) +#define AL_EAXREVERB_DEFAULT_DIFFUSION (1.0f) + +#define AL_EAXREVERB_MIN_GAIN (0.0f) +#define AL_EAXREVERB_MAX_GAIN (1.0f) +#define AL_EAXREVERB_DEFAULT_GAIN (0.32f) + +#define AL_EAXREVERB_MIN_GAINHF (0.0f) +#define AL_EAXREVERB_MAX_GAINHF (1.0f) +#define AL_EAXREVERB_DEFAULT_GAINHF (0.89f) + +#define AL_EAXREVERB_MIN_GAINLF (0.0f) +#define AL_EAXREVERB_MAX_GAINLF (1.0f) +#define AL_EAXREVERB_DEFAULT_GAINLF (1.0f) + +#define AL_EAXREVERB_MIN_DECAY_TIME (0.1f) +#define AL_EAXREVERB_MAX_DECAY_TIME (20.0f) +#define AL_EAXREVERB_DEFAULT_DECAY_TIME (1.49f) + +#define AL_EAXREVERB_MIN_DECAY_HFRATIO (0.1f) +#define AL_EAXREVERB_MAX_DECAY_HFRATIO (2.0f) +#define AL_EAXREVERB_DEFAULT_DECAY_HFRATIO (0.83f) + +#define AL_EAXREVERB_MIN_DECAY_LFRATIO (0.1f) +#define AL_EAXREVERB_MAX_DECAY_LFRATIO (2.0f) +#define AL_EAXREVERB_DEFAULT_DECAY_LFRATIO (1.0f) + +#define AL_EAXREVERB_MIN_REFLECTIONS_GAIN (0.0f) +#define AL_EAXREVERB_MAX_REFLECTIONS_GAIN (3.16f) +#define AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) + +#define AL_EAXREVERB_MIN_REFLECTIONS_DELAY (0.0f) +#define AL_EAXREVERB_MAX_REFLECTIONS_DELAY (0.3f) +#define AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) + +#define AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ (0.0f) + +#define AL_EAXREVERB_MIN_LATE_REVERB_GAIN (0.0f) +#define AL_EAXREVERB_MAX_LATE_REVERB_GAIN (10.0f) +#define AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) + +#define AL_EAXREVERB_MIN_LATE_REVERB_DELAY (0.0f) +#define AL_EAXREVERB_MAX_LATE_REVERB_DELAY (0.1f) +#define AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) + +#define AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ (0.0f) + +#define AL_EAXREVERB_MIN_ECHO_TIME (0.075f) +#define AL_EAXREVERB_MAX_ECHO_TIME (0.25f) +#define AL_EAXREVERB_DEFAULT_ECHO_TIME (0.25f) + +#define AL_EAXREVERB_MIN_ECHO_DEPTH (0.0f) +#define AL_EAXREVERB_MAX_ECHO_DEPTH (1.0f) +#define AL_EAXREVERB_DEFAULT_ECHO_DEPTH (0.0f) + +#define AL_EAXREVERB_MIN_MODULATION_TIME (0.04f) +#define AL_EAXREVERB_MAX_MODULATION_TIME (4.0f) +#define AL_EAXREVERB_DEFAULT_MODULATION_TIME (0.25f) + +#define AL_EAXREVERB_MIN_MODULATION_DEPTH (0.0f) +#define AL_EAXREVERB_MAX_MODULATION_DEPTH (1.0f) +#define AL_EAXREVERB_DEFAULT_MODULATION_DEPTH (0.0f) + +#define AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) +#define AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) +#define AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) + +#define AL_EAXREVERB_MIN_HFREFERENCE (1000.0f) +#define AL_EAXREVERB_MAX_HFREFERENCE (20000.0f) +#define AL_EAXREVERB_DEFAULT_HFREFERENCE (5000.0f) + +#define AL_EAXREVERB_MIN_LFREFERENCE (20.0f) +#define AL_EAXREVERB_MAX_LFREFERENCE (1000.0f) +#define AL_EAXREVERB_DEFAULT_LFREFERENCE (250.0f) + +#define AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) +#define AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) +#define AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + +#define AL_EAXREVERB_MIN_DECAY_HFLIMIT AL_FALSE +#define AL_EAXREVERB_MAX_DECAY_HFLIMIT AL_TRUE +#define AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + +/* Chorus effect */ +#define AL_CHORUS_WAVEFORM_SINUSOID (0) +#define AL_CHORUS_WAVEFORM_TRIANGLE (1) + +#define AL_CHORUS_MIN_WAVEFORM (0) +#define AL_CHORUS_MAX_WAVEFORM (1) +#define AL_CHORUS_DEFAULT_WAVEFORM (1) + +#define AL_CHORUS_MIN_PHASE (-180) +#define AL_CHORUS_MAX_PHASE (180) +#define AL_CHORUS_DEFAULT_PHASE (90) + +#define AL_CHORUS_MIN_RATE (0.0f) +#define AL_CHORUS_MAX_RATE (10.0f) +#define AL_CHORUS_DEFAULT_RATE (1.1f) + +#define AL_CHORUS_MIN_DEPTH (0.0f) +#define AL_CHORUS_MAX_DEPTH (1.0f) +#define AL_CHORUS_DEFAULT_DEPTH (0.1f) + +#define AL_CHORUS_MIN_FEEDBACK (-1.0f) +#define AL_CHORUS_MAX_FEEDBACK (1.0f) +#define AL_CHORUS_DEFAULT_FEEDBACK (0.25f) + +#define AL_CHORUS_MIN_DELAY (0.0f) +#define AL_CHORUS_MAX_DELAY (0.016f) +#define AL_CHORUS_DEFAULT_DELAY (0.016f) + +/* Distortion effect */ +#define AL_DISTORTION_MIN_EDGE (0.0f) +#define AL_DISTORTION_MAX_EDGE (1.0f) +#define AL_DISTORTION_DEFAULT_EDGE (0.2f) + +#define AL_DISTORTION_MIN_GAIN (0.01f) +#define AL_DISTORTION_MAX_GAIN (1.0f) +#define AL_DISTORTION_DEFAULT_GAIN (0.05f) + +#define AL_DISTORTION_MIN_LOWPASS_CUTOFF (80.0f) +#define AL_DISTORTION_MAX_LOWPASS_CUTOFF (24000.0f) +#define AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF (8000.0f) + +#define AL_DISTORTION_MIN_EQCENTER (80.0f) +#define AL_DISTORTION_MAX_EQCENTER (24000.0f) +#define AL_DISTORTION_DEFAULT_EQCENTER (3600.0f) + +#define AL_DISTORTION_MIN_EQBANDWIDTH (80.0f) +#define AL_DISTORTION_MAX_EQBANDWIDTH (24000.0f) +#define AL_DISTORTION_DEFAULT_EQBANDWIDTH (3600.0f) + +/* Echo effect */ +#define AL_ECHO_MIN_DELAY (0.0f) +#define AL_ECHO_MAX_DELAY (0.207f) +#define AL_ECHO_DEFAULT_DELAY (0.1f) + +#define AL_ECHO_MIN_LRDELAY (0.0f) +#define AL_ECHO_MAX_LRDELAY (0.404f) +#define AL_ECHO_DEFAULT_LRDELAY (0.1f) + +#define AL_ECHO_MIN_DAMPING (0.0f) +#define AL_ECHO_MAX_DAMPING (0.99f) +#define AL_ECHO_DEFAULT_DAMPING (0.5f) + +#define AL_ECHO_MIN_FEEDBACK (0.0f) +#define AL_ECHO_MAX_FEEDBACK (1.0f) +#define AL_ECHO_DEFAULT_FEEDBACK (0.5f) + +#define AL_ECHO_MIN_SPREAD (-1.0f) +#define AL_ECHO_MAX_SPREAD (1.0f) +#define AL_ECHO_DEFAULT_SPREAD (-1.0f) + +/* Flanger effect */ +#define AL_FLANGER_WAVEFORM_SINUSOID (0) +#define AL_FLANGER_WAVEFORM_TRIANGLE (1) + +#define AL_FLANGER_MIN_WAVEFORM (0) +#define AL_FLANGER_MAX_WAVEFORM (1) +#define AL_FLANGER_DEFAULT_WAVEFORM (1) + +#define AL_FLANGER_MIN_PHASE (-180) +#define AL_FLANGER_MAX_PHASE (180) +#define AL_FLANGER_DEFAULT_PHASE (0) + +#define AL_FLANGER_MIN_RATE (0.0f) +#define AL_FLANGER_MAX_RATE (10.0f) +#define AL_FLANGER_DEFAULT_RATE (0.27f) + +#define AL_FLANGER_MIN_DEPTH (0.0f) +#define AL_FLANGER_MAX_DEPTH (1.0f) +#define AL_FLANGER_DEFAULT_DEPTH (1.0f) + +#define AL_FLANGER_MIN_FEEDBACK (-1.0f) +#define AL_FLANGER_MAX_FEEDBACK (1.0f) +#define AL_FLANGER_DEFAULT_FEEDBACK (-0.5f) + +#define AL_FLANGER_MIN_DELAY (0.0f) +#define AL_FLANGER_MAX_DELAY (0.004f) +#define AL_FLANGER_DEFAULT_DELAY (0.002f) + +/* Frequency shifter effect */ +#define AL_FREQUENCY_SHIFTER_MIN_FREQUENCY (0.0f) +#define AL_FREQUENCY_SHIFTER_MAX_FREQUENCY (24000.0f) +#define AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY (0.0f) + +#define AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION (0) +#define AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION (2) +#define AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION (0) + +#define AL_FREQUENCY_SHIFTER_DIRECTION_DOWN (0) +#define AL_FREQUENCY_SHIFTER_DIRECTION_UP (1) +#define AL_FREQUENCY_SHIFTER_DIRECTION_OFF (2) + +#define AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION (0) +#define AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION (2) +#define AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION (0) + +/* Vocal morpher effect */ +#define AL_VOCAL_MORPHER_MIN_PHONEMEA (0) +#define AL_VOCAL_MORPHER_MAX_PHONEMEA (29) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA (0) + +#define AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING (-24) +#define AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING (24) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING (0) + +#define AL_VOCAL_MORPHER_MIN_PHONEMEB (0) +#define AL_VOCAL_MORPHER_MAX_PHONEMEB (29) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB (10) + +#define AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING (-24) +#define AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING (24) +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING (0) + +#define AL_VOCAL_MORPHER_PHONEME_A (0) +#define AL_VOCAL_MORPHER_PHONEME_E (1) +#define AL_VOCAL_MORPHER_PHONEME_I (2) +#define AL_VOCAL_MORPHER_PHONEME_O (3) +#define AL_VOCAL_MORPHER_PHONEME_U (4) +#define AL_VOCAL_MORPHER_PHONEME_AA (5) +#define AL_VOCAL_MORPHER_PHONEME_AE (6) +#define AL_VOCAL_MORPHER_PHONEME_AH (7) +#define AL_VOCAL_MORPHER_PHONEME_AO (8) +#define AL_VOCAL_MORPHER_PHONEME_EH (9) +#define AL_VOCAL_MORPHER_PHONEME_ER (10) +#define AL_VOCAL_MORPHER_PHONEME_IH (11) +#define AL_VOCAL_MORPHER_PHONEME_IY (12) +#define AL_VOCAL_MORPHER_PHONEME_UH (13) +#define AL_VOCAL_MORPHER_PHONEME_UW (14) +#define AL_VOCAL_MORPHER_PHONEME_B (15) +#define AL_VOCAL_MORPHER_PHONEME_D (16) +#define AL_VOCAL_MORPHER_PHONEME_F (17) +#define AL_VOCAL_MORPHER_PHONEME_G (18) +#define AL_VOCAL_MORPHER_PHONEME_J (19) +#define AL_VOCAL_MORPHER_PHONEME_K (20) +#define AL_VOCAL_MORPHER_PHONEME_L (21) +#define AL_VOCAL_MORPHER_PHONEME_M (22) +#define AL_VOCAL_MORPHER_PHONEME_N (23) +#define AL_VOCAL_MORPHER_PHONEME_P (24) +#define AL_VOCAL_MORPHER_PHONEME_R (25) +#define AL_VOCAL_MORPHER_PHONEME_S (26) +#define AL_VOCAL_MORPHER_PHONEME_T (27) +#define AL_VOCAL_MORPHER_PHONEME_V (28) +#define AL_VOCAL_MORPHER_PHONEME_Z (29) + +#define AL_VOCAL_MORPHER_WAVEFORM_SINUSOID (0) +#define AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE (1) +#define AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH (2) + +#define AL_VOCAL_MORPHER_MIN_WAVEFORM (0) +#define AL_VOCAL_MORPHER_MAX_WAVEFORM (2) +#define AL_VOCAL_MORPHER_DEFAULT_WAVEFORM (0) + +#define AL_VOCAL_MORPHER_MIN_RATE (0.0f) +#define AL_VOCAL_MORPHER_MAX_RATE (10.0f) +#define AL_VOCAL_MORPHER_DEFAULT_RATE (1.41f) + +/* Pitch shifter effect */ +#define AL_PITCH_SHIFTER_MIN_COARSE_TUNE (-12) +#define AL_PITCH_SHIFTER_MAX_COARSE_TUNE (12) +#define AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE (12) + +#define AL_PITCH_SHIFTER_MIN_FINE_TUNE (-50) +#define AL_PITCH_SHIFTER_MAX_FINE_TUNE (50) +#define AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE (0) + +/* Ring modulator effect */ +#define AL_RING_MODULATOR_MIN_FREQUENCY (0.0f) +#define AL_RING_MODULATOR_MAX_FREQUENCY (8000.0f) +#define AL_RING_MODULATOR_DEFAULT_FREQUENCY (440.0f) + +#define AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF (0.0f) +#define AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF (24000.0f) +#define AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF (800.0f) + +#define AL_RING_MODULATOR_SINUSOID (0) +#define AL_RING_MODULATOR_SAWTOOTH (1) +#define AL_RING_MODULATOR_SQUARE (2) + +#define AL_RING_MODULATOR_MIN_WAVEFORM (0) +#define AL_RING_MODULATOR_MAX_WAVEFORM (2) +#define AL_RING_MODULATOR_DEFAULT_WAVEFORM (0) + +/* Autowah effect */ +#define AL_AUTOWAH_MIN_ATTACK_TIME (0.0001f) +#define AL_AUTOWAH_MAX_ATTACK_TIME (1.0f) +#define AL_AUTOWAH_DEFAULT_ATTACK_TIME (0.06f) + +#define AL_AUTOWAH_MIN_RELEASE_TIME (0.0001f) +#define AL_AUTOWAH_MAX_RELEASE_TIME (1.0f) +#define AL_AUTOWAH_DEFAULT_RELEASE_TIME (0.06f) + +#define AL_AUTOWAH_MIN_RESONANCE (2.0f) +#define AL_AUTOWAH_MAX_RESONANCE (1000.0f) +#define AL_AUTOWAH_DEFAULT_RESONANCE (1000.0f) + +#define AL_AUTOWAH_MIN_PEAK_GAIN (0.00003f) +#define AL_AUTOWAH_MAX_PEAK_GAIN (31621.0f) +#define AL_AUTOWAH_DEFAULT_PEAK_GAIN (11.22f) + +/* Compressor effect */ +#define AL_COMPRESSOR_MIN_ONOFF (0) +#define AL_COMPRESSOR_MAX_ONOFF (1) +#define AL_COMPRESSOR_DEFAULT_ONOFF (1) + +/* Equalizer effect */ +#define AL_EQUALIZER_MIN_LOW_GAIN (0.126f) +#define AL_EQUALIZER_MAX_LOW_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_LOW_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_LOW_CUTOFF (50.0f) +#define AL_EQUALIZER_MAX_LOW_CUTOFF (800.0f) +#define AL_EQUALIZER_DEFAULT_LOW_CUTOFF (200.0f) + +#define AL_EQUALIZER_MIN_MID1_GAIN (0.126f) +#define AL_EQUALIZER_MAX_MID1_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_MID1_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_MID1_CENTER (200.0f) +#define AL_EQUALIZER_MAX_MID1_CENTER (3000.0f) +#define AL_EQUALIZER_DEFAULT_MID1_CENTER (500.0f) + +#define AL_EQUALIZER_MIN_MID1_WIDTH (0.01f) +#define AL_EQUALIZER_MAX_MID1_WIDTH (1.0f) +#define AL_EQUALIZER_DEFAULT_MID1_WIDTH (1.0f) + +#define AL_EQUALIZER_MIN_MID2_GAIN (0.126f) +#define AL_EQUALIZER_MAX_MID2_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_MID2_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_MID2_CENTER (1000.0f) +#define AL_EQUALIZER_MAX_MID2_CENTER (8000.0f) +#define AL_EQUALIZER_DEFAULT_MID2_CENTER (3000.0f) + +#define AL_EQUALIZER_MIN_MID2_WIDTH (0.01f) +#define AL_EQUALIZER_MAX_MID2_WIDTH (1.0f) +#define AL_EQUALIZER_DEFAULT_MID2_WIDTH (1.0f) + +#define AL_EQUALIZER_MIN_HIGH_GAIN (0.126f) +#define AL_EQUALIZER_MAX_HIGH_GAIN (7.943f) +#define AL_EQUALIZER_DEFAULT_HIGH_GAIN (1.0f) + +#define AL_EQUALIZER_MIN_HIGH_CUTOFF (4000.0f) +#define AL_EQUALIZER_MAX_HIGH_CUTOFF (16000.0f) +#define AL_EQUALIZER_DEFAULT_HIGH_CUTOFF (6000.0f) + + +/* Source parameter value ranges and defaults. */ +#define AL_MIN_AIR_ABSORPTION_FACTOR (0.0f) +#define AL_MAX_AIR_ABSORPTION_FACTOR (10.0f) +#define AL_DEFAULT_AIR_ABSORPTION_FACTOR (0.0f) + +#define AL_MIN_ROOM_ROLLOFF_FACTOR (0.0f) +#define AL_MAX_ROOM_ROLLOFF_FACTOR (10.0f) +#define AL_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + +#define AL_MIN_CONE_OUTER_GAINHF (0.0f) +#define AL_MAX_CONE_OUTER_GAINHF (1.0f) +#define AL_DEFAULT_CONE_OUTER_GAINHF (1.0f) + +#define AL_MIN_DIRECT_FILTER_GAINHF_AUTO AL_FALSE +#define AL_MAX_DIRECT_FILTER_GAINHF_AUTO AL_TRUE +#define AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO AL_TRUE + +#define AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_FALSE +#define AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE +#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE + +#define AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_FALSE +#define AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE +#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE + + +/* Listener parameter value ranges and defaults. */ +#define AL_MIN_METERS_PER_UNIT FLT_MIN +#define AL_MAX_METERS_PER_UNIT FLT_MAX +#define AL_DEFAULT_METERS_PER_UNIT (1.0f) + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* AL_EFX_H */ diff --git a/src/sound/openal.c b/src/sound/openal.c index cf6ec9491..95619e79b 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -26,9 +26,9 @@ # undef ALC_API # define AL_LIBTYPE_STATIC # define ALC_LIBTYPE_STATIC -# include "al.h" -# include "alc.h" -# include "alext.h" +# include "AL/al.h" +# include "AL/alc.h" +# include "AL/alext.h" #include <86box/86box.h> #include <86box/sound.h> #include <86box/midi.h> diff --git a/src/unix/unix.c b/src/unix/unix.c index ee4e62be5..2aa09d8f6 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -7,7 +7,9 @@ #define _DARWIN_C_SOURCE 1 #endif #include +#include #include +#include #include #include #include @@ -578,6 +580,19 @@ void mouse_poll() extern int real_sdl_w, real_sdl_h; static int exit_event = 0; void ui_sb_set_ready(int ready) {} +char* xargv[512]; + +// From musl. +char *local_strsep(char **str, const char *sep) +{ + char *s = *str, *end; + if (!s) return NULL; + end = s + strcspn(s, sep); + if (*end) *end++ = 0; + else end = 0; + *str = end; + return s; +} void monitor_thread(void* param) { @@ -588,20 +603,81 @@ void monitor_thread(void* param) printf("86Box monitor console.\n"); while (!exit_event) { + if (feof(stdin)) break; printf("(86Box) "); getline(&line, &n, stdin); if (line) { - line[n - 1] = '\0'; - if (strncasecmp(line, "exit", 4) == 0) + int cmdargc = 0; + char* linecpy; + line[strcspn(line, "\r\n")] = '\0'; + linecpy = strdup(line); + if (!linecpy) + { + free(line); + line = NULL; + continue; + } + memset(xargv, 0, sizeof(xargv)); + while(1) + { + xargv[cmdargc++] = local_strsep(&linecpy, " "); + if (xargv[cmdargc - 1] == NULL || cmdargc >= 512) break; + } + if (strncasecmp(xargv[0], "exit", 4) == 0) { exit_event = 1; } - else if (strncasecmp(line, "fddload", sizeof("fddload") - 1) == 0) + else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { - + uint8_t id, wp; + bool err = false; + char fn[PATH_MAX]; + memset(fn, 0, sizeof(fn)); + if (xargv[2][0] == '\'' || xargv[2][0] == '"') + { + int curarg = 2; + for (curarg = 2; curarg < cmdargc; curarg++) + { + if (strlen(fn) + strlen(xargv[curarg]) >= PATH_MAX) + { + err = true; + fprintf(stderr, "Path name too long.\n"); + } + strcat(fn, xargv[curarg]); + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + { + if (curarg + 1 < cmdargc) + { + wp = atoi(xargv[curarg + 1]); + } + break; + } + strcat(fn, " "); + } + } + else + { + if (strlen(xargv[2]) < PATH_MAX) + { + strcpy(fn, xargv[2]); + wp = atoi(xargv[3]); + } + else + { + fprintf(stderr, "Path name too long.\n"); + } + } + if (!err) + { + printf("Inserting disk into floppy drive %hhu: %s\n", id, fn); + floppy_mount(id, fn, wp); + } } free(line); + free(linecpy); + line = NULL; } } } From 6d84d193807553abc120085173857efd51d754a3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 26 Aug 2021 00:15:42 +0600 Subject: [PATCH 42/75] Delegate title setting to main thread on macOS Resizing is done in main thread regardless of Unix platform --- src/unix/unix.c | 19 +++++++++++---- src/unix/unix_sdl.c | 58 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 2aa09d8f6..690eed5f5 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -41,6 +41,8 @@ int kbd_req_capture; int hide_status_bar; int fixed_size_x = 640; int fixed_size_y = 480; +extern int title_set; +extern wchar_t sdl_win_title[512]; plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; joystick_t joystick_state[MAX_JOYSTICKS]; int joysticks_present; @@ -509,7 +511,7 @@ do_stop(void) is_quit = 1; - startblit(); + //startblit(); sdl_close(); @@ -682,7 +684,7 @@ void monitor_thread(void* param) } } } - +SDL_threadID eventthread; int main(int argc, char** argv) { SDL_Event event; @@ -694,6 +696,8 @@ int main(int argc, char** argv) SDL_Quit(); return 6; } + + eventthread = SDL_ThreadID(); blitmtx = SDL_CreateMutex(); if (!blitmtx) { @@ -815,16 +819,21 @@ int main(int argc, char** argv) if (mouse_capture && keyboard_ismsexit()) { plat_mouse_capture(0); + } + if (SDL_GetTicks() - onesec_tic >= 1000) + { + onesec_tic = SDL_GetTicks(); + pc_onesec(); } if (blitreq) { extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); sdl_blit(params.x, params.y, params.y1, params.y2, params.w, params.h); } - if (SDL_GetTicks() - onesec_tic >= 1000) + if (title_set) { - onesec_tic = SDL_GetTicks(); - pc_onesec(); + extern void ui_window_title_real(); + ui_window_title_real(); } if (exit_event) { diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 79e9749ac..c78755fd6 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -38,6 +38,10 @@ static int cur_wx = 0, cur_wy = 0, cur_ww =0, cur_wh = 0; static volatile int sdl_enabled = 1; static SDL_mutex* sdl_mutex = NULL; int mouse_capture; +int title_set = 0; +int resize_pending = 0; +int resize_w = 0; +int resize_h = 0; static void sdl_integer_scale(double *d, double *g) @@ -128,6 +132,8 @@ sdl_blit_shim(int x, int y, int y1, int y2, int w, int h) blitreq = 1; } +void ui_window_title_real(); + void sdl_blit(int x, int y, int y1, int y2, int w, int h) { @@ -141,6 +147,11 @@ sdl_blit(int x, int y, int y1, int y2, int w, int h) SDL_LockMutex(sdl_mutex); + if (resize_pending) + { + sdl_resize(resize_w, resize_h); + resize_pending = 0; + } r_src.x = 0; r_src.y = y1; r_src.w = w; @@ -308,7 +319,6 @@ sdl_resize(int x, int y) cur_wh = wh; SDL_SetWindowSize(sdl_win, cur_ww, cur_wh); - SDL_SetWindowPosition(sdl_win, cur_wx, cur_wy); sdl_reinit_texture(); @@ -419,26 +429,52 @@ int real_sdl_w = SCREEN_RES_X, real_sdl_h = SCREEN_RES_Y; void plat_resize(int w, int h) { - SDL_SetWindowSize(sdl_win, w, h); - real_sdl_w = w, real_sdl_h = h; + SDL_LockMutex(sdl_mutex); + resize_w = w; + resize_h = h; + resize_pending = 1; + SDL_UnlockMutex(sdl_mutex); } -wchar_t sdl_win_title[512] = L"86Box"; -wchar_t* ui_window_title(wchar_t* str) +wchar_t sdl_win_title[512] = { L'8', L'6', L'B', L'o', L'x', 0 }; +SDL_mutex* titlemtx = NULL; + +void ui_window_title_real() { char* res; - if (!str) return sdl_win_title; if (sizeof(wchar_t) == 1) { - SDL_SetWindowTitle(sdl_win, (char*)str); - return str; + SDL_SetWindowTitle(sdl_win, (char*)sdl_win_title); + return; } - res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)str, wcslen(str) * sizeof(wchar_t) + sizeof(wchar_t)); + res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)sdl_win_title, wcslen(sdl_win_title) * sizeof(wchar_t) + sizeof(wchar_t)); if (res) { SDL_SetWindowTitle(sdl_win, res); - wcsncpy(sdl_win_title, str, 512); SDL_free((void*)res); } - return str; + title_set = 0; } +extern SDL_threadID eventthread; + +/* Only activate threading path on macOS, otherwise it will softlock Xorg. + Wayland doesn't seem to have this issue. */ +wchar_t* ui_window_title(wchar_t* str) +{ + if (!str) return sdl_win_title; +#ifdef __APPLE__ + if (eventthread == SDL_ThreadID()) +#endif + { + memset(sdl_win_title, 0, sizeof(sdl_win_title)); + wcsncpy(sdl_win_title, str, 512); + ui_window_title_real(); + return str; + } +#ifdef __APPLE__ + memset(sdl_win_title, 0, sizeof(sdl_win_title)); + wcsncpy(sdl_win_title, str, 512); + title_set = 1; +#endif + return str; +} \ No newline at end of file From 766f321d4dbfdafe5ab4e89065b7da3b10cdef65 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 26 Aug 2021 00:38:29 +0600 Subject: [PATCH 43/75] Add missing string.h include on new codegen backends --- src/codegen_new/codegen_backend_arm64.c | 1 + src/codegen_new/codegen_backend_x86-64.c | 1 + src/codegen_new/codegen_backend_x86.c | 1 + 3 files changed, 3 insertions(+) diff --git a/src/codegen_new/codegen_backend_arm64.c b/src/codegen_new/codegen_backend_arm64.c index 6571a0ad3..2ccdab3a2 100644 --- a/src/codegen_new/codegen_backend_arm64.c +++ b/src/codegen_new/codegen_backend_arm64.c @@ -22,6 +22,7 @@ #if defined WIN32 || defined _WIN32 || defined _WIN32 #include #endif +#include void *codegen_mem_load_byte; void *codegen_mem_load_word; diff --git a/src/codegen_new/codegen_backend_x86-64.c b/src/codegen_new/codegen_backend_x86-64.c index e1a188310..7c3e4f39a 100644 --- a/src/codegen_new/codegen_backend_x86-64.c +++ b/src/codegen_new/codegen_backend_x86-64.c @@ -21,6 +21,7 @@ #if defined WIN32 || defined _WIN32 || defined _WIN32 #include #endif +#include void *codegen_mem_load_byte; void *codegen_mem_load_word; diff --git a/src/codegen_new/codegen_backend_x86.c b/src/codegen_new/codegen_backend_x86.c index 1e22caa2e..8aa2a5975 100644 --- a/src/codegen_new/codegen_backend_x86.c +++ b/src/codegen_new/codegen_backend_x86.c @@ -23,6 +23,7 @@ #if defined WIN32 || defined _WIN32 || defined _WIN32 #include #endif +#include void *codegen_mem_load_byte; void *codegen_mem_load_word; From 426df481517f934e8dfd48e19f617fac2933b221 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 26 Aug 2021 14:27:52 +0600 Subject: [PATCH 44/75] Add correct library names for macOS --- src/network/net_pcap.c | 2 ++ src/network/pcap_if.c | 2 ++ src/printer/png.c | 2 ++ src/printer/prt_ps.c | 7 ++++++- src/sound/midi_fluidsynth.c | 2 ++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/network/net_pcap.c b/src/network/net_pcap.c index efbda840c..ba56cebfb 100644 --- a/src/network/net_pcap.c +++ b/src/network/net_pcap.c @@ -248,6 +248,8 @@ net_pcap_prepare(netdev_t *list) /* Try loading the DLL. */ #ifdef _WIN32 pcap_handle = dynld_module("wpcap.dll", pcap_imports); +#elif defined __APPLE__ + pcap_handle = dynld_module("libpcap.dylib", pcap_imports); #else pcap_handle = dynld_module("libpcap.so", pcap_imports); #endif diff --git a/src/network/pcap_if.c b/src/network/pcap_if.c index 7f08b723d..f168f7ae0 100644 --- a/src/network/pcap_if.c +++ b/src/network/pcap_if.c @@ -269,6 +269,8 @@ main(int argc, char **argv) /* Try loading the DLL. */ #ifdef _WIN32 pcap_handle = dynld_module("wpcap.dll", pcap_imports); +#elif defined __APPLE__ + pcap_handle = dynld_module("libpcap.dylib", pcap_imports); #else pcap_handle = dynld_module("libpcap.so", pcap_imports); #endif diff --git a/src/printer/png.c b/src/printer/png.c index 4941c3098..22488a9ba 100644 --- a/src/printer/png.c +++ b/src/printer/png.c @@ -61,6 +61,8 @@ #ifdef _WIN32 # define PATH_PNG_DLL "libpng16-16.dll" +#elif defined __APPLE__ +# define PATH_PNG_DLL "libpng16.dylib" #else # define PATH_PNG_DLL "libpng16.so" #endif diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index de30a962c..5f16784cb 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -43,8 +43,13 @@ #define GS_ARG_ENCODING_UTF8 1 #define gs_error_Quit -101 +#ifdef _WIN32 #define PATH_GHOSTSCRIPT_DLL "gsdll32.dll" -#define PATH_GHOSTSCRIPT_SO "libgs.so" +#elif defined __APPLE__ +#define PATH_GHOSTSCRIPT_DLL "libgs.dylib" +#else +#define PATH_GHOSTSCRIPT_DLL "libgs.so" +#endif #define POSTSCRIPT_BUFFER_LENGTH 65536 diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c index b91597309..874d328f3 100644 --- a/src/sound/midi_fluidsynth.c +++ b/src/sound/midi_fluidsynth.c @@ -225,6 +225,8 @@ void* fluidsynth_init(const device_t *info) /* Try loading the DLL. */ #ifdef _WIN32 fluidsynth_handle = dynld_module("libfluidsynth.dll", fluidsynth_imports); +#elif defined __APPLE__ + fluidsynth_handle = dynld_module("libfluidsynth.dylib", fluidsynth_imports); #else fluidsynth_handle = dynld_module("libfluidsynth.so", fluidsynth_imports); #endif From e177488e90075a8388507f8364284395edbeba86 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 26 Aug 2021 17:09:39 +0600 Subject: [PATCH 45/75] Add cdload command and fix fddload command --- src/unix/unix.c | 66 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 690eed5f5..e85f71e2b 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -596,6 +596,8 @@ char *local_strsep(char **str, const char *sep) return s; } + + void monitor_thread(void* param) { if (isatty(fileno(stdin)) && isatty(fileno(stdout))) @@ -630,11 +632,16 @@ void monitor_thread(void* param) { exit_event = 1; } - else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) + else if (strncasecmp(xargv[0], "hardreset", 9) == 0) { - uint8_t id, wp; + pc_reset_hard(); + } + else if (strncasecmp(xargv[0], "cdload", 6) == 0 && cmdargc >= 3) + { + uint8_t id; bool err = false; char fn[PATH_MAX]; + id = atoi(xargv[1]); memset(fn, 0, sizeof(fn)); if (xargv[2][0] == '\'' || xargv[2][0] == '"') { @@ -646,7 +653,53 @@ void monitor_thread(void* param) err = true; fprintf(stderr, "Path name too long.\n"); } - strcat(fn, xargv[curarg]); + strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + { + break; + } + strcat(fn, " "); + } + } + else + { + if (strlen(xargv[2]) < PATH_MAX) + { + strcpy(fn, xargv[2]); + } + else + { + fprintf(stderr, "Path name too long.\n"); + } + } + if (!err) + { + + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; + printf("Inserting disk into CD-ROM drive %hhu: %s\n", id, fn); + cdrom_mount(id, fn); + } + } + else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) + { + uint8_t id, wp; + bool err = false; + char fn[PATH_MAX]; + memset(fn, 0, sizeof(fn)); + id = atoi(xargv[1]); + if (xargv[2][0] == '\'' || xargv[2][0] == '"') + { + int curarg = 2; + for (curarg = 2; curarg < cmdargc; curarg++) + { + if (strlen(fn) + strlen(xargv[curarg]) >= PATH_MAX) + { + err = true; + fprintf(stderr, "Path name too long.\n"); + } + strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') { @@ -673,7 +726,10 @@ void monitor_thread(void* param) } if (!err) { - printf("Inserting disk into floppy drive %hhu: %s\n", id, fn); + + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; + printf("Inserting disk into floppy drive %c: %s\n", id + 'A', fn); floppy_mount(id, fn, wp); } } @@ -841,7 +897,7 @@ int main(int argc, char** argv) break; } } - + printf("\n"); SDL_DestroyMutex(blitmtx); SDL_Quit(); return 0; From 8f5ce757ee0b392213d06f875ad48184d48b2e79 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 26 Aug 2021 17:41:55 +0600 Subject: [PATCH 46/75] Fix null access crashes --- src/unix/unix.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index e85f71e2b..e7c5c8ba7 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -641,6 +641,13 @@ void monitor_thread(void* param) uint8_t id; bool err = false; char fn[PATH_MAX]; + if (!xargv[2] || !xargv[1]) + { + free(line); + free(linecpy); + line = NULL; + continue; + } id = atoi(xargv[1]); memset(fn, 0, sizeof(fn)); if (xargv[2][0] == '\'' || xargv[2][0] == '"') @@ -688,6 +695,13 @@ void monitor_thread(void* param) bool err = false; char fn[PATH_MAX]; memset(fn, 0, sizeof(fn)); + if (!xargv[2] || !xargv[1]) + { + free(line); + free(linecpy); + line = NULL; + continue; + } id = atoi(xargv[1]); if (xargv[2][0] == '\'' || xargv[2][0] == '"') { From b61a15805d97c2bc8ebf3d8fce72e303ec53bfa0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 27 Aug 2021 01:11:52 +0600 Subject: [PATCH 47/75] Implement cdeject and fddeject --- src/unix/unix.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index e7c5c8ba7..f960d68ed 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -685,10 +685,18 @@ void monitor_thread(void* param) if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; - printf("Inserting disk into CD-ROM drive %hhu: %s\n", id, fn); + printf("Inserting disc into CD-ROM drive %hhu: %s\n", id, fn); cdrom_mount(id, fn); } } + else if (strncasecmp(xargv[0], "fddeject", 8) == 0 && cmdargc >= 3) + { + floppy_eject(atof(xargv[2])); + } + else if (strncasecmp(xargv[0], "cdeject", 8) == 0 && cmdargc >= 3) + { + cdrom_mount(atof(xargv[2]), ""); + } else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { uint8_t id, wp; From ac8d2815274970750550b9282cf4a8c835a53585 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 27 Aug 2021 21:36:09 +0600 Subject: [PATCH 48/75] Linux ALSA MIDI support (Input not working) --- src/unix/CMakeLists.txt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index e3f5b5780..2371124df 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -1,5 +1,19 @@ -add_library(plat STATIC unix_thread.c unix_midi.c) +set(PLAT_SOURCES unix_thread.c) +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + find_package(ALSA) + if (ALSA_FOUND) + set(PLAT_SOURCES ${PLAT_SOURCES} linux_midi_alsa.c) + else() + set(PLAT_SOURCES ${PLAT_SOURCES} unix_midi.c) + endif() +else() + set(PLAT_SOURCES ${PLAT_SOURCES} unix_midi.c) +endif() +add_library(plat STATIC ${PLAT_SOURCES}) add_library(ui STATIC unix.c unix_sdl.c unix_cdrom.c) target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64) target_link_libraries(ui dl) -target_link_libraries(plat pthread) \ No newline at end of file +target_link_libraries(plat pthread) +if (ALSA_FOUND) + target_link_libraries(plat ALSA::ALSA) +endif() \ No newline at end of file From 0f9dd7b970f137a257ecbb9c059e9b1b7491f4d3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 27 Aug 2021 22:48:45 +0600 Subject: [PATCH 49/75] Add missing stdlib.h include to codegen_backend_x86-64.c --- src/codegen_new/codegen_backend_x86-64.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/codegen_new/codegen_backend_x86-64.c b/src/codegen_new/codegen_backend_x86-64.c index 7c3e4f39a..02bcf2ab3 100644 --- a/src/codegen_new/codegen_backend_x86-64.c +++ b/src/codegen_new/codegen_backend_x86-64.c @@ -1,5 +1,6 @@ #if defined __amd64__ || defined _M_X64 +#include #include #include <86box/86box.h> #include "cpu.h" From 867fbec2fcfd4a0c2751e4234953ea0d107b8ea1 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 27 Aug 2021 23:14:26 +0600 Subject: [PATCH 50/75] Add ALSA MIDI input support --- src/unix/linux_midi_alsa.c | 367 +++++++++++++++++++++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 src/unix/linux_midi_alsa.c diff --git a/src/unix/linux_midi_alsa.c b/src/unix/linux_midi_alsa.c new file mode 100644 index 000000000..53050ff5c --- /dev/null +++ b/src/unix/linux_midi_alsa.c @@ -0,0 +1,367 @@ +#include +#include <86box/86box.h> +#include <86box/config.h> +#include <86box/midi.h> +#include <86box/plat.h> + +#define MAX_MIDI_DEVICES 128 + +static struct +{ + int card; + int device; + int sub; + char name[50]; +} midi_devices[MAX_MIDI_DEVICES], midi_in_devices[MAX_MIDI_DEVICES]; + +static int midi_device_count = 0, midi_in_device_count = 0; + +static int midi_queried = 0, midi_in_queried = 0; + +static snd_rawmidi_t *midiout = NULL, *midiin = NULL; + +static void plat_midi_query() +{ + int status; + int card = -1; + + midi_queried = 1; + + if ((status = snd_card_next(&card)) < 0) + return; + + if (card < 0) + return; /*No cards*/ + + while (card >= 0) + { + char *shortname; + + if ((status = snd_card_get_name(card, &shortname)) >= 0) + { + snd_ctl_t *ctl; + char name[32]; + + sprintf(name, "hw:%i", card); + + if ((status = snd_ctl_open(&ctl, name, 0)) >= 0) + { + int device = -1; + + do + { + status = snd_ctl_rawmidi_next_device(ctl, &device); + if (status >= 0 && device != -1) + { + snd_rawmidi_info_t *info; + int sub_nr, sub; + + snd_rawmidi_info_alloca(&info); + snd_rawmidi_info_set_device(info, device); + snd_rawmidi_info_set_stream(info, SND_RAWMIDI_STREAM_OUTPUT); + snd_ctl_rawmidi_info(ctl, info); + sub_nr = snd_rawmidi_info_get_subdevices_count(info); + //pclog("sub_nr=%i\n",sub_nr); + + for (sub = 0; sub < sub_nr; sub++) + { + snd_rawmidi_info_set_subdevice(info, sub); + + if (snd_ctl_rawmidi_info(ctl, info) == 0) + { + //pclog("%s: MIDI device=%i:%i:%i\n", shortname, card, device,sub); + + midi_devices[midi_device_count].card = card; + midi_devices[midi_device_count].device = device; + midi_devices[midi_device_count].sub = sub; + snprintf(midi_devices[midi_device_count].name, 50, "%s (%i:%i:%i)", shortname, card, device, sub); + midi_device_count++; + if (midi_device_count >= MAX_MIDI_DEVICES) + return; + } + } + } + } while (device >= 0); + } + } + + if (snd_card_next(&card) < 0) + break; + } +} + +void plat_midi_init() +{ + char portname[32]; + int midi_id; + + if (!midi_queried) + plat_midi_query(); + + midi_id = config_get_int(SYSTEM_MIDI_NAME, "midi", 0); + + sprintf(portname, "hw:%i,%i,%i", midi_devices[midi_id].card, + midi_devices[midi_id].device, + midi_devices[midi_id].sub); + //pclog("Opening MIDI port %s\n", portname); + + if (snd_rawmidi_open(NULL, &midiout, portname, SND_RAWMIDI_SYNC) < 0) + { + //pclog("Failed to open MIDI\n"); + return; + } +} + +void plat_midi_close() +{ + if (midiout != NULL) + { + snd_rawmidi_close(midiout); + midiout = NULL; + } +} + +static int midi_pos, midi_len; +static uint8_t midi_command[4]; +static int midi_lengths[8] = {3, 3, 3, 3, 2, 2, 3, 1}; +static int midi_insysex; +static uint8_t midi_sysex_data[65536]; + +void plat_midi_write(uint8_t val) +{ + //pclog("Write MIDI %02x\n", val); + if (!midiout) return; + + if ((val & 0x80) && !(val == 0xf7 && midi_insysex)) + { + midi_pos = 0; + midi_len = midi_lengths[(val >> 4) & 7]; + midi_command[0] = midi_command[1] = midi_command[2] = midi_command[3] = 0; + if (val == 0xf0) + midi_insysex = 1; + } + + if (midi_insysex) + { + midi_sysex_data[midi_pos++] = val; + + if (val == 0xf7 || midi_pos >= 65536) + { +/* pclog("MIDI send sysex %i: ", midi_pos); + for (int i = 0; i < midi_pos; i++) + pclog("%02x ", midi_sysex_data[i]); + pclog("\n");*/ + snd_rawmidi_write(midiout, midi_sysex_data, midi_pos); +// pclog("Sent sysex\n"); + midi_insysex = 0; + } + return; + } + + if (midi_len) + { + if (midi_pos < 3) + { + midi_command[midi_pos] = val; + + midi_pos++; + + if (midi_pos == midi_len) + { +// pclog("MIDI send %i: %02x %02x %02x %02x\n", midi_len, midi_command[0], midi_command[1], midi_command[2], midi_command[3]); + snd_rawmidi_write(midiout, midi_command, midi_len); + } + } + } +} + +void plat_midi_play_sysex(uint8_t *sysex, unsigned int len) +{ + if (midiout) + { + snd_rawmidi_write(midiout, (const void*)sysex, (size_t)len); + } +} + +void plat_midi_play_msg(uint8_t *msg) +{ + plat_midi_write(msg[0]); + if (midi_len > 1) plat_midi_write(msg[1]); + if (midi_len > 2) plat_midi_write(msg[2]); +} + +int plat_midi_get_num_devs() +{ + if (!midi_queried) + plat_midi_query(); + + return midi_device_count; +} + +void plat_midi_get_dev_name(int num, char *s) +{ + strcpy(s, midi_devices[num].name); +} + +static void plat_midi_query_in() +{ + int status; + int card = -1; + + midi_in_queried = 1; + + if ((status = snd_card_next(&card)) < 0) + return; + + if (card < 0) + return; /*No cards*/ + + while (card >= 0) + { + char *shortname; + + if ((status = snd_card_get_name(card, &shortname)) >= 0) + { + snd_ctl_t *ctl; + char name[32]; + + sprintf(name, "hw:%i", card); + + if ((status = snd_ctl_open(&ctl, name, 0)) >= 0) + { + int device = -1; + + do + { + status = snd_ctl_rawmidi_next_device(ctl, &device); + if (status >= 0 && device != -1) + { + snd_rawmidi_info_t *info; + int sub_nr, sub; + + snd_rawmidi_info_alloca(&info); + snd_rawmidi_info_set_device(info, device); + snd_rawmidi_info_set_stream(info, SND_RAWMIDI_STREAM_INPUT); + snd_ctl_rawmidi_info(ctl, info); + sub_nr = snd_rawmidi_info_get_subdevices_count(info); + //pclog("sub_nr=%i\n",sub_nr); + + for (sub = 0; sub < sub_nr; sub++) + { + snd_rawmidi_info_set_subdevice(info, sub); + + if (snd_ctl_rawmidi_info(ctl, info) == 0) + { + //pclog("%s: MIDI device=%i:%i:%i\n", shortname, card, device,sub); + + midi_in_devices[midi_device_count].card = card; + midi_in_devices[midi_device_count].device = device; + midi_in_devices[midi_device_count].sub = sub; + snprintf(midi_in_devices[midi_device_count].name, 50, "%s (%i:%i:%i)", shortname, card, device, sub); + midi_in_device_count++; + if (midi_in_device_count >= MAX_MIDI_DEVICES) + return; + } + } + } + } while (device >= 0); + } + } + + if (snd_card_next(&card) < 0) + break; + } +} +mutex_t* midiinmtx = NULL; + +static void plat_midi_in_thread(void* param) +{ + int sysexpos = 0; + uint8_t midimsg[3]; + while(1) + { + thread_wait_mutex(midiinmtx); + if (midiin == NULL) + { + thread_release_mutex(midiinmtx); + break; + } + if (snd_rawmidi_read(midiin, midimsg, 1) > 0) + { + if (midimsg[0] == 0xF0) + { + MIDI_InSysexBuf[sysexpos++] = 0xF0; + while(1) + { + snd_rawmidi_read(midiin, &MIDI_InSysexBuf[sysexpos++], 1); + if (MIDI_InSysexBuf[sysexpos - 1] == 0xF7) + { + midi_in_sysex(MIDI_InSysexBuf, sysexpos); + } + } + } + else if (midimsg[0] & 0x80) + { + int lengthofmsg = midi_lengths[(midimsg[0] >> 4) & 7] - 1; + snd_rawmidi_read(midiin, midimsg + 1, lengthofmsg); + midi_in_msg(midimsg); + } + } + thread_release_mutex(midiinmtx); + } +} + +void plat_midi_input_init(void) +{ + char portname[32]; + int midi_id; + snd_rawmidi_params_t* params; + int err; + + snd_rawmidi_params_malloc(¶ms); + if (!params) return; + if (!midi_in_queried) + plat_midi_query_in(); + + + midi_id = config_get_int(MIDI_INPUT_NAME, "midi_input", 0); + + sprintf(portname, "hw:%i,%i,%i", midi_in_devices[midi_id].card, + midi_in_devices[midi_id].device, + midi_in_devices[midi_id].sub); + //pclog("Opening MIDI port %s\n", portname); + + if (snd_rawmidi_open(NULL, &midiin, portname, SND_RAWMIDI_NONBLOCK) < 0) + { + //pclog("Failed to open MIDI\n"); + return; + } + midiin = thread_create_mutex(); + thread_create(plat_midi_in_thread, NULL); +} + +void plat_midi_input_close(void) +{ + thread_wait_mutex(midiinmtx); + if (midiin != NULL) + { + snd_rawmidi_close(midiin); + midiin = NULL; + } + thread_release_mutex(midiinmtx); + thread_close_mutex(midiinmtx); + midiinmtx = NULL; +} + +int plat_midi_in_get_num_devs(void) +{ + if (!midi_queried) + plat_midi_query_in(); + + return midi_in_device_count; +} + +void plat_midi_in_get_dev_name(int num, char *s) +{ + strcpy(s, midi_in_devices[num].name); +} From b7c965a019632d6377ed68d822b271ccf772f47e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 00:37:09 +0600 Subject: [PATCH 51/75] Implement ui_msgbox* functions --- src/unix/unix.c | 63 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index f960d68ed..c3294aeb7 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -31,6 +31,7 @@ #include <86box/unix_sdl.h> #include <86box/timer.h> #include <86box/nvr.h> +#include <86box/ui.h> static int first_use = 1; static uint64_t StartingTime; @@ -221,6 +222,26 @@ wchar_t* plat_get_string(int i) return L"Press CTRL-END to release mouse"; case IDS_2079: return L"Press CTRL-END or middle button to release mouse"; + case IDS_2080: + return L"Failed to initialize FluidSynth"; + case IDS_4099: + return L"MFM/RLL or ESDI CD-ROM drives never existed"; + case IDS_2093: + return L"Failed to set up PCap"; + case IDS_2094: + return L"No PCap devices found"; + case IDS_2110: + return L"Unable to initialize FreeType"; + case IDS_2111: + return L"Unable to initialize SDL, libsdl2 is required"; + case IDS_2131: + return L"libfreetype is required for ESC/P printer emulation."; + case IDS_2132: + return L"libgs is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files."; + case IDS_2129: + return L"Make sure libpcap is installed and that you are on a libpcap-compatible network connection."; + case IDS_2114: + return L"Unable to initialize Ghostscript"; } return L""; } @@ -522,14 +543,44 @@ do_stop(void) int ui_msgbox(int flags, void *message) { - fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu\n", flags, (unsigned long long) message); - return 0; + return ui_msgbox_header(flags, message, NULL); } int ui_msgbox_header(int flags, void *message, void* header) { - // Parameters that are passed will crash the program so keep these off for the time being. - fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu, hdrid: %llu\n", flags, (unsigned long long) message, (unsigned long long) header); + int sdlmsgflags; + if (!header) header = L"86Box"; + if (flags & MBX_ERROR) + { + sdlmsgflags = flags & MBX_FATAL ? SDL_MESSAGEBOX_ERROR : SDL_MESSAGEBOX_WARNING; + } + else + { + if (flags & MBX_WARNING) sdlmsgflags = SDL_MESSAGEBOX_WARNING; + else sdlmsgflags = SDL_MESSAGEBOX_INFORMATION; + } + if (message >= (void*)2048 && message <= (void*)7168) + { + if (wcsncasecmp(L"", plat_get_string((int)message), 1) == 0) + { + return 0; + } + char* res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)plat_get_string((int)message), wcslen(plat_get_string((int)message)) * sizeof(wchar_t) + sizeof(wchar_t)); + if (res) + { + SDL_ShowSimpleMessageBox(sdlmsgflags, header, res, NULL); + SDL_free(res); + return 0; + } + } + else if (flags & MBX_ANSI) + { + SDL_ShowSimpleMessageBox(sdlmsgflags, header, (char*)message, NULL); + return 0; + } + + + fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu\n", flags, (unsigned long long) message); return 0; } @@ -553,9 +604,9 @@ plat_power_off(void) cpu_thread_run = 0; } -wchar_t* ui_sb_bugui(wchar_t *str) +void ui_sb_bugui(char *str) { - return str; + } extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); From ddf15234f2a1cb27cb15597f4c07088ca646b959 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 00:45:35 +0600 Subject: [PATCH 52/75] Implement pause command --- src/unix/unix.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index c3294aeb7..4051d5de2 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -647,7 +647,22 @@ char *local_strsep(char **str, const char *sep) return s; } +void +plat_pause(int p) +{ + static wchar_t oldtitle[512]; + wchar_t title[512]; + dopause = p; + if (p) { + wcsncpy(oldtitle, ui_window_title(NULL), sizeof_w(oldtitle) - 1); + wcscpy(title, oldtitle); + wcscat(title, L" - PAUSED -"); + ui_window_title(title); + } else { + ui_window_title(oldtitle); + } +} void monitor_thread(void* param) { @@ -683,6 +698,10 @@ void monitor_thread(void* param) { exit_event = 1; } + else if (strncasecmp(xargv[0], "pause", 5) == 0) + { + plat_pause(dopause ^ 1); + } else if (strncasecmp(xargv[0], "hardreset", 9) == 0) { pc_reset_hard(); From f3288b7470af8e9d7a060562f48d10c8bbe4ead9 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 12:18:14 +0600 Subject: [PATCH 53/75] Implement MO/ZIP/Cartridge loading via monitor --- src/unix/unix.c | 167 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 128 insertions(+), 39 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 4051d5de2..35bb22f3b 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -664,6 +664,51 @@ plat_pause(int p) } } +bool process_media_commands_3(uint8_t* id, char* fn, uint8_t* wp, int cmdargc) +{ + bool err = false; + *id = atoi(xargv[1]); + if (xargv[2][0] == '\'' || xargv[2][0] == '"') + { + int curarg = 2; + for (curarg = 2; curarg < cmdargc; curarg++) + { + if (strlen(fn) + strlen(xargv[curarg]) >= PATH_MAX) + { + err = true; + fprintf(stderr, "Path name too long.\n"); + } + strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + { + if (curarg + 1 < cmdargc) + { + *wp = atoi(xargv[curarg + 1]); + } + break; + } + strcat(fn, " "); + } + } + else + { + if (strlen(xargv[2]) < PATH_MAX) + { + strcpy(fn, xargv[2]); + *wp = atoi(xargv[3]); + } + else + { + fprintf(stderr, "Path name too long.\n"); + err = true; + } + } + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; + return err; +} + void monitor_thread(void* param) { if (isatty(fileno(stdin)) && isatty(fileno(stdout))) @@ -701,6 +746,7 @@ void monitor_thread(void* param) else if (strncasecmp(xargv[0], "pause", 5) == 0) { plat_pause(dopause ^ 1); + printf("%s", dopause ? "Paused.\n" : "Unpaused.\n"); } else if (strncasecmp(xargv[0], "hardreset", 9) == 0) { @@ -711,6 +757,7 @@ void monitor_thread(void* param) uint8_t id; bool err = false; char fn[PATH_MAX]; + if (!xargv[2] || !xargv[1]) { free(line); @@ -761,11 +808,23 @@ void monitor_thread(void* param) } else if (strncasecmp(xargv[0], "fddeject", 8) == 0 && cmdargc >= 3) { - floppy_eject(atof(xargv[2])); + floppy_eject(atoi(xargv[2])); } else if (strncasecmp(xargv[0], "cdeject", 8) == 0 && cmdargc >= 3) { - cdrom_mount(atof(xargv[2]), ""); + cdrom_mount(atoi(xargv[2]), ""); + } + else if (strncasecmp(xargv[0], "moeject", 8) == 0 && cmdargc >= 3) + { + mo_eject(atoi(xargv[2])); + } + else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 3) + { + cartridge_eject(atoi(xargv[2])); + } + else if (strncasecmp(xargv[0], "zipeject", 8) == 0 && cmdargc >= 3) + { + zip_eject(atoi(xargv[2])); } else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { @@ -780,51 +839,81 @@ void monitor_thread(void* param) line = NULL; continue; } - id = atoi(xargv[1]); - if (xargv[2][0] == '\'' || xargv[2][0] == '"') - { - int curarg = 2; - for (curarg = 2; curarg < cmdargc; curarg++) - { - if (strlen(fn) + strlen(xargv[curarg]) >= PATH_MAX) - { - err = true; - fprintf(stderr, "Path name too long.\n"); - } - strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') - { - if (curarg + 1 < cmdargc) - { - wp = atoi(xargv[curarg + 1]); - } - break; - } - strcat(fn, " "); - } - } - else - { - if (strlen(xargv[2]) < PATH_MAX) - { - strcpy(fn, xargv[2]); - wp = atoi(xargv[3]); - } - else - { - fprintf(stderr, "Path name too long.\n"); - } - } + err = process_media_commands_3(&id, fn, &wp, cmdargc); if (!err) { - if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; printf("Inserting disk into floppy drive %c: %s\n", id + 'A', fn); floppy_mount(id, fn, wp); } } + else if (strncasecmp(xargv[0], "moload", 7) == 0 && cmdargc >= 4) + { + uint8_t id, wp; + bool err = false; + char fn[PATH_MAX]; + memset(fn, 0, sizeof(fn)); + if (!xargv[2] || !xargv[1]) + { + free(line); + free(linecpy); + line = NULL; + continue; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) + { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; + printf("Inserting into mo drive %hhu: %s\n", id, fn); + mo_mount(id, fn, wp); + } + } + else if (strncasecmp(xargv[0], "cartload", 7) == 0 && cmdargc >= 4) + { + uint8_t id, wp; + bool err = false; + char fn[PATH_MAX]; + memset(fn, 0, sizeof(fn)); + if (!xargv[2] || !xargv[1]) + { + free(line); + free(linecpy); + line = NULL; + continue; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) + { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; + printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn); + cartridge_mount(id, fn, wp); + } + } + else if (strncasecmp(xargv[0], "zipload", 7) == 0 && cmdargc >= 4) + { + uint8_t id, wp; + bool err = false; + char fn[PATH_MAX]; + memset(fn, 0, sizeof(fn)); + if (!xargv[2] || !xargv[1]) + { + free(line); + free(linecpy); + line = NULL; + continue; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) + { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; + printf("Inserting disk into ZIP drive %c: %s\n", id + 'A', fn); + zip_mount(id, fn, wp); + } + } free(line); free(linecpy); line = NULL; From 237e00f62b3c6a955c19f7fbe3fcf41aaf018571 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 12:18:49 +0600 Subject: [PATCH 54/75] Fix log path printing on non-Windows systems --- src/86box.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index 0a5c59258..eeeb9621d 100644 --- a/src/86box.c +++ b/src/86box.c @@ -560,10 +560,15 @@ usage: strftime(temp, sizeof(temp), "%Y/%m/%d %H:%M:%S", info); pclog("#\n# %ls v%ls logfile, created %s\n#\n", EMU_NAME_W, EMU_VERSION_W, temp); +#ifdef _WIN32 pclog("# Emulator path: %ls\n", exe_path); pclog("# Userfiles path: %ls\n", usr_path); pclog("# Configuration file: %ls\n#\n\n", cfg_path); - +#else + pclog("# Emulator path: %s\n", exe_path); + pclog("# Userfiles path: %s\n", usr_path); + pclog("# Configuration file: %s\n#\n\n", cfg_path); +#endif /* * We are about to read the configuration file, which MAY * put data into global variables (the hard- and floppy From d6db63a7b78966156b3d0b95824d9800aacb36f4 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 13:56:23 +0600 Subject: [PATCH 55/75] Use libedit for monitor when available --- src/unix/unix.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 35bb22f3b..bc5ea3b86 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -708,6 +708,14 @@ bool process_media_commands_3(uint8_t* id, char* fn, uint8_t* wp, int cmdargc) || fn[strlen(fn) - 1] == '"') fn[strlen(fn) - 1] = '\0'; return err; } +char* (*f_readline)(const char*) = NULL; +int (*f_add_history)(const char *) = NULL; + +#ifdef __APPLE__ +#define LIBEDIT_LIBRARY "libedit.dylib" +#else +#define LIBEDIT_LIBRARY "libedit.so" +#endif void monitor_thread(void* param) { @@ -715,12 +723,28 @@ void monitor_thread(void* param) { char* line = NULL; size_t n; + void* libedithandle = dlopen(LIBEDIT_LIBRARY, RTLD_LOCAL | RTLD_LAZY); + if (libedithandle) + { + f_readline = dlsym(libedithandle, "readline"); + f_add_history = dlsym(libedithandle, "add_history"); + if (!f_readline) + { + fprintf(stderr, "readline in libedit not found, line editing will be limited.\n"); + } + } + else fprintf(stderr, "libedit not found, line editing will be limited.\n"); printf("86Box monitor console.\n"); while (!exit_event) { if (feof(stdin)) break; - printf("(86Box) "); - getline(&line, &n, stdin); + if (f_readline) + line = f_readline("(86Box) "); + else + { + printf("(86Box) "); + getline(&line, &n, stdin); + } if (line) { int cmdargc = 0; @@ -733,6 +757,7 @@ void monitor_thread(void* param) line = NULL; continue; } + if (f_add_history) f_add_history(line); memset(xargv, 0, sizeof(xargv)); while(1) { From e025a422dfbcae7c65ff4db8564921e4e386df9d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 14:59:12 +0600 Subject: [PATCH 56/75] Don't leave terminal broken when exiting --- src/unix/unix.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index bc5ea3b86..8a10a6a57 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -149,7 +149,8 @@ static const uint16_t sdl_to_xt[0x200] = [SDL_SCANCODE_KP_3] = 0x51, [SDL_SCANCODE_KP_2] = 0x50, [SDL_SCANCODE_KP_1] = 0x4F, - [SDL_SCANCODE_KP_0] = 0x52 + [SDL_SCANCODE_KP_0] = 0x52, + [SDL_SCANCODE_KP_PERIOD] = 0x53 }; typedef struct sdl_blit_params @@ -710,6 +711,7 @@ bool process_media_commands_3(uint8_t* id, char* fn, uint8_t* wp, int cmdargc) } char* (*f_readline)(const char*) = NULL; int (*f_add_history)(const char *) = NULL; +void (*f_rl_callback_handler_remove)(void) = NULL; #ifdef __APPLE__ #define LIBEDIT_LIBRARY "libedit.dylib" @@ -732,6 +734,7 @@ void monitor_thread(void* param) { fprintf(stderr, "readline in libedit not found, line editing will be limited.\n"); } + f_rl_callback_handler_remove = dlsym(libedithandle, "rl_callback_handler_remove"); } else fprintf(stderr, "libedit not found, line editing will be limited.\n"); printf("86Box monitor console.\n"); @@ -1106,6 +1109,7 @@ int main(int argc, char** argv) printf("\n"); SDL_DestroyMutex(blitmtx); SDL_Quit(); + if (f_rl_callback_handler_remove) f_rl_callback_handler_remove(); return 0; } char* plat_vidapi_name(int i) From 03497b5bbfc96bed078ff999eb09c54177c87f38 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 23:06:07 +0600 Subject: [PATCH 57/75] Fix libedit crashes Set priorty of main_thread to High --- src/unix/unix.c | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 8a10a6a57..dd058901d 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -464,6 +464,7 @@ main_thread(void *param) uint32_t old_time, new_time; int drawits, frames; + SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH); framecountx = 0; //title_update = 1; old_time = SDL_GetTicks(); @@ -725,18 +726,6 @@ void monitor_thread(void* param) { char* line = NULL; size_t n; - void* libedithandle = dlopen(LIBEDIT_LIBRARY, RTLD_LOCAL | RTLD_LAZY); - if (libedithandle) - { - f_readline = dlsym(libedithandle, "readline"); - f_add_history = dlsym(libedithandle, "add_history"); - if (!f_readline) - { - fprintf(stderr, "readline in libedit not found, line editing will be limited.\n"); - } - f_rl_callback_handler_remove = dlsym(libedithandle, "rl_callback_handler_remove"); - } - else fprintf(stderr, "libedit not found, line editing will be limited.\n"); printf("86Box monitor console.\n"); while (!exit_event) { @@ -834,25 +823,25 @@ void monitor_thread(void* param) cdrom_mount(id, fn); } } - else if (strncasecmp(xargv[0], "fddeject", 8) == 0 && cmdargc >= 3) + else if (strncasecmp(xargv[0], "fddeject", 8) == 0 && cmdargc >= 2) { - floppy_eject(atoi(xargv[2])); + floppy_eject(atoi(xargv[1])); } - else if (strncasecmp(xargv[0], "cdeject", 8) == 0 && cmdargc >= 3) + else if (strncasecmp(xargv[0], "cdeject", 8) == 0 && cmdargc >= 2) { - cdrom_mount(atoi(xargv[2]), ""); + cdrom_mount(atoi(xargv[1]), ""); } - else if (strncasecmp(xargv[0], "moeject", 8) == 0 && cmdargc >= 3) + else if (strncasecmp(xargv[0], "moeject", 8) == 0 && cmdargc >= 2) { - mo_eject(atoi(xargv[2])); + mo_eject(atoi(xargv[1])); } - else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 3) + else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) { - cartridge_eject(atoi(xargv[2])); + cartridge_eject(atoi(xargv[1])); } - else if (strncasecmp(xargv[0], "zipeject", 8) == 0 && cmdargc >= 3) + else if (strncasecmp(xargv[0], "zipeject", 8) == 0 && cmdargc >= 2) { - zip_eject(atoi(xargv[2])); + zip_eject(atoi(xargv[1])); } else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { @@ -953,6 +942,7 @@ SDL_threadID eventthread; int main(int argc, char** argv) { SDL_Event event; + void* libedithandle; SDL_Init(0); pc_init(argc, argv); @@ -969,6 +959,18 @@ int main(int argc, char** argv) fprintf(stderr, "Failed to create blit mutex: %s", SDL_GetError()); return -1; } + libedithandle = dlopen(LIBEDIT_LIBRARY, RTLD_LOCAL | RTLD_LAZY); + if (libedithandle) + { + f_readline = dlsym(libedithandle, "readline"); + f_add_history = dlsym(libedithandle, "add_history"); + if (!f_readline) + { + fprintf(stderr, "readline in libedit not found, line editing will be limited.\n"); + } + f_rl_callback_handler_remove = dlsym(libedithandle, "rl_callback_handler_remove"); + } + else fprintf(stderr, "libedit not found, line editing will be limited.\n"); mousemutex = SDL_CreateMutex(); sdl_initho(); From 529b04381db02a271692e0897b4234a0e0c7e991 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 23:17:25 +0600 Subject: [PATCH 58/75] Fix ALSA MIDI input --- src/unix/linux_midi_alsa.c | 52 +++----------------------------------- 1 file changed, 4 insertions(+), 48 deletions(-) diff --git a/src/unix/linux_midi_alsa.c b/src/unix/linux_midi_alsa.c index 53050ff5c..2b771f81c 100644 --- a/src/unix/linux_midi_alsa.c +++ b/src/unix/linux_midi_alsa.c @@ -3,6 +3,7 @@ #include <86box/config.h> #include <86box/midi.h> #include <86box/plat.h> +#include <86box/plat_midi.h> #define MAX_MIDI_DEVICES 128 @@ -127,52 +128,9 @@ static int midi_lengths[8] = {3, 3, 3, 3, 2, 2, 3, 1}; static int midi_insysex; static uint8_t midi_sysex_data[65536]; -void plat_midi_write(uint8_t val) +int plat_midi_write(uint8_t val) { - //pclog("Write MIDI %02x\n", val); - if (!midiout) return; - - if ((val & 0x80) && !(val == 0xf7 && midi_insysex)) - { - midi_pos = 0; - midi_len = midi_lengths[(val >> 4) & 7]; - midi_command[0] = midi_command[1] = midi_command[2] = midi_command[3] = 0; - if (val == 0xf0) - midi_insysex = 1; - } - - if (midi_insysex) - { - midi_sysex_data[midi_pos++] = val; - - if (val == 0xf7 || midi_pos >= 65536) - { -/* pclog("MIDI send sysex %i: ", midi_pos); - for (int i = 0; i < midi_pos; i++) - pclog("%02x ", midi_sysex_data[i]); - pclog("\n");*/ - snd_rawmidi_write(midiout, midi_sysex_data, midi_pos); -// pclog("Sent sysex\n"); - midi_insysex = 0; - } - return; - } - - if (midi_len) - { - if (midi_pos < 3) - { - midi_command[midi_pos] = val; - - midi_pos++; - - if (midi_pos == midi_len) - { -// pclog("MIDI send %i: %02x %02x %02x %02x\n", midi_len, midi_command[0], midi_command[1], midi_command[2], midi_command[3]); - snd_rawmidi_write(midiout, midi_command, midi_len); - } - } - } + return 0; } void plat_midi_play_sysex(uint8_t *sysex, unsigned int len) @@ -185,9 +143,7 @@ void plat_midi_play_sysex(uint8_t *sysex, unsigned int len) void plat_midi_play_msg(uint8_t *msg) { - plat_midi_write(msg[0]); - if (midi_len > 1) plat_midi_write(msg[1]); - if (midi_len > 2) plat_midi_write(msg[2]); + plat_midi_play_sysex(msg, midi_lengths[(msg[0] >> 4) & 7]); } int plat_midi_get_num_devs() From 1b122ae7897c2be042a346544776643222bad098 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 28 Aug 2021 23:37:28 +0600 Subject: [PATCH 59/75] Fix buggy mouse wheel behaviour --- src/unix/unix.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index dd058901d..debea4497 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1009,6 +1009,7 @@ int main(int argc, char** argv) mousedata.deltaz = event.wheel.y; SDL_UnlockMutex(mousemutex); } + break; } case SDL_MOUSEMOTION: { From 2256a41704c552401178657324b742035fc51dac Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 29 Aug 2021 00:34:03 +0600 Subject: [PATCH 60/75] Keep polling for events until there isn't any --- src/unix/unix.c | 162 ++++++++++++++++++++++++------------------------ 1 file changed, 82 insertions(+), 80 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index debea4497..50981129a 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -990,100 +990,102 @@ int main(int argc, char** argv) while (!is_quit) { static int onesec_tic = 0; - if (SDL_PollEvent(&event)) - switch(event.type) - { - case SDL_QUIT: - exit_event = 1; - break; - case SDL_MOUSEWHEEL: + while (SDL_PollEvent(&event)) + { + switch(event.type) { - if (mouse_capture || video_fullscreen) + case SDL_QUIT: + exit_event = 1; + break; + case SDL_MOUSEWHEEL: { - if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) + if (mouse_capture || video_fullscreen) { - event.wheel.x *= -1; - event.wheel.y *= -1; + if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) + { + event.wheel.x *= -1; + event.wheel.y *= -1; + } + SDL_LockMutex(mousemutex); + mousedata.deltaz = event.wheel.y; + SDL_UnlockMutex(mousemutex); } - SDL_LockMutex(mousemutex); - mousedata.deltaz = event.wheel.y; - SDL_UnlockMutex(mousemutex); - } - break; - } - case SDL_MOUSEMOTION: - { - if (mouse_capture || video_fullscreen) - { - SDL_LockMutex(mousemutex); - mousedata.deltax += event.motion.xrel; - mousedata.deltay += event.motion.yrel; - SDL_UnlockMutex(mousemutex); - } - break; - } - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - { - if ((event.button.button == SDL_BUTTON_LEFT) - && !(mouse_capture || video_fullscreen) - && event.button.state == SDL_RELEASED - && event.button.x <= real_sdl_w && event.button.y <= real_sdl_h) - { - plat_mouse_capture(1); break; } - if (mouse_get_buttons() < 3 && event.button.button == SDL_BUTTON_MIDDLE && !video_fullscreen) + case SDL_MOUSEMOTION: { - plat_mouse_capture(0); + if (mouse_capture || video_fullscreen) + { + SDL_LockMutex(mousemutex); + mousedata.deltax += event.motion.xrel; + mousedata.deltay += event.motion.yrel; + SDL_UnlockMutex(mousemutex); + } break; } - if (mouse_capture || video_fullscreen) + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: { - int buttonmask = 0; - - switch(event.button.button) + if ((event.button.button == SDL_BUTTON_LEFT) + && !(mouse_capture || video_fullscreen) + && event.button.state == SDL_RELEASED + && event.button.x <= real_sdl_w && event.button.y <= real_sdl_h) { - case SDL_BUTTON_LEFT: - buttonmask = 1; - break; - case SDL_BUTTON_RIGHT: - buttonmask = 2; - break; - case SDL_BUTTON_MIDDLE: - buttonmask = 4; - break; - } - SDL_LockMutex(mousemutex); - if (event.button.state == SDL_PRESSED) - { - mousedata.mousebuttons |= buttonmask; - } - else mousedata.mousebuttons &= ~buttonmask; - SDL_UnlockMutex(mousemutex); - } - break; - } - case SDL_RENDER_DEVICE_RESET: - case SDL_RENDER_TARGETS_RESET: - { - extern void sdl_reinit_texture(); - sdl_reinit_texture(); - break; - } - case SDL_KEYDOWN: - case SDL_KEYUP: - { - uint16_t xtkey = 0; - switch(event.key.keysym.scancode) - { - default: - xtkey = sdl_to_xt[event.key.keysym.scancode]; + plat_mouse_capture(1); break; + } + if (mouse_get_buttons() < 3 && event.button.button == SDL_BUTTON_MIDDLE && !video_fullscreen) + { + plat_mouse_capture(0); + break; + } + if (mouse_capture || video_fullscreen) + { + int buttonmask = 0; + + switch(event.button.button) + { + case SDL_BUTTON_LEFT: + buttonmask = 1; + break; + case SDL_BUTTON_RIGHT: + buttonmask = 2; + break; + case SDL_BUTTON_MIDDLE: + buttonmask = 4; + break; + } + SDL_LockMutex(mousemutex); + if (event.button.state == SDL_PRESSED) + { + mousedata.mousebuttons |= buttonmask; + } + else mousedata.mousebuttons &= ~buttonmask; + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_RENDER_DEVICE_RESET: + case SDL_RENDER_TARGETS_RESET: + { + extern void sdl_reinit_texture(); + sdl_reinit_texture(); + break; + } + case SDL_KEYDOWN: + case SDL_KEYUP: + { + uint16_t xtkey = 0; + switch(event.key.keysym.scancode) + { + default: + xtkey = sdl_to_xt[event.key.keysym.scancode]; + break; + } + keyboard_input(event.key.state == SDL_PRESSED, xtkey); } - keyboard_input(event.key.state == SDL_PRESSED, xtkey); } - } + } if (mouse_capture && keyboard_ismsexit()) { plat_mouse_capture(0); From 995611bf91fcf7fd2ca8af82c0862a90e5757570 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 29 Aug 2021 00:53:18 +0600 Subject: [PATCH 61/75] Mimic per-second timer approach of PCem SDL2 --- src/unix/unix.c | 50 +++++++++++++----------------------------- src/unix/unix_thread.c | 1 - 2 files changed, 15 insertions(+), 36 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 50981129a..91b85177e 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include <86box/86box.h> #include <86box/keyboard.h> @@ -550,39 +551,17 @@ int ui_msgbox(int flags, void *message) int ui_msgbox_header(int flags, void *message, void* header) { - int sdlmsgflags; if (!header) header = L"86Box"; - if (flags & MBX_ERROR) + if (flags & MBX_ANSI) { - sdlmsgflags = flags & MBX_FATAL ? SDL_MESSAGEBOX_ERROR : SDL_MESSAGEBOX_WARNING; - } - else - { - if (flags & MBX_WARNING) sdlmsgflags = SDL_MESSAGEBOX_WARNING; - else sdlmsgflags = SDL_MESSAGEBOX_INFORMATION; - } - if (message >= (void*)2048 && message <= (void*)7168) - { - if (wcsncasecmp(L"", plat_get_string((int)message), 1) == 0) - { - return 0; - } - char* res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)plat_get_string((int)message), wcslen(plat_get_string((int)message)) * sizeof(wchar_t) + sizeof(wchar_t)); - if (res) - { - SDL_ShowSimpleMessageBox(sdlmsgflags, header, res, NULL); - SDL_free(res); - return 0; - } - } - else if (flags & MBX_ANSI) - { - SDL_ShowSimpleMessageBox(sdlmsgflags, header, (char*)message, NULL); + fwprintf(stderr, L"%s\n", header); + fprintf(stderr, "==========================\n" + "%s\n", message); return 0; } - - - fprintf(stderr, "Got msgbox request. Flags: 0x%X, msgid: %llu\n", flags, (unsigned long long) message); + fwprintf(stderr, L"%s\n", header); + fwprintf(stderr, L"==========================\n" + L"%s\n", plat_get_string(message)); return 0; } @@ -719,6 +698,11 @@ void (*f_rl_callback_handler_remove)(void) = NULL; #else #define LIBEDIT_LIBRARY "libedit.so" #endif +uint32_t timer_onesec(uint32_t interval, void* param) +{ + pc_onesec(); + return interval; +} void monitor_thread(void* param) { @@ -987,9 +971,9 @@ int main(int argc, char** argv) do_start(); thread_create(monitor_thread, NULL); + SDL_AddTimer(1000, timer_onesec, NULL); while (!is_quit) { - static int onesec_tic = 0; while (SDL_PollEvent(&event)) { switch(event.type) @@ -1090,11 +1074,6 @@ int main(int argc, char** argv) { plat_mouse_capture(0); } - if (SDL_GetTicks() - onesec_tic >= 1000) - { - onesec_tic = SDL_GetTicks(); - pc_onesec(); - } if (blitreq) { extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); @@ -1113,6 +1092,7 @@ int main(int argc, char** argv) } printf("\n"); SDL_DestroyMutex(blitmtx); + SDL_DestroyMutex(mousemutex); SDL_Quit(); if (f_rl_callback_handler_remove) f_rl_callback_handler_remove(); return 0; diff --git a/src/unix/unix_thread.c b/src/unix/unix_thread.c index cdcc7cae1..071178418 100644 --- a/src/unix/unix_thread.c +++ b/src/unix/unix_thread.c @@ -139,7 +139,6 @@ mutex_t *thread_create_mutex(void) pthread_mutex_init(&mutex->mutex, NULL); return mutex; - } mutex_t * From c5f563c76bf003137b5c7722106db822d7eee913 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 29 Aug 2021 15:41:06 +0600 Subject: [PATCH 62/75] Fix freezes on exit for real --- src/unix/unix.c | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 91b85177e..6fd91f46c 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -49,6 +49,9 @@ plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; joystick_t joystick_state[MAX_JOYSTICKS]; int joysticks_present; SDL_mutex *blitmtx; +SDL_threadID eventthread; +static int exit_event = 0; +static int fullscreen_pending = 0; static const uint16_t sdl_to_xt[0x200] = { @@ -525,7 +528,11 @@ do_start(void) void do_stop(void) { - + if (SDL_ThreadID() != eventthread) + { + exit_event = 1; + return; + } if (blitreq) { blitreq = 0; @@ -533,10 +540,18 @@ do_stop(void) video_blit_complete(); } - is_quit = 1; + while(SDL_TryLockMutex(blitmtx) == SDL_MUTEX_TIMEDOUT) + { + if (blitreq) + { + blitreq = 0; + extern void video_blit_complete(); + video_blit_complete(); + } + } + startblit(); - //startblit(); - + is_quit = 1; sdl_close(); pc_close(thMain); @@ -612,7 +627,6 @@ void mouse_poll() extern int real_sdl_w, real_sdl_h; -static int exit_event = 0; void ui_sb_set_ready(int ready) {} char* xargv[512]; @@ -744,6 +758,11 @@ void monitor_thread(void* param) { exit_event = 1; } + else if (strncasecmp(xargv[0], "fullscreen", 1) == 0) + { + video_fullscreen = 1; + fullscreen_pending = 1; + } else if (strncasecmp(xargv[0], "pause", 5) == 0) { plat_pause(dopause ^ 1); @@ -922,7 +941,7 @@ void monitor_thread(void* param) } } } -SDL_threadID eventthread; + int main(int argc, char** argv) { SDL_Event event; @@ -959,8 +978,10 @@ int main(int argc, char** argv) sdl_initho(); if (start_in_fullscreen) - sdl_set_fs(1); - + { + video_fullscreen = 1; + sdl_set_fs(1); + } /* Fire up the machine. */ pc_reset_hard_init(); @@ -1084,6 +1105,16 @@ int main(int argc, char** argv) extern void ui_window_title_real(); ui_window_title_real(); } + if (video_fullscreen && keyboard_isfsexit()) + { + sdl_set_fs(0); + video_fullscreen = 0; + } + if (fullscreen_pending) + { + sdl_set_fs(video_fullscreen); + fullscreen_pending = 0; + } if (exit_event) { do_stop(); From a56fa559e134b018f2c9fc6ae7525e5a183b1d5a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 29 Aug 2021 23:45:11 +0600 Subject: [PATCH 63/75] Fix SDL2 fullscreen and make it borderless --- src/unix/unix_sdl.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index c78755fd6..db3b6e591 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -149,7 +149,8 @@ sdl_blit(int x, int y, int y1, int y2, int w, int h) if (resize_pending) { - sdl_resize(resize_w, resize_h); + if (video_fullscreen) SDL_RenderSetLogicalSize(sdl_render, resize_w, resize_h); + else sdl_resize(resize_w, resize_h); resize_pending = 0; } r_src.x = 0; @@ -262,7 +263,6 @@ sdl_reinit_texture() sdl_destroy_texture(); - SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); if (sdl_flags & RENDERER_HARDWARE) { sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); @@ -277,9 +277,7 @@ void sdl_set_fs(int fs) { SDL_LockMutex(sdl_mutex); - sdl_enabled = 0; - sdl_destroy_texture(); - SDL_SetWindowFullscreen(sdl_win, fs ? SDL_WINDOW_FULLSCREEN : 0); + SDL_SetWindowFullscreen(sdl_win, fs ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); SDL_SetRelativeMouseMode((SDL_bool)mouse_capture); sdl_fs = fs; @@ -290,7 +288,6 @@ sdl_set_fs(int fs) sdl_flags &= ~RENDERER_FULL_SCREEN; sdl_reinit_texture(); - sdl_enabled = 1; SDL_UnlockMutex(sdl_mutex); } @@ -370,7 +367,7 @@ sdl_init_common(int flags) sdl_mutex = SDL_CreateMutex(); sdl_win = SDL_CreateWindow("86Box", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, scrnsz_x, scrnsz_y, SDL_WINDOW_OPENGL); - sdl_set_fs(video_fullscreen & 1); + sdl_set_fs(video_fullscreen); if (!(video_fullscreen & 1)) { if (vid_resize & 2) @@ -477,4 +474,4 @@ wchar_t* ui_window_title(wchar_t* str) title_set = 1; #endif return str; -} \ No newline at end of file +} From 7fe4c63cb38e10f0dcfe2ee378299efcb4417660 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 30 Aug 2021 00:00:27 +0600 Subject: [PATCH 64/75] Enable static linking only on Windows --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a13564310..1ba30edb4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -70,7 +70,7 @@ if(ARCH STREQUAL "i386") endif() endif() -if(NOT MSVC) +if(NOT MSVC AND NOT UNIX AND NOT APPLE) target_link_options(86Box PRIVATE "-static") endif() From 70833a6e6947c6821c28a84f7c04268585abc19e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 30 Aug 2021 00:41:40 +0600 Subject: [PATCH 65/75] Disable monitor interface if CLI text-mode is enabled --- src/unix/unix.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index 6fd91f46c..0121d451f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -720,6 +720,7 @@ uint32_t timer_onesec(uint32_t interval, void* param) void monitor_thread(void* param) { +#ifndef USE_CLI if (isatty(fileno(stdin)) && isatty(fileno(stdout))) { char* line = NULL; @@ -940,6 +941,7 @@ void monitor_thread(void* param) } } } +#endif } int main(int argc, char** argv) @@ -991,7 +993,9 @@ int main(int argc, char** argv) /* Initialize the rendering window, or fullscreen. */ do_start(); +#ifndef USE_CLI thread_create(monitor_thread, NULL); +#endif SDL_AddTimer(1000, timer_onesec, NULL); while (!is_quit) { From fba5ef3e1bec2257a0b0daab9c7427791fc29217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 1 Sep 2021 15:37:32 +0200 Subject: [PATCH 66/75] cmake: strip release builds --- .github/workflows/cmake.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 7ff2216da..294442bf4 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -37,10 +37,13 @@ jobs: build: - name: Regular preset: regular + target: install/strip - name: Debug preset: debug + target: install - name: Dev preset: experimental + target: install environment: - msystem: MINGW32 prefix: mingw-w64-i686 @@ -74,7 +77,7 @@ jobs: -D CMAKE_INSTALL_PREFIX=./build/artifacts -D VNC=OFF - name: Build - run: cmake --build build --target install + run: cmake --build build --target ${{ matrix.build.target }} - uses: actions/upload-artifact@v2 with: name: '86Box-${{ matrix.build.name }}-MSYS2-${{ matrix.environment.msystem }}-${{ github.sha }}' From 320c867ea3a7b1e44f5756cd4b57d12f0cf3c305 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 2 Sep 2021 14:36:35 +0200 Subject: [PATCH 67/75] Fix T128 timer initialization on reads for faster cpu's. --- src/scsi/scsi_ncr5380.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index d22b5fbf5..c48af0ae5 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -692,7 +692,7 @@ ncr_write(uint16_t port, uint8_t val, void *priv) ncr_dev->t128.host_pos = MIN(512, dev->buffer_length); ncr_dev->t128.status |= 0x04; - timer_on_auto(&ncr_dev->timer, 0.2); + timer_on_auto(&ncr_dev->timer, 0.02); } else { if ((ncr->mode & MODE_DMA) && !timer_is_enabled(&ncr_dev->timer)) { memset(ncr_dev->buffer, 0, MIN(128, dev->buffer_length)); From 87abf37e2f796ec6f5866c365d806cadc11f3bf8 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 2 Sep 2021 15:21:20 +0200 Subject: [PATCH 68/75] Added Short Vector accel command to the TGUI cards and some cleanups and fixes. --- src/video/vid_tgui9440.c | 425 +++++++++++++++++++++++++-------------- 1 file changed, 275 insertions(+), 150 deletions(-) diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 90872027f..b961fbf78 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -115,6 +115,7 @@ typedef struct tgui_t int16_t dst_x, dst_y; int16_t dst_y_clip, dst_x_clip; int16_t size_x, size_y; + uint16_t sv_size_y; uint16_t patloc; uint32_t fg_col, bg_col; uint32_t style, ckey; @@ -131,7 +132,7 @@ typedef struct tgui_t int pat_x, pat_y; int use_src; - int src_pitch, dst_pitch, bpp; + int pitch, bpp; uint32_t fill_pattern[8*8]; uint32_t mono_pattern[8*8]; uint32_t pattern_8[8*8]; @@ -144,8 +145,9 @@ typedef struct tgui_t uint8_t tgui_3d8, tgui_3d9; int oldmode; - uint8_t oldctrl1; - uint8_t oldctrl2,newctrl2; + uint8_t oldctrl1, newctrl1; + uint8_t oldctrl2, newctrl2; + uint8_t oldgr0e, newgr0e; uint32_t linear_base, linear_size, ge_base, mmio_base; @@ -292,23 +294,21 @@ tgui_out(uint16_t addr, uint8_t val, void *p) { tgui_t *tgui = (tgui_t *)p; svga_t *svga = &tgui->svga; - uint8_t old, mask; - - mask = (tgui->type >= TGUI_9660) ? 0x3f : 0x1f; + uint8_t old; if (((addr&0xFFF0) == 0x3D0 || (addr&0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; switch (addr) { case 0x3C5: - switch (svga->seqaddr & 0xf) + switch (svga->seqaddr) { case 0xB: - tgui->oldmode=1; + tgui->oldmode = 1; break; case 0xC: - if (svga->seqregs[0xe] & 0x80) - svga->seqregs[0xc] = val; + if (svga->seqregs[0x0e] & 0x80) + svga->seqregs[0x0c] = val; break; case 0xd: if (tgui->oldmode) @@ -320,12 +320,13 @@ tgui_out(uint16_t addr, uint8_t val, void *p) if (tgui->oldmode) { tgui->oldctrl1 = val; tgui_update_irqs(tgui); - } else { - svga->seqregs[0xe] = (val ^ 2); - svga->write_bank = (svga->seqregs[0xe] & 0xf) * 65536; - if (!(svga->gdcreg[0xf] & 1)) - svga->read_bank = svga->write_bank; + svga->write_bank = (tgui->oldctrl1) * 65536; + } else { + svga->seqregs[0xe] = val ^ 2; + svga->write_bank = (svga->seqregs[0xe]) * 65536; } + if (!(svga->gdcreg[0xf] & 1)) + svga->read_bank = svga->write_bank; return; } break; @@ -340,16 +341,16 @@ tgui_out(uint16_t addr, uint8_t val, void *p) { tgui->ramdac_state = 0; tgui->ramdac_ctrl = val; - switch (tgui->ramdac_ctrl & 0xf0) + switch ((tgui->ramdac_ctrl >> 4) & 0x0f) { - case 0x10: + case 1: svga->bpp = 15; break; - case 0x30: + case 3: svga->bpp = 16; break; - case 0xd0: - svga->bpp = ((svga->crtc[0x38] & 0x08) == 0x08 && (tgui->type == TGUI_9440)) ? 24 : 32; + case 0x0d: + svga->bpp = (tgui->type >= TGUI_9660) ? 32 : 24; break; default: svga->bpp = 8; @@ -366,7 +367,7 @@ tgui_out(uint16_t addr, uint8_t val, void *p) tkd8001_ramdac_out(addr, val, svga->ramdac, svga); return; } - tgui->ramdac_state = 0; + tgui->ramdac_state = 0; break; case 0x3CF: @@ -383,26 +384,45 @@ tgui_out(uint16_t addr, uint8_t val, void *p) tgui_recalcmapping(tgui); return; } - switch (svga->gdcaddr & 15) + switch (svga->gdcaddr) { - case 0x6: - if (svga->gdcreg[6] != val) - { - svga->gdcreg[6] = val; - tgui_recalcmapping(tgui); - } - return; + case 0x6: + if (svga->gdcreg[6] != val) + { + svga->gdcreg[6] = val; + tgui_recalcmapping(tgui); + } + return; - case 0xE: + case 0x0e: svga->gdcreg[0xe] = val ^ 2; if ((svga->gdcreg[0xf] & 1) == 1) - svga->read_bank = (svga->gdcreg[0xe] & 0xf) * 65536; + svga->read_bank = (svga->gdcreg[0xe]) * 65536; break; - case 0xF: - if (val & 1) svga->read_bank = (svga->gdcreg[0xe] & 0xf) *65536; - else svga->read_bank = (svga->seqregs[0xe] & 0xf) *65536; - svga->write_bank = (svga->seqregs[0xe] & 0xf) * 65536; + case 0x0f: + if (val & 1) + svga->read_bank = (svga->gdcreg[0xe]) * 65536; + else { + if (tgui->oldmode) + svga->read_bank = (tgui->oldctrl1) * 65536; + else + svga->read_bank = (svga->seqregs[0xe]) * 65536; + } + + if (tgui->oldmode) + svga->write_bank = (tgui->oldctrl1) * 65536; + else + svga->write_bank = (svga->seqregs[0xe]) * 65536; break; + + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + svga->gdcreg[svga->gdcaddr] = val; + break; } break; case 0x3D4: @@ -430,7 +450,7 @@ tgui_out(uint16_t addr, uint8_t val, void *p) } } switch (svga->crtcreg) { - case 0x1e: + case 0x1e: svga->vram_display_mask = (val & 0x80) ? tgui->vram_mask : 0x3ffff; break; @@ -441,6 +461,7 @@ tgui_out(uint16_t addr, uint8_t val, void *p) tgui->linear_size = (val & 0x10) ? 0x200000 : 0x100000; svga->decode_mask = (val & 0x10) ? 0x1fffff : 0xfffff; } + pclog("Linear base = %08x, size = %08x, mask = %08x\n", tgui->linear_base, tgui->linear_size, svga->decode_mask); tgui_recalcmapping(tgui); } break; @@ -457,11 +478,6 @@ tgui_out(uint16_t addr, uint8_t val, void *p) case 0x39: tgui_recalcmapping(tgui); break; - - case 0x37: - if (tgui->type >= TGUI_9660) - i2c_gpio_set(tgui->i2c, !!(val & 0x02), (val & 0x01)); - break; case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: @@ -486,19 +502,20 @@ tgui_out(uint16_t addr, uint8_t val, void *p) } return; - case 0x3D8: - tgui->tgui_3d8 = val; - if (svga->gdcreg[0xf] & 4) { - svga->write_bank = (val & mask) * 65536; - if (!(svga->gdcreg[0xf] & 1)) - svga->read_bank = (val & mask) * 65536; - } - return; + case 0x3D8: + tgui->tgui_3d8 = val; + if (svga->gdcreg[0xf] & 4) { + svga->write_bank = (val & 0x3f) * 65536; + if (!(svga->gdcreg[0xf] & 1)) { + svga->read_bank = (val & 0x3f) * 65536; + } + } + return; case 0x3D9: - tgui->tgui_3d9 = val; - if ((svga->gdcreg[0xf] & 5) == 5) - svga->read_bank = (val & mask) * 65536; - return; + tgui->tgui_3d9 = val; + if ((svga->gdcreg[0xf] & 5) == 5) + svga->read_bank = (val & 0x3f) * 65536; + return; case 0x43c8: tgui->clock_n = val & 0x7f; @@ -524,11 +541,11 @@ tgui_in(uint16_t addr, void *p) switch (addr) { case 0x3C5: - if ((svga->seqaddr & 0xf) == 9) { + if (svga->seqaddr == 9) { if (tgui->type == TGUI_9680) return 0x01; /*TGUI9680XGi*/ } - if ((svga->seqaddr & 0xf) == 0xb) + if (svga->seqaddr == 0x0b) { tgui->oldmode = 0; switch (tgui->type) @@ -542,16 +559,22 @@ tgui_in(uint16_t addr, void *p) return 0xd3; /*TGUI9660XGi*/ } } - if ((svga->seqaddr & 0xf) == 0xd) + if (svga->seqaddr == 0x0d) { if (tgui->oldmode) return tgui->oldctrl2; return tgui->newctrl2; } - if ((svga->seqaddr & 0xf) == 0xe) + if (svga->seqaddr == 0x0c) + { + if (svga->seqregs[0x0e] & 0x80) + return svga->seqregs[0x0c]; + } + if (svga->seqaddr == 0x0e) { if (tgui->oldmode) - return tgui->oldctrl1; + return tgui->oldctrl1 | 0x88; + return svga->seqregs[0x0e]; } break; @@ -572,19 +595,13 @@ tgui_in(uint16_t addr, void *p) case 0x3CF: if (tgui->type == TGUI_9400CXI && svga->gdcaddr >= 16 && svga->gdcaddr < 32) return tgui->ext_gdc_regs[svga->gdcaddr & 15]; - break; + if (svga->gdcaddr >= 0x5a && svga->gdcaddr <= 0x5f) + return svga->gdcreg[svga->gdcaddr]; + break; case 0x3D4: return svga->crtcreg; case 0x3D5: temp = svga->crtc[svga->crtcreg]; - if (svga->crtcreg == 0x37) { - if (tgui->type >= TGUI_9660) { - if ((svga->crtc[0x37] & 0x02) && i2c_gpio_get_scl(tgui->i2c)) - temp |= 0x02; - if ((svga->crtc[0x37] & 0x01) && i2c_gpio_get_sda(tgui->i2c)) - temp |= 0x01; - } - } return temp; case 0x3d8: return tgui->tgui_3d8; @@ -611,14 +628,17 @@ void tgui_recalctimings(svga_t *svga) svga->rowoffset <<= 1; } - if ((svga->crtc[0x1e] & 0xa0) == 0xa0) + + + if ((svga->crtc[0x1e] & 0xA0) == 0xA0) svga->ma_latch |= 0x10000; - if (svga->crtc[0x27] & 0x01) + if ((svga->crtc[0x27] & 0x01) == 0x01) svga->ma_latch |= 0x20000; - if (svga->crtc[0x27] & 0x02) + if ((svga->crtc[0x27] & 0x02) == 0x02) svga->ma_latch |= 0x40000; - if (svga->crtc[0x27] & 0x04) + if ((svga->crtc[0x27] & 0x04) == 0x04) svga->ma_latch |= 0x80000; + if (svga->crtc[0x27] & 0x08) svga->split |= 0x400; if (svga->crtc[0x27] & 0x10) @@ -635,7 +655,7 @@ void tgui_recalctimings(svga_t *svga) svga->lowres = 0; } - if (((tgui->oldctrl2 & 0x10) && (svga->crtc[0x1e] & 0x20) && (tgui->oldctrl1 & 1)) || (svga->crtc[0x2a] & 0x40)) /*According to vgadoc*/ + if ((tgui->oldctrl2 & 0x10) || (svga->crtc[0x2a] & 0x40)) svga->ma_latch <<= 1; svga->lowres = !(svga->crtc[0x2a] & 0x40); @@ -711,6 +731,11 @@ void tgui_recalctimings(svga_t *svga) break; case 32: svga->render = svga_render_32bpp_highres; + if (tgui->type >= TGUI_9660) { + if (svga->hdisp == 1024) { + svga->rowoffset <<= 1; + } + } break; } } @@ -888,7 +913,7 @@ uint8_t tgui_pci_read(int func, int addr, void *p) case 0x02: return (tgui->type == TGUI_9440) ? 0x40 : 0x60; /*TGUI9440AGi or TGUI9660XGi*/ case 0x03: return (tgui->type == TGUI_9440) ? 0x94 : 0x96; - case PCI_REG_COMMAND: return tgui->pci_regs[PCI_REG_COMMAND] & 0x23; /*Respond to IO and memory accesses*/ + case PCI_REG_COMMAND: return tgui->pci_regs[PCI_REG_COMMAND]; /*Respond to IO and memory accesses*/ case 0x07: return 1 << 1; /*Medium DEVSEL timing*/ @@ -942,7 +967,6 @@ void tgui_pci_write(int func, int addr, uint8_t val, void *p) tgui->linear_base = (tgui->linear_base & 0xff000000) | ((val & 0xe0) << 16); tgui->linear_size = tgui->vram_size; svga->decode_mask = tgui->vram_mask; - svga->crtc[0x21] = (svga->crtc[0x21] & ~0xf) | (val >> 4); tgui_recalcmapping(tgui); break; case 0x13: @@ -952,7 +976,6 @@ void tgui_pci_write(int func, int addr, uint8_t val, void *p) tgui->linear_base = (tgui->linear_base & 0xe00000) | (val << 24); tgui->linear_size = tgui->vram_size; svga->decode_mask = tgui->vram_mask; - svga->crtc[0x21] = (svga->crtc[0x21] & ~0xc0) | (val >> 6); tgui_recalcmapping(tgui); break; @@ -1204,7 +1227,8 @@ enum { TGUI_BITBLT = 1, TGUI_SCANLINE = 3, - TGUI_BRESENHAMLINE = 4 + TGUI_BRESENHAMLINE = 4, + TGUI_SHORTVECTOR = 5 }; enum @@ -1333,62 +1357,88 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) } /*Other than mode stuff, this bit is undocumented*/ + pclog("TGUI ger22 = %04x, cmd = %i, hdisp = %i, svga = %i, bpp = %i\n", tgui->accel.ger22, tgui->accel.command, svga->hdisp, svga->bpp, tgui->accel.bpp); switch (tgui->accel.ger22 & 0xff) { + case 0: + switch (tgui->accel.ger22 >> 8) { + case 0x41: + tgui->accel.pitch = 640; + break; + } + break; + case 4: - tgui->accel.src_pitch = 1024; - tgui->accel.dst_pitch = 1024; - if (svga->hdisp == 800) { - if ((tgui->accel.ger22 >> 8) > 0) { - tgui->accel.src_pitch = 832; - tgui->accel.dst_pitch = 832; - } - } - break; - - case 8: - tgui->accel.src_pitch = 2048; - tgui->accel.dst_pitch = 2048; - if (tgui->type >= TGUI_9660) { - tgui->accel.src_pitch = 1280; - tgui->accel.dst_pitch = 1280; - } - break; - - case 9: - tgui->accel.src_pitch = 1024; - tgui->accel.dst_pitch = 1024; - if (tgui->type >= TGUI_9660) { - tgui->accel.src_pitch = svga->hdisp; - tgui->accel.dst_pitch = svga->hdisp; - if (svga->hdisp == 800) { - tgui->accel.src_pitch = 832; - tgui->accel.dst_pitch = 832; - } - } - break; - - case 14: - tgui->accel.src_pitch = svga->hdisp; - tgui->accel.dst_pitch = svga->hdisp; - switch (tgui->svga.bpp) { - case 32: - if (svga->hdisp == 800) { - tgui->accel.src_pitch = 832; - tgui->accel.dst_pitch = 832; + switch (tgui->accel.ger22 >> 8) { + case 0: + tgui->accel.pitch = 1024; + break; + case 0x40: + tgui->accel.pitch = 640; + break; + case 0x50: + tgui->accel.pitch = 832; + break; + } + break; + case 8: + switch (tgui->accel.ger22 >> 8) { + case 0: + tgui->accel.pitch = 2048; + break; + case 0x60: + tgui->accel.pitch = 1280; + break; + } + break; + case 9: + switch (tgui->accel.ger22 >> 8) { + case 0: + tgui->accel.pitch = svga->hdisp; + if (tgui->type == TGUI_9440) + tgui->accel.pitch = 1024; + break; + case 0x40: + tgui->accel.pitch = 640; + break; + case 0x50: + tgui->accel.pitch = 832; + break; + } + break; + case 13: + switch (tgui->accel.ger22 >> 8) { + case 0x60: + tgui->accel.pitch = 2048; + if (tgui->type >= TGUI_9660) { + if (svga->hdisp == 1280) + tgui->accel.pitch = svga->hdisp; + } + break; + } + break; + case 14: + switch (tgui->accel.ger22 >> 8) { + case 0: + tgui->accel.pitch = 1024; + break; + case 0x40: + tgui->accel.pitch = 640; + break; + case 0x50: + tgui->accel.pitch = 832; + break; } break; - } - break; } switch (tgui->accel.command) { case TGUI_BITBLT: if (count == -1) { - tgui->accel.src_old = tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.src_pitch); + tgui->accel.src_old = tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.pitch); tgui->accel.src = tgui->accel.src_old; - tgui->accel.dst_old = tgui->accel.dst_x + (tgui->accel.dst_y * tgui->accel.dst_pitch); + tgui->accel.dst_old = tgui->accel.dst_x + (tgui->accel.dst_y * tgui->accel.pitch); tgui->accel.dst = tgui->accel.dst_old; tgui->accel.pat_x = tgui->accel.dst_x; @@ -1473,8 +1523,8 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) tgui->accel.dy += ydir; } - tgui->accel.src_old += (ydir * tgui->accel.src_pitch); - tgui->accel.dst_old += (ydir * tgui->accel.dst_pitch); + tgui->accel.src_old += (ydir * tgui->accel.pitch); + tgui->accel.dst_old += (ydir * tgui->accel.pitch); tgui->accel.src = tgui->accel.src_old; tgui->accel.dst = tgui->accel.dst_old; @@ -1535,8 +1585,8 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) tgui->accel.pat_x = tgui->accel.dst_x; tgui->accel.pat_y += ydir; - tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.src_pitch); - tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.dst_pitch); + tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.pitch); + tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.pitch); tgui->accel.y++; @@ -1582,8 +1632,8 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) tgui->accel.pat_x = tgui->accel.dst_x; tgui->accel.pat_y += ydir; - tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.src_pitch); - tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.dst_pitch); + tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.pitch); + tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.pitch); if (tgui->accel.y > tgui->accel.size_y) return; @@ -1596,10 +1646,10 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) case TGUI_SCANLINE: { if (count == -1) { - tgui->accel.src_old = tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.src_pitch); + tgui->accel.src_old = tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.pitch); tgui->accel.src = tgui->accel.src_old; - tgui->accel.dst_old = tgui->accel.dst_x + (tgui->accel.dst_y * tgui->accel.dst_pitch); + tgui->accel.dst_old = tgui->accel.dst_x + (tgui->accel.dst_y * tgui->accel.pitch); tgui->accel.dst = tgui->accel.dst_old; tgui->accel.pat_x = tgui->accel.dst_x; @@ -1633,8 +1683,8 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) tgui->accel.x = 0; tgui->accel.pat_x = tgui->accel.dst_x; - tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.src_pitch); - tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.dst_pitch); + tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.pitch); + tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.pitch); tgui->accel.pat_y += ydir; return; } @@ -1691,13 +1741,13 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) } while (count--) { - READ(tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.src_pitch), src_dat); + READ(tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.pitch), src_dat); /*Note by TC1995: I suppose the x/y clipping max is always more than 0 in the TGUI 96xx, but the TGUI 9440 lacks clipping*/ if (steep) { if ((tgui->type == TGUI_9440) || ((tgui->type >= TGUI_9660) && dx >= tgui->accel.left && dx <= tgui->accel.right && dy >= tgui->accel.top && dy <= tgui->accel.bottom)) { - READ(dx + (dy * tgui->accel.dst_pitch), dst_dat); + READ(dx + (dy * tgui->accel.pitch), dst_dat); pat_dat = tgui->accel.fg_col; @@ -1708,12 +1758,12 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) MIX(); - WRITE(dx + (dy * tgui->accel.dst_pitch), out); + WRITE(dx + (dy * tgui->accel.pitch), out); } } else { if ((tgui->type == TGUI_9440) || ((tgui->type >= TGUI_9660) && dy >= tgui->accel.left && dy <= tgui->accel.right && - dx >= tgui->accel.top && dx <= tgui->accel.bottom)) { - READ(dy + (dx * tgui->accel.dst_pitch), dst_dat); + dx >= tgui->accel.top && dx <= tgui->accel.bottom)) { + READ(dy + (dx * tgui->accel.pitch), dst_dat); pat_dat = tgui->accel.fg_col; @@ -1724,7 +1774,7 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) MIX(); - WRITE(dy + (dx * tgui->accel.dst_pitch), out); + WRITE(dy + (dx * tgui->accel.pitch), out); } } @@ -1742,13 +1792,92 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) } } break; + + case TGUI_SHORTVECTOR: + { + int16_t dx, dy; + + dx = tgui->accel.dst_x & 0xfff; + dy = tgui->accel.dst_y & 0xfff; + + tgui->accel.left = tgui->accel.src_x_clip & 0xfff; + tgui->accel.right = tgui->accel.dst_x_clip & 0xfff; + tgui->accel.top = tgui->accel.src_y_clip & 0xfff; + tgui->accel.bottom = tgui->accel.dst_y_clip & 0xfff; + + if (tgui->accel.bpp == 1) { + tgui->accel.left >>= 1; + tgui->accel.right >>= 1; + } else if (tgui->accel.bpp == 3) { + tgui->accel.left >>= 2; + tgui->accel.right >>= 2; + } + + while (count--) { + READ(tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.pitch), src_dat); + + /*Note by TC1995: I suppose the x/y clipping max is always more than 0 in the TGUI 96xx, but the TGUI 9440 lacks clipping*/ + if ((tgui->type == TGUI_9440) || ((tgui->type >= TGUI_9660) && dx >= tgui->accel.left && dx <= tgui->accel.right && + dy >= tgui->accel.top && dy <= tgui->accel.bottom)) { + READ(dx + (dy * tgui->accel.pitch), dst_dat); + + pat_dat = tgui->accel.fg_col; + + if (tgui->accel.bpp == 0) + pat_dat &= 0xff; + else if (tgui->accel.bpp == 1) + pat_dat &= 0xffff; + + MIX(); + + WRITE(dx + (dy * tgui->accel.pitch), out); + } + + if (tgui->accel.y == (tgui->accel.sv_size_y & 0xfff)) + break; + + switch ((tgui->accel.sv_size_y >> 8) & 0xe0) { + case 0x00: + dx++; + break; + case 0x20: + dx++; + dy--; + break; + case 0x40: + dy--; + break; + case 0x60: + dx--; + dy--; + break; + case 0x80: + dx--; + break; + case 0xa0: + dx--; + dy++; + break; + case 0xc0: + dy++; + break; + case 0xe0: + dx++; + dy++; + break; + } + + tgui->accel.y++; + } + } + break; } } static void tgui_accel_out(uint16_t addr, uint8_t val, void *p) { - tgui_t *tgui = (tgui_t *)p; + tgui_t *tgui = (tgui_t *)p; switch (addr) { @@ -1764,6 +1893,7 @@ tgui_accel_out(uint16_t addr, uint8_t val, void *p) tgui->accel.bpp = 1; break; + case 13: case 14: switch (tgui->svga.bpp) { case 15: @@ -1885,9 +2015,11 @@ tgui_accel_out(uint16_t addr, uint8_t val, void *p) break; case 0x2142: /*Size Y*/ tgui->accel.size_y = (tgui->accel.size_y & 0xff00) | val; + tgui->accel.sv_size_y = (tgui->accel.sv_size_y & 0xff00) | val; break; case 0x2143: /*Size Y*/ tgui->accel.size_y = (tgui->accel.size_y & 0xff) | (val << 8); + tgui->accel.sv_size_y = (tgui->accel.sv_size_y & 0xff) | (val << 8); break; case 0x2144: /*Style*/ @@ -2186,8 +2318,8 @@ tgui_accel_in_l(uint16_t addr, void *p) static void tgui_accel_write(uint32_t addr, uint8_t val, void *p) { - tgui_t *tgui = (tgui_t *)p; - svga_t *svga = &tgui->svga; + tgui_t *tgui = (tgui_t *)p; + svga_t *svga = &tgui->svga; if ((svga->crtc[0x36] & 0x03) == 0x02) { if ((addr & ~0xff) != 0xbff00) @@ -2211,6 +2343,7 @@ tgui_accel_write(uint32_t addr, uint8_t val, void *p) tgui->accel.bpp = 1; break; + case 13: case 14: switch (tgui->svga.bpp) { case 15: @@ -2332,9 +2465,11 @@ tgui_accel_write(uint32_t addr, uint8_t val, void *p) break; case 0x42: /*Size Y*/ tgui->accel.size_y = (tgui->accel.size_y & 0xff00) | val; + tgui->accel.sv_size_y = (tgui->accel.sv_size_y & 0xff00) | val; break; case 0x43: /*Size Y*/ tgui->accel.size_y = (tgui->accel.size_y & 0xff) | (val << 8); + tgui->accel.sv_size_y = (tgui->accel.sv_size_y & 0xff) | (val << 8); break; case 0x44: /*Style*/ @@ -2858,7 +2993,7 @@ static void *tgui_init(const device_t *info) if (tgui->pci && (tgui->type >= TGUI_9440)) tgui->card = pci_add_card(PCI_ADD_VIDEO, tgui_pci_read, tgui_pci_write, tgui); - tgui->pci_regs[PCI_REG_COMMAND] = 3; + tgui->pci_regs[PCI_REG_COMMAND] = 7; tgui->pci_regs[0x30] = 0x00; tgui->pci_regs[0x32] = 0x0c; @@ -2866,11 +3001,6 @@ static void *tgui_init(const device_t *info) if (tgui->type >= TGUI_9440) svga->packed_chain4 = 1; - - if (tgui->type >= TGUI_9660) { - tgui->i2c = i2c_gpio_init("ddc_tgui"); - tgui->ddc = ddc_init(i2c_gpio_get_bus(tgui->i2c)); - } return tgui; } @@ -2896,11 +3026,6 @@ void tgui_close(void *p) svga_close(&tgui->svga); - if (tgui->type >= TGUI_9660) { - ddc_close(tgui->ddc); - i2c_gpio_close(tgui->i2c); - } - free(tgui); } From 586066d891669e9534e2eab7418a4b66276ee8bb Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 2 Sep 2021 15:24:17 +0200 Subject: [PATCH 69/75] Made NMI's always auto-clear, will revert if it makes things worse. --- src/cpu/386.c | 4 ++++ src/cpu/386_dynarec.c | 4 ++++ src/cpu/808x.c | 3 +++ 3 files changed, 11 insertions(+) diff --git a/src/cpu/386.c b/src/cpu/386.c index 743989e47..86327e5de 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -195,10 +195,14 @@ exec386(int cycs) cpu_state.oldpc = cpu_state.pc; x86_int(2); nmi_enable = 0; +#ifdef OLD_NMI_BEHAVIOR if (nmi_auto_clear) { nmi_auto_clear = 0; nmi = 0; } +#else + nmi = 0; +#endif } else if ((cpu_state.flags & I_FLAG) && pic.int_pending && !cpu_end_block_after_ins) { vector = picinterrupt(); if (vector != -1) { diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index a15e7a291..d396d122a 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -797,10 +797,14 @@ exec386_dynarec(int cycs) cpu_state.oldpc = cpu_state.pc; x86_int(2); nmi_enable = 0; +#ifdef OLD_NMI_BEHAVIOR if (nmi_auto_clear) { nmi_auto_clear = 0; nmi = 0; } +#else + nmi = 0; +#endif } else if ((cpu_state.flags & I_FLAG) && pic.int_pending) { vector = picinterrupt(); if (vector != -1) { diff --git a/src/cpu/808x.c b/src/cpu/808x.c index 329ebe25f..3fbcfb0ed 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -968,6 +968,9 @@ check_interrupts(void) if (nmi && nmi_enable && nmi_mask) { nmi_enable = 0; interrupt(2); +#ifndef OLD_NMI_BEHAVIOR + nmi = 0; +#endif return; } if ((cpu_state.flags & I_FLAG) && pic.int_pending && !noint) { From 448aec5d405d70c19ab69ef4656e4cc758130715 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 2 Sep 2021 15:33:17 +0200 Subject: [PATCH 70/75] SDL now makes sure the mutex is not NULL before attempting to lock it. --- src/win/win_sdl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index bebad43dd..8a748fb2b 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -288,7 +288,8 @@ sdl_destroy_texture(void) void sdl_close(void) { - SDL_LockMutex(sdl_mutex); + if (sdl_mutex != NULL) + SDL_LockMutex(sdl_mutex); /* Unregister our renderer! */ video_setblit(NULL); From 6c26a99841bb1c30fb8b382e85ae78cd6aa71017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 2 Sep 2021 15:33:51 +0200 Subject: [PATCH 71/75] cmake: full static linking on mingw builds --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 41 +++++++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e6552571..68b9e760e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ include(CPack) include(CMakeDependentOption) add_compile_definitions(CMAKE) -add_compile_definitions("$<$:DEBUG>") +add_compile_definitions("$<$:DEBUG>") if(WIN32) # Disables *_s function warnings diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1ba30edb4..f997ae439 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,22 +47,7 @@ endif() target_link_libraries(86Box cpu chipset mch dev mem fdd game cdrom zip mo hdd net print scsi sio snd vid voodoo plat ui) -find_package(Freetype REQUIRED) -include_directories(${FREETYPE_INCLUDE_DIRS}) - -find_package(OpenAL REQUIRED) -include_directories(${OPENAL_INCLUDE_DIR}) -target_link_libraries(86Box ${OPENAL_LIBRARY}) - -find_package(SDL2 CONFIG REQUIRED) -include_directories(${SDL2_INCLUDE_DIRS}) -target_link_libraries(86Box SDL2::SDL2) - -find_package(PNG REQUIRED) -include_directories(${PNG_INCLUDE_DIRS}) -target_link_libraries(86Box PNG::PNG) - -if(ARCH STREQUAL "i386") +if(WIN32 AND ARCH STREQUAL "i386") if(MSVC) target_link_options(86Box PRIVATE "/LARGEADDRESSAWARE") else() @@ -70,10 +55,30 @@ if(ARCH STREQUAL "i386") endif() endif() -if(NOT MSVC AND NOT UNIX AND NOT APPLE) +if(MINGW) target_link_options(86Box PRIVATE "-static") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".dll.a") endif() +find_package(Freetype REQUIRED) +include_directories(${FREETYPE_INCLUDE_DIRS}) + +find_package(OpenAL REQUIRED) +include_directories(${OPENAL_INCLUDE_DIR}) +target_link_libraries(86Box ${OPENAL_LIBRARY}) + +find_package(SDL2 REQUIRED) +include_directories(${SDL2_INCLUDE_DIRS}) +if(MINGW) + target_link_libraries(86Box SDL2::SDL2-static) +else() + target_link_libraries(86Box SDL2::SDL2) +endif() + +find_package(PNG REQUIRED) +include_directories(${PNG_INCLUDE_DIRS}) +target_link_libraries(86Box PNG::PNG) + configure_file(include/86box/version.h.in include/86box/version.h @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) @@ -123,7 +128,7 @@ add_subdirectory(sio) add_subdirectory(scsi) add_subdirectory(sound) add_subdirectory(video) -if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") +if (WIN32) add_subdirectory(win) else() add_subdirectory(unix) From 296df745ed80c07e6f9bc6b14149a019f5f9231a Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 2 Sep 2021 16:04:58 +0200 Subject: [PATCH 72/75] S3 & TVP3026: Part 1. Initial implementation of the tvp3026 ramdac, (clock still missing, will be added later). --- src/video/CMakeLists.txt | 2 +- src/video/vid_tvp3026_ramdac.c | 472 +++++++++++++++++++++++++++++++++ src/win/Makefile.mingw | 3 +- 3 files changed, 475 insertions(+), 2 deletions(-) create mode 100644 src/video/vid_tvp3026_ramdac.c diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 78be96495..4cbc18535 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -24,7 +24,7 @@ add_library(vid OBJECT video.c vid_table.c vid_cga.c vid_cga_comp.c vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c vid_rtg310x.c vid_ti_cf62011.c vid_tvga.c vid_tgui9440.c vid_tkd8001_ramdac.c vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c vid_ibm_rgb528_ramdac.c - vid_sdac_ramdac.c vid_ogc.c vid_nga.c) + vid_sdac_ramdac.c vid_ogc.c vid_nga.c vid_tvp3026_ramdac.c) if(MGA) target_compile_definitions(vid PRIVATE USE_MGA) diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c new file mode 100644 index 000000000..926921946 --- /dev/null +++ b/src/video/vid_tvp3026_ramdac.c @@ -0,0 +1,472 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Emulation of the Texas Instruments TVP3026 true colour RAMDAC + * family. + * + * + * TODO: Clock and other parts. + * + * Authors: TheCollector1995, + * + * Copyright 2021 TheCollector1995. + */ +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/mem.h> +#include <86box/timer.h> +#include <86box/video.h> +#include <86box/vid_svga.h> + + +typedef struct +{ + PALETTE extpal; + uint32_t extpallook[256]; + uint8_t cursor64_data[1024]; + int hwc_y, hwc_x; + uint8_t ind_idx; + uint8_t dcc, dc_init; + uint8_t ccr; + uint8_t true_color; + uint8_t latch_cntl; + uint8_t mcr; + uint8_t ppr; + uint8_t general_cntl; + uint8_t mclk; + uint8_t misc; + uint8_t type; + uint8_t mode; +} tvp3026_ramdac_t; + +static void +tvp3026_set_bpp(tvp3026_ramdac_t *ramdac, svga_t *svga) +{ + if ((ramdac->true_color & 0x80) == 0x80) { + if (ramdac->mcr & 0x08) + svga->bpp = 8; + else + svga->bpp = 4; + } else { + switch (ramdac->true_color & 0x0f) { + case 0x01: + case 0x03: + case 0x05: + svga->bpp = 16; + break; + case 0x04: + svga->bpp = 15; + break; + case 0x06: + case 0x07: + if (ramdac->true_color & 0x10) + svga->bpp = 24; + else + svga->bpp = 32; + break; + case 0x0e: + case 0x0f: + svga->bpp = 24; + break; + } + } + svga_recalctimings(svga); +} + + +void +tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t *svga) +{ + tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) p; + uint32_t o32; + uint8_t *cd; + uint16_t index; + uint8_t rs = (addr & 0x03); + uint16_t da_mask = 0x03ff; + rs |= (!!rs2 << 2); + rs |= (!!rs3 << 3); + + + switch (rs) { + case 0x00: /* Palette Write Index Register (RS value = 0000) */ + ramdac->ind_idx = val; + case 0x04: /* Ext Palette Write Index Register (RS value = 0100) */ + case 0x03: + case 0x07: /* Ext Palette Read Index Register (RS value = 0111) */ + svga->dac_pos = 0; + svga->dac_status = addr & 0x03; + svga->dac_addr = val; + if (svga->dac_status) + svga->dac_addr = (svga->dac_addr + 1) & da_mask; + break; + case 0x01: /* Palette Data Register (RS value = 0001) */ + case 0x02: /* Pixel Read Mask Register (RS value = 0010) */ + svga_out(addr, val, svga); + break; + case 0x05: /* Ext Palette Data Register (RS value = 0101) */ + svga->dac_status = 0; + svga->fullchange = changeframecount; + switch (svga->dac_pos) { + case 0: + svga->dac_r = val; + svga->dac_pos++; + break; + case 1: + svga->dac_g = val; + svga->dac_pos++; + break; + case 2: + index = svga->dac_addr & 3; + ramdac->extpal[index].r = svga->dac_r; + ramdac->extpal[index].g = svga->dac_g; + ramdac->extpal[index].b = val; + if (svga->ramdac_type == RAMDAC_8BIT) + ramdac->extpallook[index] = makecol32(ramdac->extpal[index].r, ramdac->extpal[index].g, ramdac->extpal[index].b); + else + ramdac->extpallook[index] = makecol32(video_6to8[ramdac->extpal[index].r & 0x3f], video_6to8[ramdac->extpal[index].g & 0x3f], video_6to8[ramdac->extpal[index].b & 0x3f]); + + if (svga->ext_overscan && !index) { + o32 = svga->overscan_color; + svga->overscan_color = ramdac->extpallook[0]; + if (o32 != svga->overscan_color) + svga_recalctimings(svga); + } + svga->dac_addr = (svga->dac_addr + 1) & 0xff; + svga->dac_pos = 0; + break; + } + break; + case 0x09: /* Direct Cursor Control (RS value = 1001) */ + ramdac->dcc = val; + if (ramdac->ccr & 0x80) { + svga->dac_hwcursor.xsize = svga->dac_hwcursor.ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.ysize; + svga->dac_hwcursor.ena = ((val & 0x03) != 0); + ramdac->mode = val & 0x03; + } + break; + case 0x0a: /* Indexed Data (RS value = 1010) */ + switch (ramdac->ind_idx) { + case 0x06: /* Indirect Cursor Control */ + ramdac->ccr = val; + svga->dac_hwcursor.xsize = svga->dac_hwcursor.ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.ysize; + svga->dac_hwcursor.ena = ((val & 0x03) != 0); + ramdac->mode = val & 0x03; + break; + case 0x0f: /* Latch Control */ + ramdac->latch_cntl = val; + break; + case 0x18: /* True Color Control */ + ramdac->true_color = val; + tvp3026_set_bpp(ramdac, svga); + break; + case 0x19: /* Multiplex Control */ + ramdac->mcr = val; + tvp3026_set_bpp(ramdac, svga); + break; + case 0x1c: /* Palette-Page Register */ + ramdac->ppr = val; + break; + case 0x1d: /* General Control Register */ + ramdac->general_cntl = val; + break; + case 0x1e: /* Miscellaneous Control */ + ramdac->misc = val; + svga->ramdac_type = (val & 0x08) ? RAMDAC_8BIT : RAMDAC_6BIT; + break; + case 0x39: /* MCLK/Loop Clock Control */ + ramdac->mclk = val; + break; + + } + break; + case 0x0b: /* Cursor RAM Data Register (RS value = 1011) */ + index = svga->dac_addr & da_mask; + cd = (uint8_t *) ramdac->cursor64_data; + cd[index] = val; + svga->dac_addr = (svga->dac_addr + 1) & da_mask; + break; + case 0x0c: /* Cursor X Low Register (RS value = 1100) */ + ramdac->hwc_x = (ramdac->hwc_x & 0x0f00) | val; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.xsize; + break; + case 0x0d: /* Cursor X High Register (RS value = 1101) */ + ramdac->hwc_x = (ramdac->hwc_x & 0x00ff) | ((val & 0x0f) << 8); + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.xsize; + break; + case 0x0e: /* Cursor Y Low Register (RS value = 1110) */ + ramdac->hwc_y = (ramdac->hwc_y & 0x0f00) | val; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.ysize; + break; + case 0x0f: /* Cursor Y High Register (RS value = 1111) */ + ramdac->hwc_y = (ramdac->hwc_y & 0x00ff) | ((val & 0x0f) << 8); + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.ysize; + break; + } + + return; +} + + +uint8_t +tvp3026_ramdac_in(uint16_t addr, int rs2, int rs3, void *p, svga_t *svga) +{ + tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) p; + uint8_t temp = 0xff; + uint8_t *cd; + uint16_t index; + uint8_t rs = (addr & 0x03); + uint16_t da_mask = 0x03ff; + rs |= (!!rs2 << 2); + rs |= (!!rs3 << 3); + + switch (rs) { + case 0x00: /* Palette Write Index Register (RS value = 0000) */ + case 0x01: /* Palette Data Register (RS value = 0001) */ + case 0x02: /* Pixel Read Mask Register (RS value = 0010) */ + case 0x04: /* Ext Palette Write Index Register (RS value = 0100) */ + temp = svga_in(addr, svga); + break; + case 0x03: /* Palette Read Index Register (RS value = 0011) */ + case 0x07: /* Ext Palette Read Index Register (RS value = 0111) */ + temp = svga->dac_addr & 0xff; + break; + case 0x05: /* Ext Palette Data Register (RS value = 0101) */ + index = (svga->dac_addr - 1) & 3; + svga->dac_status = 3; + switch (svga->dac_pos) { + case 0: + svga->dac_pos++; + if (svga->ramdac_type == RAMDAC_8BIT) + temp = ramdac->extpal[index].r; + else + temp = ramdac->extpal[index].r & 0x3f; + break; + case 1: + svga->dac_pos++; + if (svga->ramdac_type == RAMDAC_8BIT) + temp = ramdac->extpal[index].g; + else + temp = ramdac->extpal[index].g & 0x3f; + break; + case 2: + svga->dac_pos=0; + svga->dac_addr = svga->dac_addr + 1; + if (svga->ramdac_type == RAMDAC_8BIT) + temp = ramdac->extpal[index].b; + else + temp = ramdac->extpal[index].b & 0x3f; + break; + } + break; + case 0x09: /* Direct Cursor Control (RS value = 1001) */ + temp = ramdac->dcc; + break; + case 0x0a: /* Indexed Data (RS value = 1010) */ + switch (ramdac->ind_idx) { + case 0x01: /* Silicon Revision */ + temp = 0x00; + break; + case 0x06: /* Indirect Cursor Control */ + temp = ramdac->ccr; + break; + case 0x0f: /* Latch Control */ + temp = ramdac->latch_cntl; + break; + case 0x18: /* True Color Control */ + temp = ramdac->true_color; + break; + case 0x19: /* Multiplex Control */ + temp = ramdac->mcr; + break; + case 0x1c: /* Palette-Page Register */ + temp = ramdac->ppr; + break; + case 0x1d: /* General Control Register */ + temp = ramdac->general_cntl; + break; + case 0x1e: /* Miscellaneous Control */ + temp = ramdac->misc; + break; + case 0x39: /* MCLK/Loop Clock Control */ + temp = ramdac->mclk; + break; + case 0x3f: /* ID */ + temp = 0x26; + break; + } + break; + case 0x0b: /* Cursor RAM Data Register (RS value = 1011) */ + index = (svga->dac_addr - 1) & da_mask; + cd = (uint8_t *) ramdac->cursor64_data; + temp = cd[index]; + + svga->dac_addr = (svga->dac_addr + 1) & da_mask; + break; + case 0x0c: /* Cursor X Low Register (RS value = 1100) */ + temp = ramdac->hwc_x & 0xff; + break; + case 0x0d: /* Cursor X High Register (RS value = 1101) */ + temp = (ramdac->hwc_x >> 8) & 0xff; + break; + case 0x0e: /* Cursor Y Low Register (RS value = 1110) */ + temp = ramdac->hwc_y & 0xff; + break; + case 0x0f: /* Cursor Y High Register (RS value = 1111) */ + temp = (ramdac->hwc_y >> 8) & 0xff; + break; + } + + return temp; +} + +void +tvp3026_recalctimings(void *p, svga_t *svga) +{ + tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) p; + + svga->interlace = (ramdac->ccr & 0x40); +} + + +void +tvp3026_hwcursor_draw(svga_t *svga, int displine) +{ + int x, xx, comb, b0, b1; + uint16_t dat[2]; + int offset = svga->dac_hwcursor_latch.x + svga->dac_hwcursor_latch.xoff; + int pitch, bppl, mode, x_pos, y_pos; + uint32_t clr1, clr2, clr3, *p; + uint8_t *cd; + tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) svga->ramdac; + + clr1 = ramdac->extpallook[1]; + clr2 = ramdac->extpallook[2]; + clr3 = ramdac->extpallook[3]; + + /* The planes come in two parts, and each plane is 1bpp, + so a 32x32 cursor has 4 bytes per line, and a 64x64 + cursor has 8 bytes per line. */ + pitch = (svga->dac_hwcursor_latch.xsize >> 3); /* Bytes per line. */ + /* A 32x32 cursor has 128 bytes per line, and a 64x64 + cursor has 512 bytes per line. */ + bppl = (pitch * svga->dac_hwcursor_latch.ysize); /* Bytes per plane. */ + mode = ramdac->mode; + + if (svga->interlace && svga->dac_hwcursor_oddeven) + svga->dac_hwcursor_latch.addr += pitch; + + cd = (uint8_t *) ramdac->cursor64_data; + + for (x = 0; x < svga->dac_hwcursor_latch.xsize; x += 16) { + dat[0] = (cd[svga->dac_hwcursor_latch.addr] << 8) | + cd[svga->dac_hwcursor_latch.addr + 1]; + dat[1] = (cd[svga->dac_hwcursor_latch.addr + bppl] << 8) | + cd[svga->dac_hwcursor_latch.addr + bppl + 1]; + + for (xx = 0; xx < 16; xx++) { + b0 = (dat[0] >> (15 - xx)) & 1; + b1 = (dat[1] >> (15 - xx)) & 1; + comb = (b0 | (b1 << 1)); + + y_pos = displine; + x_pos = offset + svga->x_add; + p = buffer32->line[y_pos]; + + if (offset >= svga->dac_hwcursor_latch.x) { + switch (mode) { + case 1: /* Three Color */ + switch (comb) { + case 1: + p[x_pos] = clr1; + break; + case 2: + p[x_pos] = clr2; + break; + case 3: + p[x_pos] = clr3; + break; + } + break; + case 2: /* XGA */ + switch (comb) { + case 0: + p[x_pos] = clr1; + break; + case 1: + p[x_pos] = clr2; + break; + case 3: + p[x_pos] ^= 0xffffff; + break; + } + break; + case 3: /* X-Windows */ + switch (comb) { + case 2: + p[x_pos] = clr1; + break; + case 3: + p[x_pos] = clr2; + break; + } + break; + } + } + offset++; + } + svga->dac_hwcursor_latch.addr += 2; + } + + if (svga->interlace && !svga->dac_hwcursor_oddeven) + svga->dac_hwcursor_latch.addr += pitch; +} + + +void * +tvp3026_ramdac_init(const device_t *info) +{ + tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) malloc(sizeof(tvp3026_ramdac_t)); + memset(ramdac, 0, sizeof(tvp3026_ramdac_t)); + + ramdac->type = info->local; + + ramdac->latch_cntl = 0x06; + ramdac->true_color = 0x80; + ramdac->mcr = 0x98; + ramdac->mclk = 0x18; + + return ramdac; +} + + +static void +tvp3026_ramdac_close(void *priv) +{ + tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) priv; + + if (ramdac) + free(ramdac); +} + + +const device_t tvp3026_ramdac_device = +{ + "TI TVP3026 RAMDAC", + 0, 0, + tvp3026_ramdac_init, tvp3026_ramdac_close, + NULL, { NULL }, NULL, NULL +}; diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 5fe5790b0..02e3f7ac1 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -779,7 +779,8 @@ VIDOBJ := video.o \ vid_s3.o vid_s3_virge.o \ vid_ibm_rgb528_ramdac.o vid_sdac_ramdac.o \ vid_ogc.o \ - vid_nga.o + vid_nga.o \ + vid_tvp3026_ramdac.o VOODOOOBJ := vid_voodoo.o vid_voodoo_banshee.o \ vid_voodoo_banshee_blitter.o \ From 603bf1fdfd5c4474f1e338a1e48df3f21a9a48c8 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 2 Sep 2021 23:08:24 +0600 Subject: [PATCH 73/75] Port close fix to unix_sdl.c --- src/unix/unix_sdl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index db3b6e591..e5abdcd32 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -198,7 +198,8 @@ sdl_destroy_texture(void) void sdl_close(void) { - SDL_LockMutex(sdl_mutex); + if (sdl_mutex != NULL) + SDL_LockMutex(sdl_mutex); /* Unregister our renderer! */ video_setblit(NULL); From aa58c637f5e7dcb88bc43cbbcebe306e0570f4b0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 2 Sep 2021 23:59:14 +0600 Subject: [PATCH 74/75] Default to "build" binary directory for presets --- CMakePresets.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 8fc5f21a1..843727936 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -19,7 +19,8 @@ "CMAKE_C_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=last -flto", "CMAKE_CXX_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=last -flto" }, - "hidden": true + "hidden": true, + "binaryDir": "build" }, { "name": "regular", @@ -70,4 +71,4 @@ } } ] -} \ No newline at end of file +} From 84f4b8cac7ddbc51e02adbefb55371b46b57a095 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 2 Sep 2021 20:15:46 +0200 Subject: [PATCH 75/75] Added a bunch of parameters (including one to specify custom ROM path), fixed a warnings, removed excess commented out code from video/vid_voodoo.c, and made Makefile.mingw quiet again. --- src/86box.c | 100 +++++++++++++++++++++++++++++++------- src/config.c | 4 +- src/include/86box/86box.h | 1 + src/mem/rom.c | 29 ++++++++++- src/video/vid_voodoo.c | 16 ------ src/win/Makefile.mingw | 2 +- 6 files changed, 114 insertions(+), 38 deletions(-) diff --git a/src/86box.c b/src/86box.c index 3264a2959..4ad02ff1a 100644 --- a/src/86box.c +++ b/src/86box.c @@ -109,6 +109,7 @@ int confirm_exit_cmdl = 1; /* (O) do not ask for confirmation on quit if set t uint64_t unique_id = 0; uint64_t source_hwnd = 0; #endif +char rom_path[1024] = { '\0'}; /* (O) full path to ROMs */ char log_path[1024] = { '\0'}; /* (O) full path of logfile */ char vm_name[1024] = { '\0'}; /* (O) display name of the VM */ @@ -379,12 +380,13 @@ pc_log(const char *fmt, ...) int pc_init(int argc, char *argv[]) { - char path[2048]; + char path[2048], path2[2048]; char *cfg = NULL, *p; char temp[128]; struct tm *info; time_t now; - int c; + int c, ng; + int lvmp; uint32_t *uid, *shwnd; /* Grab the executable's full path. */ @@ -401,7 +403,10 @@ pc_init(int argc, char *argv[]) * could have been set to something else. */ plat_getcwd(usr_path, sizeof(usr_path) - 1); + plat_getcwd(rom_path, sizeof(rom_path) - 1); + memset(path, 0x00, sizeof(path)); + memset(path2, 0x00, sizeof(path)); for (c=1; ctex_mem[0], voodoo->texture_size*1024*1024, 1, f); - fclose(f); - if (voodoo->dual_tmus) - { - f = rom_fopen("texram2.dmp", "wb"); - fwrite(voodoo->tex_mem[1], voodoo->texture_size*1024*1024, 1, f); - fclose(f); - } -#endif */ - voodoo->fifo_thread_run = 0; thread_set_event(voodoo->wake_fifo_thread); diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 5fe5790b0..56c7c26ba 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -838,7 +838,7 @@ LIBS += -static ifeq ($(AUTODEP), y) %.o: %.c @echo $< - $(CC) $(CFLAGS) $(DEPS) -c $< + @$(CC) $(CFLAGS) $(DEPS) -c $< %.o: %.cc @echo $<