From bbe19f20a9643e2ad2ce03ab7a49b47cb491f1a2 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 20 Apr 2022 09:03:43 -0500 Subject: [PATCH] wineoss: Add a temporary midi_out_fm_patch syscall. Signed-off-by: Huw Davies Signed-off-by: Andrew Eikum Signed-off-by: Alexandre Julliard --- dlls/wineoss.drv/midi.c | 34 +++++----------------------- dlls/wineoss.drv/midipatch.c | 4 ++++ dlls/wineoss.drv/oss.c | 1 + dlls/wineoss.drv/ossmidi.c | 43 ++++++++++++++++++++++++++++++++++++ dlls/wineoss.drv/unixlib.h | 9 ++++++++ 5 files changed, 63 insertions(+), 28 deletions(-) diff --git a/dlls/wineoss.drv/midi.c b/dlls/wineoss.drv/midi.c index 58047380639..3d2552007cd 100644 --- a/dlls/wineoss.drv/midi.c +++ b/dlls/wineoss.drv/midi.c @@ -723,40 +723,18 @@ typedef struct sFMextra { */ } sFMextra; -extern const unsigned char midiFMInstrumentPatches[16 * 128]; -extern const unsigned char midiFMDrumsPatches [16 * 128]; - /************************************************************************** * modFMLoad [internal] */ -static int modFMLoad(int dev, int fd) +static int modFMLoad(WORD dev, int fd) { - int i; - struct sbi_instrument sbi; + struct midi_out_fm_load_params params; - sbi.device = dev; - sbi.key = FM_PATCH; + params.dev_id = dev; + params.fd = fd; + OSS_CALL(midi_out_fm_load, ¶ms); - memset(sbi.operators + 16, 0, 16); - for (i = 0; i < 128; i++) { - sbi.channel = i; - memcpy(sbi.operators, midiFMInstrumentPatches + i * 16, 16); - - if (write(fd, &sbi, sizeof(sbi)) == -1) { - WARN("Couldn't write patch for instrument %d, errno %d (%s)!\n", sbi.channel, errno, strerror(errno)); - return -1; - } - } - for (i = 0; i < 128; i++) { - sbi.channel = 128 + i; - memcpy(sbi.operators, midiFMDrumsPatches + i * 16, 16); - - if (write(fd, &sbi, sizeof(sbi)) == -1) { - WARN("Couldn't write patch for drum %d, errno %d (%s)!\n", sbi.channel, errno, strerror(errno)); - return -1; - } - } - return 0; + return params.ret; } /************************************************************************** diff --git a/dlls/wineoss.drv/midipatch.c b/dlls/wineoss.drv/midipatch.c index 41d8e07b99a..4ff48623260 100644 --- a/dlls/wineoss.drv/midipatch.c +++ b/dlls/wineoss.drv/midipatch.c @@ -24,6 +24,10 @@ * Eric POUECH : MIDI FM patches for GM instruments */ +#if 0 +#pragma makedep unix +#endif + #define NOT_DEFINED 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, const unsigned char midiFMInstrumentPatches[128 * 16] = { diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index ac8847920b0..2fc6c81e560 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1408,4 +1408,5 @@ unixlib_entry_t __wine_unix_call_funcs[] = midi_init, midi_seq_open, + midi_out_fm_load, }; diff --git a/dlls/wineoss.drv/ossmidi.c b/dlls/wineoss.drv/ossmidi.c index a0a0b1caad2..ba5dbca7e4f 100644 --- a/dlls/wineoss.drv/ossmidi.c +++ b/dlls/wineoss.drv/ossmidi.c @@ -345,3 +345,46 @@ wrapup: return STATUS_SUCCESS; } + +extern const unsigned char midiFMInstrumentPatches[16 * 128]; +extern const unsigned char midiFMDrumsPatches[16 * 128]; + +NTSTATUS midi_out_fm_load(void *args) +{ + struct midi_out_fm_load_params *params = args; + WORD dev_id = params->dev_id; + int fd = params->fd; + struct sbi_instrument sbi; + int i; + + sbi.device = dev_id; + sbi.key = FM_PATCH; + + memset(sbi.operators + 16, 0, 16); + for (i = 0; i < 128; i++) + { + sbi.channel = i; + memcpy(sbi.operators, midiFMInstrumentPatches + i * 16, 16); + + if (write(fd, &sbi, sizeof(sbi)) == -1) + { + WARN("Couldn't write patch for instrument %d, errno %d (%s)!\n", sbi.channel, errno, strerror(errno)); + params->ret = -1; + return STATUS_SUCCESS; + } + } + for (i = 0; i < 128; i++) + { + sbi.channel = 128 + i; + memcpy(sbi.operators, midiFMDrumsPatches + i * 16, 16); + + if (write(fd, &sbi, sizeof(sbi)) == -1) + { + WARN("Couldn't write patch for drum %d, errno %d (%s)!\n", sbi.channel, errno, strerror(errno)); + params->ret = -1; + return STATUS_SUCCESS; + } + } + params->ret = 0; + return STATUS_SUCCESS; +} diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index 68d41e41f74..4dab53f5148 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -252,6 +252,13 @@ struct midi_seq_open_params int fd; }; +struct midi_out_fm_load_params +{ + WORD dev_id; + int fd; + int ret; +}; + enum oss_funcs { oss_test_connect, @@ -280,10 +287,12 @@ enum oss_funcs oss_midi_init, oss_midi_seq_open, /* temporary */ + oss_midi_out_fm_load, }; NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN; NTSTATUS midi_seq_open(void *args) DECLSPEC_HIDDEN; +NTSTATUS midi_out_fm_load(void *args) DECLSPEC_HIDDEN; extern unixlib_handle_t oss_handle;