summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/rf5c68.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/rf5c68.cpp')
-rw-r--r--src/devices/sound/rf5c68.cpp47
1 files changed, 23 insertions, 24 deletions
diff --git a/src/devices/sound/rf5c68.cpp b/src/devices/sound/rf5c68.cpp
index adb544afc64..f91e370b95f 100644
--- a/src/devices/sound/rf5c68.cpp
+++ b/src/devices/sound/rf5c68.cpp
@@ -119,18 +119,26 @@ device_memory_interface::space_config_vector rf5c68_device::memory_space_config(
// sound_stream_update - handle a stream update
//-------------------------------------------------
-void rf5c68_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **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(sound_stream &stream, stream_sample_t **
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(sound_stream &stream, stream_sample_t **
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(sound_stream &stream, stream_sample_t **
*/
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);
}
}