From ba2381eb8b4618c48c0991acf2c49a1ac616c79a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 18 Dec 2024 17:44:21 -0500 Subject: [PATCH] Cleanups to OPL backends --- src/include/86box/snd_opl.h | 7 +-- src/sound/snd_opl.c | 22 +++++---- src/sound/snd_opl_esfm.c | 18 +++---- src/sound/snd_opl_nuked.c | 25 +++++----- src/sound/snd_opl_opl2board.cpp | 83 ++++++++++++--------------------- src/sound/snd_opl_ymfm.cpp | 20 ++++---- 6 files changed, 77 insertions(+), 98 deletions(-) diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index fe0112b47..58c54d17d 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -21,9 +21,9 @@ enum fm_type { FM_YM3812 = 0, /* OPL2 */ FM_YMF262 = 1, /* OPL3 */ FM_YMF289B = 2, /* OPL3-L */ - FM_YMF278B = 3, /* OPL 4 */ + FM_YMF278B = 3, /* OPL4 */ FM_ESFM = 4, /* ESFM */ - FM_OPL2BOARD = 5, /* OPL2BOARD (External Device)*/ + FM_OPL2BOARD = 5, /* OPL2Board (External Device) */ FM_MAX = 6 }; @@ -48,7 +48,7 @@ extern uint8_t fm_driver_get(int chip_id, fm_drv_t *drv); extern const fm_drv_t nuked_opl_drv; extern const fm_drv_t ymfm_drv; extern const fm_drv_t esfmu_opl_drv; -extern const fm_drv_t ymfm_opl2board_drv; +extern const fm_drv_t ymfm_opl2board_drv; #ifdef EMU_DEVICE_H extern const device_t ym3812_nuked_device; @@ -60,6 +60,7 @@ extern const device_t ymf289b_ymfm_device; extern const device_t ymf278b_ymfm_device; extern const device_t esfm_esfmu_device; + #ifdef USE_LIBSERIALPORT extern const device_t ym_opl2board_device; #endif diff --git a/src/sound/snd_opl.c b/src/sound/snd_opl.c index cddc18119..e9a0d459b 100644 --- a/src/sound/snd_opl.c +++ b/src/sound/snd_opl.c @@ -39,7 +39,7 @@ uint8_t fm_driver_get(int chip_id, fm_drv_t *drv) { switch (chip_id) { - case FM_YM3812: + case FM_YM3812: /* OPL2 */ if (fm_driver == FM_DRV_NUKED) { *drv = nuked_opl_drv; drv->priv = device_add_inst(&ym3812_nuked_device, fm_dev_inst[fm_driver][chip_id]++); @@ -49,7 +49,7 @@ fm_driver_get(int chip_id, fm_drv_t *drv) } break; - case FM_YMF262: + case FM_YMF262: /* OPL3 */ if (fm_driver == FM_DRV_NUKED) { *drv = nuked_opl_drv; drv->priv = device_add_inst(&ymf262_nuked_device, fm_dev_inst[fm_driver][chip_id]++); @@ -58,18 +58,13 @@ fm_driver_get(int chip_id, fm_drv_t *drv) drv->priv = device_add_inst(&ymf262_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); } break; -#ifdef USE_LIBSERIALPORT - case FM_OPL2BOARD: - *drv = ymfm_opl2board_drv; - drv->priv = device_add_inst(&ym_opl2board_device, fm_dev_inst[fm_driver][chip_id]++); - break; -#endif - case FM_YMF289B: + + case FM_YMF289B: /* OPL3-L */ *drv = ymfm_drv; drv->priv = device_add_inst(&ymf289b_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); break; - case FM_YMF278B: + case FM_YMF278B: /* OPL4 */ *drv = ymfm_drv; drv->priv = device_add_inst(&ymf278b_ymfm_device, fm_dev_inst[fm_driver][chip_id]++); break; @@ -79,6 +74,13 @@ fm_driver_get(int chip_id, fm_drv_t *drv) drv->priv = device_add_inst(&esfm_esfmu_device, fm_dev_inst[fm_driver][chip_id]++); break; +#ifdef USE_LIBSERIALPORT + case FM_OPL2BOARD: + *drv = ymfm_opl2board_drv; + drv->priv = device_add_inst(&ym_opl2board_device, fm_dev_inst[fm_driver][chip_id]++); + break; +#endif + default: return 0; } diff --git a/src/sound/snd_opl_esfm.c b/src/sound/snd_opl_esfm.c index 78cbec11d..993a0ec6b 100644 --- a/src/sound/snd_opl_esfm.c +++ b/src/sound/snd_opl_esfm.c @@ -242,6 +242,7 @@ esfm_drv_read(uint16_t port, void *priv) if (dev->status & STAT_TMR_OVER) ret |= STAT_TMR_ANY; break; + case 0x0001: ret = ESFM_read_port(&dev->opl, port & 3); switch (dev->opl.addr_latch & 0x5ff) { @@ -256,6 +257,7 @@ esfm_drv_read(uint16_t port, void *priv) break; } break; + case 0x0002: case 0x0003: ret = 0xff; @@ -338,18 +340,18 @@ const device_t esfm_esfmu_device = { .init = esfm_drv_init, .close = esfm_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL }; const fm_drv_t esfmu_opl_drv = { - &esfm_drv_read, - &esfm_drv_write, - &esfm_drv_update, - &esfm_drv_reset_buffer, - &esfm_drv_set_do_cycles, - NULL, - NULL, + .read = &esfm_drv_read, + .write = &esfm_drv_write, + .update = &esfm_drv_update, + .reset_buffer = &esfm_drv_reset_buffer, + .set_do_cycles = &esfm_drv_set_do_cycles, + .priv = NULL, + .generate = NULL, }; diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index f1132867b..03851a589 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -68,9 +68,6 @@ #define RSM_FRAC 10 -// #define OPL_FREQ FREQ_48000 -#define OPL_FREQ FREQ_49716 - // Channel types enum { ch_2op = 0, @@ -1276,7 +1273,7 @@ OPL3_Reset(opl3_chip *chip, uint32_t samplerate) } chip->noise = 1; - chip->rateratio = (samplerate << RSM_FRAC) / 49716; + chip->rateratio = (samplerate << RSM_FRAC) / FREQ_49716; chip->tremoloshift = 4; chip->vibshift = 1; @@ -1538,7 +1535,7 @@ nuked_drv_init(const device_t *info) dev->status = 0x06; /* Initialize the NukedOPL object. */ - OPL3_Reset(&dev->opl, OPL_FREQ); + OPL3_Reset(&dev->opl, FREQ_49716); timer_add(&dev->timers[0], nuked_timer_1, dev, 0); timer_add(&dev->timers[1], nuked_timer_2, dev, 0); @@ -1659,7 +1656,7 @@ const device_t ym3812_nuked_device = { .init = nuked_drv_init, .close = nuked_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL , .speed_changed = NULL, .force_redraw = NULL, .config = NULL @@ -1673,18 +1670,18 @@ const device_t ymf262_nuked_device = { .init = nuked_drv_init, .close = nuked_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL }; const fm_drv_t nuked_opl_drv = { - &nuked_drv_read, - &nuked_drv_write, - &nuked_drv_update, - &nuked_drv_reset_buffer, - &nuked_drv_set_do_cycles, - NULL, - NULL, + .read = &nuked_drv_read, + .write = &nuked_drv_write, + .update = &nuked_drv_update, + .reset_buffer = &nuked_drv_reset_buffer, + .set_do_cycles = &nuked_drv_set_do_cycles, + .priv = NULL, + .generate = NULL, }; diff --git a/src/sound/snd_opl_opl2board.cpp b/src/sound/snd_opl_opl2board.cpp index 91649f372..286e62d4f 100644 --- a/src/sound/snd_opl_opl2board.cpp +++ b/src/sound/snd_opl_opl2board.cpp @@ -23,7 +23,6 @@ #include "ymfm/ymfm_opl.h" #include - extern "C" { #define HAVE_STDARG_H #include <86box/86box.h> @@ -38,7 +37,6 @@ extern "C" { #include <86box/ini.h> #include <86box/device.h> - // Disable c99-designator to avoid the warnings in *_ymfm_device #ifdef __clang__ # if __has_warning("-Wc99-designator") @@ -46,21 +44,16 @@ extern "C" { # pragma clang diagnostic ignored "-Wc99-designator" # endif #endif - } - #define RSM_FRAC 10 -#define OPL_FREQ FREQ_48000 - enum { FLAG_CYCLES = (1 << 0) }; uint8_t lastval = 0x00; - class OPLBOARDChipBase { public: OPLBOARDChipBase(UNUSED(uint32_t clock), fm_type type, uint32_t samplerate) @@ -90,7 +83,6 @@ public: virtual uint8_t read(uint16_t addr) = 0; virtual void set_clock(uint32_t clock) = 0; - protected: int32_t m_buffer[MUSICBUFLEN * 2]; int m_buf_pos; @@ -244,7 +236,6 @@ public: virtual void write(uint16_t addr, uint8_t data) override { - m_chip.write(addr, data); } @@ -315,31 +306,27 @@ extern "C" { #include <86box/config.h> #include <86box/ini.h> - -#ifdef ENABLE_OPL_LOG -int ymfm_do_log = ENABLE_OPL_LOG; +#ifdef ENABLE_OPL_LOG +int oplboard_do_log = ENABLE_OPL_LOG; static void -ymfm_log(const char *fmt, ...) +oplboard_log(const char *fmt, ...) { va_list ap; - if (ymfm_do_log) { + if (oplboard_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); } } #else -# define ymfm_log(fmt, ...) +# define oplboard_log(fmt, ...) #endif struct sp_port *port; - - void opl2board_init() { - device_add(&opl2board_device); const char* port_name = device_get_config_string("host_serial_path"); device_context_restore(); @@ -348,13 +335,13 @@ void opl2board_init() { result = sp_get_port_by_name(port_name, &port); if (result != SP_OK) { - ymfm_log("Error: Cannot find port %s\n", port_name); + oplboard_log("Error: Cannot find port %s\n", port_name); return; } result = sp_open(port, SP_MODE_READ_WRITE); if (result != SP_OK) { - ymfm_log ("Error: Cannot open port %s\n", port_name); + oplboard_log ("Error: Cannot open port %s\n", port_name); return; } @@ -364,33 +351,29 @@ void opl2board_init() { sp_set_parity(port, SP_PARITY_NONE); sp_set_stopbits(port, 1); sp_set_flowcontrol(port, SP_FLOWCONTROL_NONE); - - ymfm_log("OPL2Board Serial port %s initialized at 115200 baud.\n", port_name); - + oplboard_log("OPL2Board Serial port %s initialized at 115200 baud.\n", port_name); } - void opl2board_write(uint8_t data) { if (port == NULL) { - ymfm_log(stderr, "Error: OPL2Board Port not initialized.\n"); + oplboard_log(stderr, "Error: OPL2Board Port not initialized.\n"); return; } enum sp_return result = sp_blocking_write(port, &data, sizeof(data), 1000); if (result < 0) { - ymfm_log(stderr, "Error: Failed to write to OPL2Board port.\n"); + oplboard_log(stderr, "Error: Failed to write to OPL2Board port.\n"); } else { - ymfm_log("OPL2Board: data sent: %02X\n", data); + oplboard_log("OPL2Board: data sent: %02X\n", data); } } - void opl2board_reset() { // Reset all voices to 0 - ymfm_log("Performing OPL2Board reset\n"); + oplboard_log("Performing OPL2Board reset\n"); for (uint8_t i = 0x00; i < 0xFF; i++) { if (i >= 0x40 && i <= 0x55) { opl2board_write(i); @@ -408,11 +391,10 @@ void opl2board_close() { sp_close(port); sp_free_port(port); port = NULL; - ymfm_log("OPL2Board port closed.\n"); + oplboard_log("OPL2Board port closed.\n"); } } - static void * ymfm_opl2board_drv_init(const device_t *info) { @@ -433,6 +415,7 @@ static void ymfm_opl2board_drv_close(void *priv) { OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv; + opl2board_close(); if (drv != NULL) delete drv; @@ -453,29 +436,27 @@ ymfm_opl2board_drv_read(uint16_t port, void *priv) uint8_t ret = drv->read(port); drv->update(); - ymfm_log("YMFM read port %04x, status = %02x\n", port, ret); + oplboard_log("OPLBoard read port %04x, status = %02x\n", port, ret); return ret; } static void ymfm_opl2board_drv_write(uint16_t port, uint8_t val, void *priv) { - OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv; - ymfm_log("YMFM write port %04x value = %02x\n", port, val); + oplboard_log("OPLBoard write port %04x value = %02x\n", port, val); if ((port == 0x380) || (port == 0x381)) port |= 4; - // Allow initialization of adlib - if ((val == 0x04 || val == 0x02) || (lastval == 0x04 || lastval == 0x02)) { + // Allow initialization of adlib + if ((val == 0x04 || val == 0x02) || (lastval == 0x04 || lastval == 0x02)) drv->write(port, val); - } + lastval = val; opl2board_write(val); drv->update(); } - static int32_t * ymfm_opl2board_drv_update(void *priv) { @@ -500,22 +481,19 @@ static void ymfm_opl2board_drv_set_do_cycles(void *priv, int8_t do_cycles) { OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv; + drv->set_do_cycles(do_cycles); } static void ymfm_opl2board_drv_generate(void *priv, int32_t *data, uint32_t num_samples) -{ - +{ OPLBOARDChipBase *drv = (OPLBOARDChipBase *) priv; + // drv->generate_resampled(data, num_samples); drv->generate(data, num_samples); - } - - - const device_t ym_opl2board_device = { .name = "YMOPL2Board (External Device)", .internal_name = "ym_opl2board_device", @@ -524,21 +502,20 @@ const device_t ym_opl2board_device = { .init = ymfm_opl2board_drv_init, .close = ymfm_opl2board_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL }; const fm_drv_t ymfm_opl2board_drv { - &ymfm_opl2board_drv_read, - &ymfm_opl2board_drv_write, - &ymfm_opl2board_drv_update, - &ymfm_opl2board_drv_reset_buffer, - &ymfm_opl2board_drv_set_do_cycles, - NULL, - ymfm_opl2board_drv_generate - + .read = &ymfm_opl2board_drv_read, + .write = &ymfm_opl2board_drv_write, + .update = &ymfm_opl2board_drv_update, + .reset_buffer = &ymfm_opl2board_drv_reset_buffer, + .set_do_cycles = &ymfm_opl2board_drv_set_do_cycles, + .priv = NULL, + .generate = ymfm_opl2board_drv_generate }; #ifdef __clang__ diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index ccd77ed39..bf32bba27 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -38,13 +38,10 @@ extern "C" { # pragma clang diagnostic ignored "-Wc99-designator" # endif #endif - } #define RSM_FRAC 10 -#define OPL_FREQ FREQ_48000 - enum { FLAG_CYCLES = (1 << 0) }; @@ -379,6 +376,7 @@ static void ymfm_drv_write(uint16_t port, uint8_t val, void *priv) { YMFMChipBase *drv = (YMFMChipBase *) priv; + ymfm_log("YMFM write port %04x value = %02x\n", port, val); if ((port == 0x380) || (port == 0x381)) port |= 4; @@ -406,6 +404,7 @@ static void ymfm_drv_set_do_cycles(void *priv, int8_t do_cycles) { YMFMChipBase *drv = (YMFMChipBase *) priv; + drv->set_do_cycles(do_cycles); } @@ -413,6 +412,7 @@ static void ymfm_drv_generate(void *priv, int32_t *data, uint32_t num_samples) { YMFMChipBase *drv = (YMFMChipBase *) priv; + // drv->generate_resampled(data, num_samples); drv->generate(data, num_samples); } @@ -474,13 +474,13 @@ const device_t ymf278b_ymfm_device = { }; const fm_drv_t ymfm_drv { - &ymfm_drv_read, - &ymfm_drv_write, - &ymfm_drv_update, - &ymfm_drv_reset_buffer, - &ymfm_drv_set_do_cycles, - NULL, - ymfm_drv_generate, + .read = &ymfm_drv_read, + .write = &ymfm_drv_write, + .update = &ymfm_drv_update, + .reset_buffer = &ymfm_drv_reset_buffer, + .set_do_cycles = &ymfm_drv_set_do_cycles, + .priv = NULL, + .generate = ymfm_drv_generate, }; #ifdef __clang__