From ad4e4d1129348c74727bbab5606436f113136e09 Mon Sep 17 00:00:00 2001 From: cam900 Date: Fri, 13 Sep 2019 23:28:53 +0900 Subject: mega32x.cpp : Fix crash in vgmplay (#5624) --- src/mame/drivers/megadriv.cpp | 6 ++++++ src/mame/drivers/vgmplay.cpp | 2 ++ src/mame/machine/mega32x.cpp | 22 ++++++++++++++++++---- src/mame/machine/mega32x.h | 6 +++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/megadriv.cpp b/src/mame/drivers/megadriv.cpp index dfb691a7d59..4b84971b561 100644 --- a/src/mame/drivers/megadriv.cpp +++ b/src/mame/drivers/megadriv.cpp @@ -614,6 +614,8 @@ void md_cons_state::genesis_32x(machine_config &config) SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer); m_32x->set_screen("megadriv"); + m_32x->add_route(0, "lspeaker", 1.00); + m_32x->add_route(1, "rspeaker", 1.00); subdevice("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console)); @@ -647,6 +649,8 @@ void md_cons_state::mdj_32x(machine_config &config) SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer); m_32x->set_screen("megadriv"); + m_32x->add_route(0, "lspeaker", 1.00); + m_32x->add_route(1, "rspeaker", 1.00); subdevice("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console)); @@ -680,6 +684,8 @@ void md_cons_state::md_32x(machine_config &config) SEGA_32X_PAL(config, m_32x, (MASTER_CLOCK_PAL * 3) / 7, m_maincpu, m_scan_timer); m_32x->set_screen("megadriv"); + m_32x->add_route(0, "lspeaker", 1.00); + m_32x->add_route(1, "rspeaker", 1.00); subdevice("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console)); diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 66f4e190b4f..1e3f687f712 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -3644,6 +3644,8 @@ void vgmplay_state::vgmplay(machine_config &config) /// TODO: rewrite to generate audio without using DAC devices SEGA_32X_NTSC(config, m_sega32x, 0, "sega32x_maincpu", "sega32x_scanline_timer"); + m_sega32x->add_route(0, "lspeaker", 1.00); + m_sega32x->add_route(1, "rspeaker", 1.00); auto& sega32x_maincpu(M68000(config, "sega32x_maincpu", 0)); sega32x_maincpu.set_disable(); diff --git a/src/mame/machine/mega32x.cpp b/src/mame/machine/mega32x.cpp index d1d65e80c3b..42e976beae6 100644 --- a/src/mame/machine/mega32x.cpp +++ b/src/mame/machine/mega32x.cpp @@ -225,6 +225,7 @@ DEFINE_DEVICE_TYPE(SEGA_32X_PAL, sega_32x_pal_device, "sega_32x_pal", "Sega 3 sega_32x_device::sega_32x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , device_palette_interface(mconfig, *this) + , device_sound_interface(mconfig, *this) , device_video_interface(mconfig, *this, false) , m_sh2_shared(*this, "sh2_shared") , m_main_cpu(*this, finder_base::DUMMY_TAG) @@ -233,6 +234,7 @@ sega_32x_device::sega_32x_device(const machine_config &mconfig, device_type type , m_ldac(*this, "ldac") , m_rdac(*this, "rdac") , m_scan_timer(*this, finder_base::DUMMY_TAG) + , m_stream(nullptr) { } @@ -827,6 +829,7 @@ TIMER_CALLBACK_MEMBER(sega_32x_device::handle_pwm_callback) { if (m_lch_size > 0) { + m_stream->update(); switch(m_pwm_ctrl & 3) { case 0: /*Speaker OFF*/ break; @@ -842,6 +845,7 @@ TIMER_CALLBACK_MEMBER(sega_32x_device::handle_pwm_callback) if (m_rch_size > 0) { + m_stream->update(); switch((m_pwm_ctrl & 0xc) >> 2) { case 0: /*Speaker OFF*/ break; @@ -935,6 +939,15 @@ WRITE16_MEMBER( sega_32x_device::m68k_pwm_w ) pwm_w(space,offset,data,mem_mask); } +void sega_32x_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +{ + for (int s = 0; s < samples; s++) + { + outputs[0][s] = inputs[0][s]; + outputs[1][s] = inputs[1][s]; + } +} + /**********************************************************************************************/ // 68k side a15180 // framebuffer control @@ -1706,8 +1719,8 @@ void sega_32x_ntsc_device::device_add_mconfig(machine_config &config) m_master_cpu->set_addrmap(AS_PROGRAM, &sega_32x_ntsc_device::sh2_main_map); m_slave_cpu->set_addrmap(AS_PROGRAM, &sega_32x_ntsc_device::sh2_slave_map); - DAC_12BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, ":lspeaker", 0.4); // unknown DAC - DAC_12BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, ":rspeaker", 0.4); // unknown DAC + DAC_12BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, *this, 0.4, 0); // unknown DAC + DAC_12BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, *this, 0.4, 1); // unknown DAC } void sega_32x_pal_device::device_add_mconfig(machine_config &config) @@ -1717,8 +1730,8 @@ void sega_32x_pal_device::device_add_mconfig(machine_config &config) m_master_cpu->set_addrmap(AS_PROGRAM, &sega_32x_pal_device::sh2_main_map); m_slave_cpu->set_addrmap(AS_PROGRAM, &sega_32x_pal_device::sh2_slave_map); - DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, ":lspeaker", 0.4); // unknown DAC - DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, ":rspeaker", 0.4); // unknown DAC + DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, *this, 0.4, 0); // unknown DAC + DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, *this, 0.4, 1); // unknown DAC } @@ -1733,6 +1746,7 @@ void sega_32x_device::device_start() set_pen_color(i, pal5bit(r), pal5bit(g), pal5bit(b)); } + m_stream = stream_alloc(2, 2, 48000 * 4); m_32x_pwm_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sega_32x_device::handle_pwm_callback), this)); m_32x_dram0 = std::make_unique(0x40000/2); diff --git a/src/mame/machine/mega32x.h b/src/mame/machine/mega32x.h index e88dcd41266..d6e80400b92 100644 --- a/src/mame/machine/mega32x.h +++ b/src/mame/machine/mega32x.h @@ -14,7 +14,7 @@ #include "emupal.h" #include "screen.h" -class sega_32x_device : public device_t, public device_palette_interface, public device_video_interface +class sega_32x_device : public device_t, public device_palette_interface, public device_sound_interface, public device_video_interface { public: void pause_cpu(); @@ -109,6 +109,9 @@ protected: // device_palette_interface overrides virtual uint32_t palette_entries() const override { return 32*32*32/**2*/; } + // device_sound_interface overrides + virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; + void update_total_scanlines(bool mode3) { m_total_scanlines = mode3 ? (m_base_total_scanlines * 2) : m_base_total_scanlines; } // this gets set at each EOF /* our main vblank handler resets this */ @@ -125,6 +128,7 @@ protected: int m_32x_240mode; uint16_t m_32x_a1518a_reg; + sound_stream *m_stream; TIMER_CALLBACK_MEMBER(handle_pwm_callback); void calculate_pwm_timer(); uint16_t m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg; -- cgit v1.2.3