diff options
Diffstat (limited to 'src/devices/sound/rf5c68.cpp')
-rw-r--r-- | src/devices/sound/rf5c68.cpp | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/src/devices/sound/rf5c68.cpp b/src/devices/sound/rf5c68.cpp index 1c00941000b..f91e370b95f 100644 --- a/src/devices/sound/rf5c68.cpp +++ b/src/devices/sound/rf5c68.cpp @@ -81,7 +81,7 @@ void rf5c68_device::device_start() m_sample_end_cb.resolve(); /* allocate the stream */ - m_stream = stream_alloc_legacy(0, 2, clock() / 384); + m_stream = stream_alloc(0, 2, clock() / 384); save_item(STRUCT_MEMBER(m_chan, enable)); save_item(STRUCT_MEMBER(m_chan, env)); @@ -116,21 +116,29 @@ device_memory_interface::space_config_vector rf5c68_device::memory_space_config( } //------------------------------------------------- -// sound_stream_update_legacy - handle a stream update +// sound_stream_update - handle a stream update //------------------------------------------------- -void rf5c68_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void rf5c68_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { - stream_sample_t *left = outputs[0]; - stream_sample_t *right = outputs[1]; - - /* start with clean buffers */ - memset(left, 0, samples * sizeof(*left)); - memset(right, 0, samples * sizeof(*right)); + auto &left = outputs[0]; + auto &right = outputs[1]; /* bail if not enabled */ if (!m_enable) + { + left.fill(0); + right.fill(0); return; + } + + if (m_mixleft.size() < left.samples()) + m_mixleft.resize(left.samples()); + if (m_mixright.size() < right.samples()) + m_mixright.resize(right.samples()); + + std::fill_n(&m_mixleft[0], left.samples(), 0); + std::fill_n(&m_mixright[0], right.samples(), 0); /* loop over channels */ for (pcm_channel &chan : m_chan) @@ -142,7 +150,7 @@ void rf5c68_device::sound_stream_update_legacy(sound_stream &stream, stream_samp int rv = ((chan.pan >> 4) & 0x0f) * chan.env; /* loop over the sample buffer */ - for (int j = 0; j < samples; j++) + for (int j = 0; j < left.samples(); j++) { int sample; @@ -170,13 +178,13 @@ void rf5c68_device::sound_stream_update_legacy(sound_stream &stream, stream_samp if (sample & 0x80) { sample &= 0x7f; - left[j] += (sample * lv) >> 5; - right[j] += (sample * rv) >> 5; + m_mixleft[j] += (sample * lv) >> 5; + m_mixright[j] += (sample * rv) >> 5; } else { - left[j] -= (sample * lv) >> 5; - right[j] -= (sample * rv) >> 5; + m_mixleft[j] -= (sample * lv) >> 5; + m_mixright[j] -= (sample * rv) >> 5; } } } @@ -188,19 +196,10 @@ void rf5c68_device::sound_stream_update_legacy(sound_stream &stream, stream_samp */ const u8 output_shift = (m_output_bits > 16) ? 0 : (16 - m_output_bits); const s32 output_nandmask = (1 << output_shift) - 1; - for (int j = 0; j < samples; j++) + for (int j = 0; j < left.samples(); j++) { - stream_sample_t temp; - - temp = left[j]; - if (temp > 32767) temp = 32767; - else if (temp < -32768) temp = -32768; - left[j] = temp & ~output_nandmask; - - temp = right[j]; - if (temp > 32767) temp = 32767; - else if (temp < -32768) temp = -32768; - right[j] = temp & ~output_nandmask; + left.put_int_clamp(j, m_mixleft[j] & ~output_nandmask, 32768); + right.put_int_clamp(j, m_mixright[j] & ~output_nandmask, 32768); } } |