diff options
author | 2025-02-22 17:49:08 +0100 | |
---|---|---|
committer | 2025-02-22 17:49:18 +0100 | |
commit | 4f7ed89eceaaec4a809b679d51dc76fa9bb285d0 (patch) | |
tree | 86697f0680b2d8a480e9bc37e759f4279025443c | |
parent | f55e7d697c7cd7f988b3220f476fb735476252be (diff) |
tc0060dca: make stream alloc adaptive, make chip stereo, and do table lookup at write instead of at stream update
-rw-r--r-- | src/mame/taito/opwolf.cpp | 28 | ||||
-rwxr-xr-x | src/mame/taito/tc0060dca.cpp | 31 | ||||
-rwxr-xr-x | src/mame/taito/tc0060dca.h | 6 |
3 files changed, 33 insertions, 32 deletions
diff --git a/src/mame/taito/opwolf.cpp b/src/mame/taito/opwolf.cpp index 397d7640f16..101af3ca61e 100644 --- a/src/mame/taito/opwolf.cpp +++ b/src/mame/taito/opwolf.cpp @@ -758,7 +758,7 @@ void opwolf_state::opwolf_adpcm_b_w(offs_t offset, uint8_t data) m_adpcm_pos[0] = start; m_adpcm_end[0] = end; m_msm[0]->reset_w(0); - m_tc0060dca[0]->set_level(m_adpcm_b[5]); + m_tc0060dca[0]->level_w(3, m_adpcm_b[5]); //logerror("TRIGGER MSM1\n"); } @@ -781,7 +781,7 @@ void opwolf_state::opwolf_adpcm_c_w(offs_t offset, uint8_t data) m_adpcm_pos[1] = start; m_adpcm_end[1] = end; m_msm[1]->reset_w(0); - m_tc0060dca[1]->set_level(m_adpcm_c[5]); + m_tc0060dca[1]->level_w(3, m_adpcm_c[5]); //logerror("TRIGGER MSM2\n"); } @@ -934,9 +934,9 @@ void opwolf_state::opwolf(machine_config &config) ymsnd.add_route(0, "lspeaker", 1.0); ymsnd.add_route(1, "rspeaker", 1.0); - TC0060DCA(config, m_tc0060dca[0], 384000); - m_tc0060dca[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_tc0060dca[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + TC0060DCA(config, m_tc0060dca[0]); + m_tc0060dca[0]->add_route(0, "lspeaker", 1.0); + m_tc0060dca[0]->add_route(1, "rspeaker", 1.0); MSM5205(config, m_msm[0], 384000); m_msm[0]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<0>)); @@ -944,9 +944,9 @@ void opwolf_state::opwolf(machine_config &config) m_msm[0]->add_route(ALL_OUTPUTS, m_tc0060dca[0], 1.0); m_msm[0]->add_route(ALL_OUTPUTS, m_tc0060dca[0], 1.0); - TC0060DCA(config, m_tc0060dca[1], 384000); - m_tc0060dca[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_tc0060dca[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + TC0060DCA(config, m_tc0060dca[1]); + m_tc0060dca[1]->add_route(0, "lspeaker", 1.0); + m_tc0060dca[1]->add_route(1, "rspeaker", 1.0); MSM5205(config, m_msm[1], 384000); m_msm[1]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<1>)); @@ -1013,9 +1013,9 @@ void opwolf_state::opwolfb(machine_config &config) /* OSC clocks unknown for the ymsnd.add_route(0, "lspeaker", 1.0); ymsnd.add_route(1, "rspeaker", 1.0); - TC0060DCA(config, m_tc0060dca[0], 384000); - m_tc0060dca[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_tc0060dca[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + TC0060DCA(config, m_tc0060dca[0]); + m_tc0060dca[0]->add_route(0, "lspeaker", 1.0); + m_tc0060dca[0]->add_route(1, "rspeaker", 1.0); MSM5205(config, m_msm[0], 384000); m_msm[0]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<0>)); @@ -1023,9 +1023,9 @@ void opwolf_state::opwolfb(machine_config &config) /* OSC clocks unknown for the m_msm[0]->add_route(ALL_OUTPUTS, m_tc0060dca[0], 1.0); m_msm[0]->add_route(ALL_OUTPUTS, m_tc0060dca[0], 1.0); - TC0060DCA(config, m_tc0060dca[1], 384000); - m_tc0060dca[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_tc0060dca[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + TC0060DCA(config, m_tc0060dca[1]); + m_tc0060dca[1]->add_route(0, "lspeaker", 1.0); + m_tc0060dca[1]->add_route(1, "rspeaker", 1.0); MSM5205(config, m_msm[1], 384000); m_msm[1]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<1>)); diff --git a/src/mame/taito/tc0060dca.cpp b/src/mame/taito/tc0060dca.cpp index b90a9f09131..7e47d4fbc15 100755 --- a/src/mame/taito/tc0060dca.cpp +++ b/src/mame/taito/tc0060dca.cpp @@ -2,7 +2,7 @@ // copyright-holders:R. Belmont /*************************************************************************** - tc0060dca.cpp - Taito TC0060DCA programmable volume control + tc0060dca.cpp - Taito TC0060DCA stereo programmable volume control Emulation by R. Belmont, volume curve measured by Stephen Leary ***************************************************************************/ @@ -12,43 +12,44 @@ #include <cmath> -DEFINE_DEVICE_TYPE(TC0060DCA, tc0060dca_device, "tc0060dca", "Taito TC0060DCA programmable volume control") +DEFINE_DEVICE_TYPE(TC0060DCA, tc0060dca_device, "tc0060dca", "Taito TC0060DCA") tc0060dca_device::tc0060dca_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, TC0060DCA, tag, owner, clock), device_sound_interface(mconfig, *this), - m_stream(nullptr), - m_level(0) + m_stream(nullptr) { } -void tc0060dca_device::set_level(u8 level) +void tc0060dca_device::level_w(offs_t offset, u8 data) { m_stream->update(); - m_level = level; + + for (int i = 0; i < 2; i++) + { + if (BIT(offset, i)) + m_gain[i] = m_atten_table[data]; + } } void tc0060dca_device::device_start() { - m_stream = stream_alloc(8, 2, clock(), STREAM_DEFAULT_FLAGS); + m_stream = stream_alloc(2, 2, SAMPLE_RATE_OUTPUT_ADAPTIVE); for (int x = 0; x < 256; x++) - { m_atten_table[x] = 1.0 / (1.0 + exp(-10 * ((x / 256.0) - 0.6))); - } - save_item(NAME(m_level)); + m_gain[0] = m_gain[1] = m_atten_table[0xff]; + save_item(NAME(m_gain)); } void tc0060dca_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { - for (int i = 0; i < inputs[0].samples(); i++) + for (int i = 0; i < outputs[0].samples(); i++) { const stream_buffer::sample_t l = inputs[0].get(i); const stream_buffer::sample_t r = inputs[1].get(i); - outputs[0].put(i, l * m_atten_table[m_level]); - outputs[1].put(i, r * m_atten_table[m_level]); + outputs[0].put(i, l * m_gain[0]); + outputs[1].put(i, r * m_gain[1]); } } - - diff --git a/src/mame/taito/tc0060dca.h b/src/mame/taito/tc0060dca.h index 0cbfefc9a58..96e20fd799f 100755 --- a/src/mame/taito/tc0060dca.h +++ b/src/mame/taito/tc0060dca.h @@ -8,9 +8,9 @@ class tc0060dca_device : public device_t, public device_sound_interface { public: - tc0060dca_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + tc0060dca_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); - void set_level(u8 level); + void level_w(offs_t offset, u8 data); protected: // device_t override @@ -21,7 +21,7 @@ protected: private: sound_stream *m_stream; - u8 m_level; + float m_gain[2]; float m_atten_table[256]; }; |