summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2020-09-21 01:27:58 -0700
committer Aaron Giles <aaron@aarongiles.com>2020-09-21 01:27:58 -0700
commit4d72d362374a3e211762d96b818da4f894957ade (patch)
tree71dd2022c397b9e492f293890580967e96506029
parent467dc088eb1958fa1116f5ba98b879e07b31d727 (diff)
rf5c400/rf5c68/rolandpcm/git status
-rw-r--r--src/devices/sound/rf5c400.cpp20
-rw-r--r--src/devices/sound/rf5c400.h2
-rw-r--r--src/devices/sound/rf5c68.cpp51
-rw-r--r--src/devices/sound/rf5c68.h4
-rw-r--r--src/devices/sound/rolandpcm.cpp20
-rw-r--r--src/devices/sound/rolandpcm.h2
-rw-r--r--src/devices/sound/rp2c33_snd.h2
7 files changed, 51 insertions, 50 deletions
diff --git a/src/devices/sound/rf5c400.cpp b/src/devices/sound/rf5c400.cpp
index b8de150f7f6..7495e484540 100644
--- a/src/devices/sound/rf5c400.cpp
+++ b/src/devices/sound/rf5c400.cpp
@@ -180,7 +180,7 @@ void rf5c400_device::device_start()
save_item(STRUCT_MEMBER(m_channels, env_step));
save_item(STRUCT_MEMBER(m_channels, env_scale));
- m_stream = stream_alloc_legacy(0, 2, clock() / 384);
+ m_stream = stream_alloc(0, 2, clock() / 384);
}
//-------------------------------------------------
@@ -195,10 +195,10 @@ void rf5c400_device::device_clock_changed()
}
//-------------------------------------------------
-// sound_stream_update_legacy - handle a stream update
+// sound_stream_update - handle a stream update
//-------------------------------------------------
-void rf5c400_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples)
+void rf5c400_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
{
int i, ch;
uint64_t end, loop;
@@ -207,14 +207,14 @@ void rf5c400_device::sound_stream_update_legacy(sound_stream &stream, stream_sam
uint8_t env_phase;
double env_level, env_step, env_rstep;
- memset(outputs[0], 0, samples * sizeof(*outputs[0]));
- memset(outputs[1], 0, samples * sizeof(*outputs[1]));
+ outputs[0].fill(0);
+ outputs[1].fill(0);
for (ch=0; ch < 32; ch++)
{
rf5c400_channel *channel = &m_channels[ch];
- stream_sample_t *buf0 = outputs[0];
- stream_sample_t *buf1 = outputs[1];
+ auto &buf0 = outputs[0];
+ auto &buf1 = outputs[1];
// start = ((channel->startH & 0xFF00) << 8) | channel->startL;
end = ((channel->endHloopH & 0xFF) << 16) | channel->endL;
@@ -230,7 +230,7 @@ void rf5c400_device::sound_stream_update_legacy(sound_stream &stream, stream_sam
env_step = channel->env_step;
env_rstep = env_step * channel->env_scale;
- for (i=0; i < samples; i++)
+ for (i=0; i < buf0.samples(); i++)
{
int16_t tmp;
int32_t sample;
@@ -300,8 +300,8 @@ void rf5c400_device::sound_stream_update_legacy(sound_stream &stream, stream_sam
sample *= volume_table[vol];
sample = (sample >> 9) * env_level;
- *buf0++ += sample * pan_table[lvol];
- *buf1++ += sample * pan_table[rvol];
+ buf0.add_int(i, sample * pan_table[lvol], 32768);
+ buf1.add_int(i, sample * pan_table[rvol], 32768);
pos += channel->step;
if ((pos>>16) > end)
diff --git a/src/devices/sound/rf5c400.h b/src/devices/sound/rf5c400.h
index fdd82910b76..6e729daad0a 100644
--- a/src/devices/sound/rf5c400.h
+++ b/src/devices/sound/rf5c400.h
@@ -34,7 +34,7 @@ protected:
virtual void device_clock_changed() override;
// sound stream update overrides
- virtual void sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) override;
+ virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
// device_rom_interface overrides
virtual void rom_bank_updated() override;
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);
}
}
diff --git a/src/devices/sound/rf5c68.h b/src/devices/sound/rf5c68.h
index 4a1d465e291..d78f378faaf 100644
--- a/src/devices/sound/rf5c68.h
+++ b/src/devices/sound/rf5c68.h
@@ -45,7 +45,7 @@ protected:
virtual void device_clock_changed() override;
// sound stream update overrides
- virtual void sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) override;
+ virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
// device_memory_interface configuration
virtual space_config_vector memory_space_config() const override;
@@ -75,6 +75,8 @@ private:
u16 m_wbank;
u8 m_enable;
int m_output_bits;
+ std::vector<s32> m_mixleft;
+ std::vector<s32> m_mixright;
sample_end_cb_delegate m_sample_end_cb;
};
diff --git a/src/devices/sound/rolandpcm.cpp b/src/devices/sound/rolandpcm.cpp
index 4916605dd7e..d3393785f88 100644
--- a/src/devices/sound/rolandpcm.cpp
+++ b/src/devices/sound/rolandpcm.cpp
@@ -61,7 +61,7 @@ void mb87419_mb87420_device::device_start()
m_clock = clock() / 2;
m_rate = m_clock / 512; // usually 32 KHz
- m_stream = stream_alloc_legacy(0, 2, m_rate);
+ m_stream = stream_alloc(0, 2, m_rate);
logerror("Roland PCM: Clock %u, Rate %u\n", m_clock, m_rate);
}
@@ -266,29 +266,29 @@ void mb87419_mb87420_device::write(offs_t offset, u8 data)
}
//-------------------------------------------------
-// sound_stream_update_legacy - handle a stream update
+// sound_stream_update - handle a stream update
//-------------------------------------------------
-void mb87419_mb87420_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples)
+void mb87419_mb87420_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
{
- memset(outputs[0], 0, samples * sizeof(stream_sample_t));
- memset(outputs[1], 0, samples * sizeof(stream_sample_t));
+ outputs[0].fill(0);
+ outputs[1].fill(0);
for (auto& chn : m_chns)
{
if (! chn.enable || chn.play_dir == 0)
continue;
- for (int smpl = 0; smpl < samples; smpl ++)
+ for (int smpl = 0; smpl < outputs[0].samples(); smpl ++)
{
- stream_sample_t smp_data;
+ s32 smp_data;
if (chn.play_dir > 0)
smp_data = sample_interpolate(chn.smpl_cur, chn.smpl_nxt, chn.addr & 0x3FFF);
else
smp_data = sample_interpolate(chn.smpl_nxt, chn.smpl_cur, chn.addr & 0x3FFF);
- smp_data = (smp_data * chn.volume) >> 14; // >>14 results in a good overall volume
- outputs[0][smpl] += smp_data;
- outputs[1][smpl] += smp_data;
+ smp_data = smp_data * chn.volume;
+ outputs[0].add_int(smpl, smp_data, 32768 << 14); // >>14 results in a good overall volume
+ outputs[1].add_int(smpl, smp_data, 32768 << 14);
uint32_t old_addr = chn.addr;
if (chn.play_dir > 0)
diff --git a/src/devices/sound/rolandpcm.h b/src/devices/sound/rolandpcm.h
index 5d1e814d517..1c77be39b98 100644
--- a/src/devices/sound/rolandpcm.h
+++ b/src/devices/sound/rolandpcm.h
@@ -24,7 +24,7 @@ protected:
virtual void device_reset() override;
// sound stream update overrides
- virtual void sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) override;
+ virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
// device_rom_interface overrides
virtual void rom_bank_updated() override;
diff --git a/src/devices/sound/rp2c33_snd.h b/src/devices/sound/rp2c33_snd.h
index 73b737409c2..bdb32e58f60 100644
--- a/src/devices/sound/rp2c33_snd.h
+++ b/src/devices/sound/rp2c33_snd.h
@@ -43,7 +43,7 @@ protected:
virtual void device_clock_changed() override;
// sound stream update overrides
- virtual void sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) override;
+ virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
private:
sound_stream *m_stream = nullptr;