diff options
Diffstat (limited to 'src/devices/sound/qsoundhle.cpp')
-rw-r--r-- | src/devices/sound/qsoundhle.cpp | 129 |
1 files changed, 60 insertions, 69 deletions
diff --git a/src/devices/sound/qsoundhle.cpp b/src/devices/sound/qsoundhle.cpp index 7cfe01391f4..f1f5684038e 100644 --- a/src/devices/sound/qsoundhle.cpp +++ b/src/devices/sound/qsoundhle.cpp @@ -42,7 +42,7 @@ ROM_END qsound_hle_device::qsound_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, QSOUND_HLE, tag, owner, clock) , device_sound_interface(mconfig, *this) - , device_rom_interface(mconfig, *this, 24) + , device_rom_interface(mconfig, *this) , m_stream(nullptr) , m_dsp_rom(*this, "dsp") , m_data_latch(0) @@ -50,10 +50,11 @@ qsound_hle_device::qsound_hle_device(const machine_config &mconfig, const char * } //------------------------------------------------- -// rom_bank_updated - the rom bank has changed +// rom_bank_pre_change - refresh the stream if the +// ROM banking changes //------------------------------------------------- -void qsound_hle_device::rom_bank_updated() +void qsound_hle_device::rom_bank_pre_change() { m_stream->update(); } @@ -70,29 +71,25 @@ void qsound_hle_device::device_start() // state save // PCM registers - for (int j = 0; j < 16; j++) // PCM voices - { - save_item(NAME(m_voice[j].m_bank), j); - save_item(NAME(m_voice[j].m_addr), j); - save_item(NAME(m_voice[j].m_phase), j); - save_item(NAME(m_voice[j].m_rate), j); - save_item(NAME(m_voice[j].m_loop_len), j); - save_item(NAME(m_voice[j].m_end_addr), j); - save_item(NAME(m_voice[j].m_volume), j); - save_item(NAME(m_voice[j].m_echo), j); - } - - for (int j = 0; j < 3; j++) // ADPCM voices - { - save_item(NAME(m_adpcm[j].m_start_addr), j); - save_item(NAME(m_adpcm[j].m_end_addr), j); - save_item(NAME(m_adpcm[j].m_bank), j); - save_item(NAME(m_adpcm[j].m_volume), j); - save_item(NAME(m_adpcm[j].m_flag), j); - save_item(NAME(m_adpcm[j].m_cur_vol), j); - save_item(NAME(m_adpcm[j].m_step_size), j); - save_item(NAME(m_adpcm[j].m_cur_addr), j); - } + // PCM voices + save_item(STRUCT_MEMBER(m_voice, m_bank)); + save_item(STRUCT_MEMBER(m_voice, m_addr)); + save_item(STRUCT_MEMBER(m_voice, m_phase)); + save_item(STRUCT_MEMBER(m_voice, m_rate)); + save_item(STRUCT_MEMBER(m_voice, m_loop_len)); + save_item(STRUCT_MEMBER(m_voice, m_end_addr)); + save_item(STRUCT_MEMBER(m_voice, m_volume)); + save_item(STRUCT_MEMBER(m_voice, m_echo)); + + // ADPCM voices + save_item(STRUCT_MEMBER(m_adpcm, m_start_addr)); + save_item(STRUCT_MEMBER(m_adpcm, m_end_addr)); + save_item(STRUCT_MEMBER(m_adpcm, m_bank)); + save_item(STRUCT_MEMBER(m_adpcm, m_volume)); + save_item(STRUCT_MEMBER(m_adpcm, m_flag)); + save_item(STRUCT_MEMBER(m_adpcm, m_cur_vol)); + save_item(STRUCT_MEMBER(m_adpcm, m_step_size)); + save_item(STRUCT_MEMBER(m_adpcm, m_cur_addr)); // PCM voices save_item(NAME(m_voice_pan)); @@ -105,32 +102,30 @@ void qsound_hle_device::device_start() save_item(NAME(m_echo.m_delay_line)); save_item(NAME(m_echo.m_delay_pos)); - for (int j = 0; j < 2; j++) // left, right - { - save_item(NAME(m_filter[j].m_tap_count), j); - save_item(NAME(m_filter[j].m_delay_pos), j); - save_item(NAME(m_filter[j].m_table_pos), j); - save_item(NAME(m_filter[j].m_taps), j); - save_item(NAME(m_filter[j].m_delay_line), j); - - save_item(NAME(m_alt_filter[j].m_tap_count), j); - save_item(NAME(m_alt_filter[j].m_delay_pos), j); - save_item(NAME(m_alt_filter[j].m_table_pos), j); - save_item(NAME(m_alt_filter[j].m_taps), j); - save_item(NAME(m_alt_filter[j].m_delay_line), j); - - save_item(NAME(m_wet[j].m_delay), j); - save_item(NAME(m_wet[j].m_volume), j); - save_item(NAME(m_wet[j].m_write_pos), j); - save_item(NAME(m_wet[j].m_read_pos), j); - save_item(NAME(m_wet[j].m_delay_line), j); - - save_item(NAME(m_dry[j].m_delay), j); - save_item(NAME(m_dry[j].m_volume), j); - save_item(NAME(m_dry[j].m_write_pos), j); - save_item(NAME(m_dry[j].m_read_pos), j); - save_item(NAME(m_dry[j].m_delay_line), j); - } + // left, right + save_item(STRUCT_MEMBER(m_filter, m_tap_count)); + save_item(STRUCT_MEMBER(m_filter, m_delay_pos)); + save_item(STRUCT_MEMBER(m_filter, m_table_pos)); + save_item(STRUCT_MEMBER(m_filter, m_taps)); + save_item(STRUCT_MEMBER(m_filter, m_delay_line)); + + save_item(STRUCT_MEMBER(m_alt_filter, m_tap_count)); + save_item(STRUCT_MEMBER(m_alt_filter, m_delay_pos)); + save_item(STRUCT_MEMBER(m_alt_filter, m_table_pos)); + save_item(STRUCT_MEMBER(m_alt_filter, m_taps)); + save_item(STRUCT_MEMBER(m_alt_filter, m_delay_line)); + + save_item(STRUCT_MEMBER(m_wet, m_delay)); + save_item(STRUCT_MEMBER(m_wet, m_volume)); + save_item(STRUCT_MEMBER(m_wet, m_write_pos)); + save_item(STRUCT_MEMBER(m_wet, m_read_pos)); + save_item(STRUCT_MEMBER(m_wet, m_delay_line)); + + save_item(STRUCT_MEMBER(m_dry, m_delay)); + save_item(STRUCT_MEMBER(m_dry, m_volume)); + save_item(STRUCT_MEMBER(m_dry, m_write_pos)); + save_item(STRUCT_MEMBER(m_dry, m_read_pos)); + save_item(STRUCT_MEMBER(m_dry, m_delay_line)); save_item(NAME(m_state)); save_item(NAME(m_next_state)); @@ -167,22 +162,18 @@ void qsound_hle_device::device_reset() // sound_stream_update - handle a stream update //------------------------------------------------- -void qsound_hle_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +void qsound_hle_device::sound_stream_update(sound_stream &stream) { - // Clear the buffers - std::fill_n(outputs[0], samples, 0); - std::fill_n(outputs[1], samples, 0); - - for (int i = 0; i < samples; i ++) + for (int i = 0; i < stream.samples(); i ++) { update_sample(); - outputs[0][i] = m_out[0]; - outputs[1][i] = m_out[1]; + stream.put_int(0, i, m_out[0], 32768); + stream.put_int(1, i, m_out[1], 32768); } } -WRITE8_MEMBER(qsound_hle_device::qsound_w) +void qsound_hle_device::qsound_w(offs_t offset, uint8_t data) { switch (offset) { @@ -206,7 +197,7 @@ WRITE8_MEMBER(qsound_hle_device::qsound_w) } -READ8_MEMBER(qsound_hle_device::qsound_r) +uint8_t qsound_hle_device::qsound_r() { // ready bit (0x00 = busy, 0x80 == ready) m_stream->update(); @@ -426,7 +417,7 @@ int16_t qsound_hle_device::qsound_voice::update(qsound_hle_device &dsp, int32_t if ((new_phase >> 12) >= m_end_addr) new_phase -= (m_loop_len << 12); - new_phase = std::min<int32_t>(std::max<int32_t>(new_phase, -0x8000000), 0x7FFFFFF); + new_phase = std::clamp<int32_t>(new_phase, -0x8000000, 0x7FFFFFF); m_addr = new_phase >> 12; m_phase = (new_phase << 4)&0xffff; @@ -475,10 +466,10 @@ int16_t qsound_hle_device::qsound_adpcm::update(qsound_hle_device &dsp, int16_t if (step <= 0) delta = -delta; delta += curr_sample; - delta = std::min<int32_t>(std::max<int32_t>(delta, -32768), 32767); + delta = std::clamp<int32_t>(delta, -32768, 32767); m_step_size = (dsp.read_dsp_rom(DATA_ADPCM_TAB + 8 + step) * m_step_size) >> 6; - m_step_size = std::min<int16_t>(std::max<int16_t>(m_step_size, 1), 2000); + m_step_size = std::clamp<int16_t>(m_step_size, 1, 2000); return (delta * m_cur_vol) >> 16; } @@ -514,7 +505,7 @@ void qsound_hle_device::state_normal_update() else m_echo.m_length = m_echo.m_end_pos - DELAY_BASE_OFFSET; - m_echo.m_length = std::min<int16_t>(std::max<int16_t>(m_echo.m_length, 0), 1024); + m_echo.m_length = std::clamp<int16_t>(m_echo.m_length, 0, 1024); // update PCM voices int32_t echo_input = 0; @@ -544,8 +535,8 @@ void qsound_hle_device::state_normal_update() wet -= (m_voice_output[i] * (int16_t)read_dsp_rom(pan_index + PAN_TABLE_WET)); } // Saturate accumulated voices - dry = (std::min<int32_t>(std::max<int32_t>(dry, -0x1fffffff), 0x1fffffff)) << 2; - wet = (std::min<int32_t>(std::max<int32_t>(wet, -0x1fffffff), 0x1fffffff)) << 2; + dry = std::clamp<int32_t>(dry, -0x1fffffff, 0x1fffffff) << 2; + wet = std::clamp<int32_t>(wet, -0x1fffffff, 0x1fffffff) << 2; // Apply FIR filter on 'wet' input wet = m_filter[ch].apply(wet >> 16); @@ -559,7 +550,7 @@ void qsound_hle_device::state_normal_update() // DSP round function output = (output + 0x2000) & ~0x3fff; - m_out[ch] = (std::min<int32_t>(std::max<int32_t>(output >> 14, -0x7fff), 0x7fff)); + m_out[ch] = std::clamp<int32_t>(output >> 14, -0x7fff, 0x7fff); if (m_delay_update) { |