diff --git a/src/Makefile.am b/src/Makefile.am index 35ed872..8965c21 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,7 +27,7 @@ vid_pc1512.c vid_pc1640.c vid_pcjr.c vid_ps1_svga.c vid_s3.c vid_s3_virge.c vid_ vid_stg_ramdac.c vid_svga.c vid_svga_render.c vid_tandy.c vid_tandysl.c vid_tgui9440.c \ vid_tkd8001_ramdac.c vid_tvga.c vid_unk_ramdac.c vid_vga.c vid_voodoo.c video.c wd76c10.c vid_wy700.c \ x86seg.c x87.c xtide.c sound_dbopl.cc sound_resid.cc dosbox/cdrom_image.cpp dosbox/dbopl.cpp \ -dosbox/vid_cga_comp.c resid-fp/convolve.cc resid-fp/convolve-sse.cc resid-fp/envelope.cc \ +dosbox/nukedopl.cpp dosbox/vid_cga_comp.c resid-fp/convolve.cc resid-fp/convolve-sse.cc resid-fp/envelope.cc \ resid-fp/extfilt.cc resid-fp/filter.cc resid-fp/pot.cc resid-fp/sid.cc \ resid-fp/voice.cc resid-fp/wave6581_PS_.cc resid-fp/wave6581_PST.cc \ resid-fp/wave6581_P_T.cc resid-fp/wave6581__ST.cc resid-fp/wave8580_PS_.cc \ diff --git a/src/Makefile.linux32 b/src/Makefile.linux32 index 26e3e10..b8dc43f 100644 --- a/src/Makefile.linux32 +++ b/src/Makefile.linux32 @@ -22,7 +22,7 @@ vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_wy700.o vid_voodoo.o video.o wd76c10.o \ x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.linux32-wx-sdl2 b/src/Makefile.linux32-wx-sdl2 index a6ecc81..d828df9 100644 --- a/src/Makefile.linux32-wx-sdl2 +++ b/src/Makefile.linux32-wx-sdl2 @@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70 x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.linux64 b/src/Makefile.linux64 index c44faa4..3e1f78d 100644 --- a/src/Makefile.linux64 +++ b/src/Makefile.linux64 @@ -21,7 +21,7 @@ vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o \ x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.linux64-wx-sdl2 b/src/Makefile.linux64-wx-sdl2 index 1802e04..e331164 100644 --- a/src/Makefile.linux64-wx-sdl2 +++ b/src/Makefile.linux64-wx-sdl2 @@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70 x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.mingw b/src/Makefile.mingw index c9fb127..cbc49d7 100644 --- a/src/Makefile.mingw +++ b/src/Makefile.mingw @@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ win-status.o win-video.o x86seg.o x87.o xtide.o pc.res -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.mingw-wx-sdl2 b/src/Makefile.mingw-wx-sdl2 index 169eaaf..8c2e2bf 100644 --- a/src/Makefile.mingw-wx-sdl2 +++ b/src/Makefile.mingw-wx-sdl2 @@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.mingw64 b/src/Makefile.mingw64 index cfaaab8..67df2c0 100644 --- a/src/Makefile.mingw64 +++ b/src/Makefile.mingw64 @@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ win-status.o win-video.o x86seg.o x87.o xtide.o pc.res -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.osx64-wx-sdl2 b/src/Makefile.osx64-wx-sdl2 index a54f1e6..bf8a60f 100644 --- a/src/Makefile.osx64-wx-sdl2 +++ b/src/Makefile.osx64-wx-sdl2 @@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70 x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-sdl2-hdconf.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o -DBOBJ = cdrom_image.o dbopl.o vid_cga_comp.o +DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/sound_adlibgold.c b/src/sound_adlibgold.c index 063d261..bc5b445 100644 --- a/src/sound_adlibgold.c +++ b/src/sound_adlibgold.c @@ -768,12 +768,14 @@ void *adgold_init() FILE *f; int c; double out; + int opl_emu; adgold_t *adgold = malloc(sizeof(adgold_t)); memset(adgold, 0, sizeof(adgold_t)); adgold->surround_enabled = device_get_config_int("surround"); + opl_emu = device_get_config_int("opl_emu"); - opl3_init(&adgold->opl); + opl3_init(&adgold->opl, opl_emu); if (adgold->surround_enabled) ym7128_init(&adgold->ym7128); @@ -844,6 +846,23 @@ static device_config_t adgold_config[] = .type = CONFIG_BINARY, .default_int = 1 }, + { + .name = "opl_emu", + .description = "OPL emulator", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DBOPL", + .value = OPL_DBOPL + }, + { + .description = "NukedOPL", + .value = OPL_NUKED + }, + }, + .default_int = OPL_DBOPL + }, { .type = -1 } diff --git a/src/sound_dbopl.cc b/src/sound_dbopl.cc index 7040747..7342ea4 100644 --- a/src/sound_dbopl.cc +++ b/src/sound_dbopl.cc @@ -1,15 +1,18 @@ #include "dosbox/dbopl.h" +#include "dosbox/nukedopl.h" #include "sound_dbopl.h" static struct { DBOPL::Chip chip; + struct opl3_chip opl3chip; int addr; int timer[2]; uint8_t timer_ctrl; uint8_t status_mask; uint8_t status; int is_opl3; + int opl_emu; void (*timer_callback)(void *param, int timer, int64_t period); void *timer_param; @@ -31,13 +34,25 @@ enum CTRL_TIMER1_CTRL = 0x01 }; -void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3) +void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3, int opl_emu) { - DBOPL::InitTables(); - opl[nr].chip.Setup(48000, is_opl3); - opl[nr].timer_callback = timer_callback; - opl[nr].timer_param = timer_param; - opl[nr].is_opl3 = is_opl3; + if (!is_opl3 || !opl_emu) + { + DBOPL::InitTables(); + opl[nr].chip.Setup(48000, is_opl3); + opl[nr].timer_callback = timer_callback; + opl[nr].timer_param = timer_param; + opl[nr].is_opl3 = is_opl3; + opl[nr].opl_emu = opl_emu; + } + else + { + OPL3_Reset(&opl[nr].opl3chip, 48000); + opl[nr].timer_callback = timer_callback; + opl[nr].timer_param = timer_param; + opl[nr].is_opl3 = is_opl3; + opl[nr].opl_emu = opl_emu; + } } void opl_status_update(int nr) @@ -67,10 +82,18 @@ void opl_timer_over(int nr, int timer) void opl_write(int nr, uint16_t addr, uint8_t val) { if (!(addr & 1)) - opl[nr].addr = (int)opl[nr].chip.WriteAddr(addr, val) & (opl[nr].is_opl3 ? 0x1ff : 0xff); + { + if (!opl[nr].is_opl3 || !opl[nr].opl_emu) + opl[nr].addr = (int)opl[nr].chip.WriteAddr(addr, val) & (opl[nr].is_opl3 ? 0x1ff : 0xff); + else + opl[nr].addr = (int)OPL3_WriteAddr(&opl[nr].opl3chip, addr, val) & 0x1ff; + } else { - opl[nr].chip.WriteReg(opl[nr].addr, val); + if (!opl[nr].is_opl3 || !opl[nr].opl_emu) + opl[nr].chip.WriteReg(opl[nr].addr, val); + else + OPL3_WriteReg(&opl[nr].opl3chip, opl[nr].addr, val); switch (opl[nr].addr) { @@ -133,9 +156,16 @@ void opl3_update(int nr, int16_t *buffer, int samples) { int c; Bit32s buffer_32[samples*2]; - - opl[nr].chip.GenerateBlock3(samples, buffer_32); - - for (c = 0; c < samples*2; c++) - buffer[c] = (int16_t)buffer_32[c]; + + if (opl[nr].opl_emu) + { + OPL3_GenerateStream(&opl[nr].opl3chip, buffer, samples); + } + else + { + opl[nr].chip.GenerateBlock3(samples, buffer_32); + + for (c = 0; c < samples*2; c++) + buffer[c] = (int16_t)buffer_32[c]; + } } diff --git a/src/sound_dbopl.h b/src/sound_dbopl.h index 0890552..4aa03bf 100644 --- a/src/sound_dbopl.h +++ b/src/sound_dbopl.h @@ -1,7 +1,7 @@ #ifdef __cplusplus extern "C" { #endif - void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3); + void opl_init(void (*timer_callback)(void *param, int timer, int64_t period), void *timer_param, int nr, int is_opl3, int opl_emu); void opl_write(int nr, uint16_t addr, uint8_t val); uint8_t opl_read(int nr, uint16_t addr); void opl_timer_over(int nr, int timer); diff --git a/src/sound_opl.c b/src/sound_opl.c index 9fece84..2a59460 100644 --- a/src/sound_opl.c +++ b/src/sound_opl.c @@ -159,17 +159,17 @@ static void opl_timer_callback11(void *p) void opl2_init(opl_t *opl) { - opl_init(ym3812_timer_set_0, opl, 0, 0); - opl_init(ym3812_timer_set_1, opl, 1, 0); + opl_init(ym3812_timer_set_0, opl, 0, 0, 0); + opl_init(ym3812_timer_set_1, opl, 1, 0, 0); timer_add(opl_timer_callback00, &opl->timers[0][0], &opl->timers_enable[0][0], (void *)opl); timer_add(opl_timer_callback01, &opl->timers[0][1], &opl->timers_enable[0][1], (void *)opl); timer_add(opl_timer_callback10, &opl->timers[1][0], &opl->timers_enable[1][0], (void *)opl); timer_add(opl_timer_callback11, &opl->timers[1][1], &opl->timers_enable[1][1], (void *)opl); } -void opl3_init(opl_t *opl) +void opl3_init(opl_t *opl, int opl_emu) { - opl_init(ymf262_timer_set, opl, 0, 1); + opl_init(ymf262_timer_set, opl, 0, 1, opl_emu); timer_add(opl_timer_callback00, &opl->timers[0][0], &opl->timers_enable[0][0], (void *)opl); timer_add(opl_timer_callback01, &opl->timers[0][1], &opl->timers_enable[0][1], (void *)opl); } diff --git a/src/sound_opl.h b/src/sound_opl.h index 047808e..8d67bb9 100644 --- a/src/sound_opl.h +++ b/src/sound_opl.h @@ -24,7 +24,10 @@ void opl2_poll(opl_t *opl, int16_t *bufl, int16_t *bufr); void opl3_poll(opl_t *opl, int16_t *bufl, int16_t *bufr); void opl2_init(opl_t *opl); -void opl3_init(opl_t *opl); +void opl3_init(opl_t *opl, int opl_emu); void opl2_update2(opl_t *opl); void opl3_update2(opl_t *opl); + +#define OPL_DBOPL 0 +#define OPL_NUKED 1 diff --git a/src/sound_pas16.c b/src/sound_pas16.c index 2e6f4be..bbb2fbc 100644 --- a/src/sound_pas16.c +++ b/src/sound_pas16.c @@ -731,7 +731,7 @@ void *pas16_init() pas16_t *pas16 = malloc(sizeof(pas16_t)); memset(pas16, 0, sizeof(pas16_t)); - opl3_init(&pas16->opl); + opl3_init(&pas16->opl, 0); sb_dsp_init(&pas16->dsp, SB2); io_sethandler(0x9a01, 0x0001, NULL, NULL, NULL, pas16_out_base, NULL, NULL, pas16); diff --git a/src/sound_sb.c b/src/sound_sb.c index 605c605..264c2b1 100644 --- a/src/sound_sb.c +++ b/src/sound_sb.c @@ -39,6 +39,8 @@ typedef struct sb_t int pos; uint8_t pos_regs[8]; + + int opl_emu; } sb_t; static int sb_att[]= @@ -61,8 +63,8 @@ static void sb_get_buffer_opl2(int32_t *buffer, int len, void *p) { int32_t out_l, out_r; - out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * 55000) >> 16); - out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * 55000) >> 16); + out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * 51000) >> 16); + out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * 51000) >> 16); if (sb->mixer.filter) { @@ -112,8 +114,8 @@ static void sb_get_buffer_opl3(int32_t *buffer, int len, void *p) { int32_t out_l, out_r; - out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * 55000) >> 16); - out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * 55000) >> 16); + out_l = ((((sb->opl.buffer[c] * mixer->fm_l) >> 16) * (sb->opl_emu ? 47000 : 55000)) >> 16); + out_r = ((((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16) * (sb->opl_emu ? 47000 : 55000)) >> 16); if (sb->mixer.filter) { @@ -322,6 +324,7 @@ uint8_t sb_16_mixer_read(uint16_t addr, void *p) switch (mixer->index) { + case 0x40: return 0xff; case 0x80: switch (sb->dsp.sb_irqnum) { @@ -535,7 +538,8 @@ void *sb_pro_v2_init() uint16_t addr = device_get_config_int("addr"); memset(sb, 0, sizeof(sb_t)); - opl3_init(&sb->opl); + sb->opl_emu = device_get_config_int("opl_emu"); + opl3_init(&sb->opl, sb->opl_emu); sb_dsp_init(&sb->dsp, SBPRO2); sb_dsp_setaddr(&sb->dsp, addr); sb_dsp_setirq(&sb->dsp, device_get_config_int("irq")); @@ -558,14 +562,11 @@ void *sb_pro_v2_init() void *sb_pro_mcv_init() { sb_t *sb = malloc(sizeof(sb_t)); - //uint16_t addr = device_get_config_int("addr"); memset(sb, 0, sizeof(sb_t)); - opl3_init(&sb->opl); + sb->opl_emu = device_get_config_int("opl_emu"); + opl3_init(&sb->opl, sb->opl_emu); sb_dsp_init(&sb->dsp, SBPRO2); - /*sb_dsp_setaddr(&sb->dsp, addr); - sb_dsp_setirq(&sb->dsp, device_get_config_int("irq")); - sb_dsp_setdma8(&sb->dsp, device_get_config_int("dma"));*/ sb_mixer_init(&sb->mixer); io_sethandler(0x0388, 0x0004, opl3_read, NULL, NULL, opl3_write, NULL, NULL, &sb->opl); sound_add_handler(sb_get_buffer_opl3, sb); @@ -587,7 +588,8 @@ void *sb_16_init() sb_t *sb = malloc(sizeof(sb_t)); memset(sb, 0, sizeof(sb_t)); - opl3_init(&sb->opl); + sb->opl_emu = device_get_config_int("opl_emu"); + opl3_init(&sb->opl, sb->opl_emu); sb_dsp_init(&sb->dsp, SB16); sb_dsp_setaddr(&sb->dsp, 0x0220); sb_mixer_init(&sb->mixer); @@ -626,7 +628,8 @@ void *sb_awe32_init() int onboard_ram = device_get_config_int("onboard_ram"); memset(sb, 0, sizeof(sb_t)); - opl3_init(&sb->opl); + sb->opl_emu = device_get_config_int("opl_emu"); + opl3_init(&sb->opl, sb->opl_emu); sb_dsp_init(&sb->dsp, SB16 + 1); sb_dsp_setaddr(&sb->dsp, 0x0220); sb_mixer_init(&sb->mixer); @@ -812,7 +815,7 @@ static device_config_t sb_mcv_config[] = } }; -static device_config_t sb_pro_config[] = +static device_config_t sb_pro_v1_config[] = { { .name = "addr", @@ -888,6 +891,123 @@ static device_config_t sb_pro_config[] = } }; +static device_config_t sb_pro_v2_config[] = +{ + { + .name = "addr", + .description = "Address", + .type = CONFIG_BINARY, + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "0x220", + .value = 0x220 + }, + { + .description = "0x240", + .value = 0x240 + }, + { + .description = "" + } + }, + .default_int = 0x220 + }, + { + .name = "irq", + .description = "IRQ", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "IRQ 2", + .value = 2 + }, + { + .description = "IRQ 5", + .value = 5 + }, + { + .description = "IRQ 7", + .value = 7 + }, + { + .description = "IRQ 10", + .value = 10 + }, + { + .description = "" + } + }, + .default_int = 7 + }, + { + .name = "dma", + .description = "DMA", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DMA 1", + .value = 1 + }, + { + .description = "DMA 3", + .value = 3 + }, + { + .description = "" + } + }, + .default_int = 1 + }, + { + .name = "opl_emu", + .description = "OPL emulator", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DBOPL", + .value = OPL_DBOPL + }, + { + .description = "NukedOPL", + .value = OPL_NUKED + }, + }, + .default_int = OPL_DBOPL + }, + { + .type = -1 + } +}; + +static device_config_t sb_pro_mcv_config[] = +{ + { + .name = "opl_emu", + .description = "OPL emulator", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DBOPL", + .value = OPL_DBOPL + }, + { + .description = "NukedOPL", + .value = OPL_NUKED + }, + }, + .default_int = OPL_DBOPL + }, + { + .type = -1 + } +}; + static device_config_t sb_16_config[] = { { @@ -896,6 +1016,23 @@ static device_config_t sb_16_config[] = .type = CONFIG_MIDI, .default_int = 0 }, + { + .name = "opl_emu", + .description = "OPL emulator", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DBOPL", + .value = OPL_DBOPL + }, + { + .description = "NukedOPL", + .value = OPL_NUKED + }, + }, + .default_int = OPL_DBOPL + }, { .type = -1 } @@ -941,6 +1078,23 @@ static device_config_t sb_awe32_config[] = }, .default_int = 512 }, + { + .name = "opl_emu", + .description = "OPL emulator", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DBOPL", + .value = OPL_DBOPL + }, + { + .description = "NukedOPL", + .value = OPL_NUKED + }, + }, + .default_int = OPL_DBOPL + }, { .type = -1 } @@ -1004,7 +1158,7 @@ device_t sb_pro_v1_device = sb_speed_changed, NULL, sb_add_status_info, - sb_pro_config + sb_pro_v1_config }; device_t sb_pro_v2_device = { @@ -1016,7 +1170,7 @@ device_t sb_pro_v2_device = sb_speed_changed, NULL, sb_add_status_info, - sb_pro_config + sb_pro_v2_config }; device_t sb_pro_mcv_device = { @@ -1028,7 +1182,7 @@ device_t sb_pro_mcv_device = sb_speed_changed, NULL, sb_add_status_info, - NULL + sb_pro_mcv_config }; device_t sb_16_device = { diff --git a/src/sound_wss.c b/src/sound_wss.c index bd94c38..4129744 100644 --- a/src/sound_wss.c +++ b/src/sound_wss.c @@ -78,11 +78,12 @@ static void wss_get_buffer(int32_t *buffer, int len, void *p) void *wss_init() { + int opl_emu; wss_t *wss = malloc(sizeof(wss_t)); - memset(wss, 0, sizeof(wss_t)); - opl3_init(&wss->opl); + opl_emu = device_get_config_int("opl_emu"); + opl3_init(&wss->opl, opl_emu); ad1848_init(&wss->ad1848); ad1848_setirq(&wss->ad1848, 7); @@ -111,6 +112,30 @@ void wss_speed_changed(void *p) ad1848_speed_changed(&wss->ad1848); } +static device_config_t wss_config[] = +{ + { + .name = "opl_emu", + .description = "OPL emulator", + .type = CONFIG_SELECTION, + .selection = + { + { + .description = "DBOPL", + .value = OPL_DBOPL + }, + { + .description = "NukedOPL", + .value = OPL_NUKED + }, + }, + .default_int = OPL_DBOPL + }, + { + .type = -1 + } +}; + device_t wss_device = { "Windows Sound System", @@ -120,5 +145,6 @@ device_t wss_device = NULL, wss_speed_changed, NULL, - NULL + NULL, + wss_config };