diff options
author | 2020-09-21 01:27:58 -0700 | |
---|---|---|
committer | 2020-09-21 01:27:58 -0700 | |
commit | 4d72d362374a3e211762d96b818da4f894957ade (patch) | |
tree | 71dd2022c397b9e492f293890580967e96506029 | |
parent | 467dc088eb1958fa1116f5ba98b879e07b31d727 (diff) |
rf5c400/rf5c68/rolandpcm/git status
-rw-r--r-- | src/devices/sound/rf5c400.cpp | 20 | ||||
-rw-r--r-- | src/devices/sound/rf5c400.h | 2 | ||||
-rw-r--r-- | src/devices/sound/rf5c68.cpp | 51 | ||||
-rw-r--r-- | src/devices/sound/rf5c68.h | 4 | ||||
-rw-r--r-- | src/devices/sound/rolandpcm.cpp | 20 | ||||
-rw-r--r-- | src/devices/sound/rolandpcm.h | 2 | ||||
-rw-r--r-- | src/devices/sound/rp2c33_snd.h | 2 |
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; |