diff options
author | Aaron Giles <aaron@aarongiles.com> | 2020-09-19 13:40:05 -0700 |
---|---|---|
committer | Aaron Giles <aaron@aarongiles.com> | 2020-09-19 13:40:05 -0700 |
commit | c9399d2377c6c21e123d76f538d131928dc71c9e (patch) | |
tree | fad510cbb1cc833f680164f07acc1356716e37b7 /src/devices/sound | |
parent | fdf35fe86bf382fae1a5d4b9b3011d3085bdfa7b (diff) |
la7a1045/lmc1992/mas3507d/mea8000/mos6560/mos6581/mos7360/msm5232/multipcm: update to new stream callbacks
Diffstat (limited to 'src/devices/sound')
-rw-r--r-- | src/devices/sound/esqpump.cpp | 3 | ||||
-rw-r--r-- | src/devices/sound/l7a1045_l6028_dsp_a.cpp | 17 | ||||
-rw-r--r-- | src/devices/sound/l7a1045_l6028_dsp_a.h | 2 | ||||
-rw-r--r-- | src/devices/sound/lmc1992.cpp | 2 | ||||
-rw-r--r-- | src/devices/sound/lmc1992.h | 2 | ||||
-rw-r--r-- | src/devices/sound/mas3507d.cpp | 27 | ||||
-rw-r--r-- | src/devices/sound/mas3507d.h | 4 | ||||
-rw-r--r-- | src/devices/sound/mea8000.cpp | 9 | ||||
-rw-r--r-- | src/devices/sound/mea8000.h | 4 | ||||
-rw-r--r-- | src/devices/sound/mos6560.cpp | 36 | ||||
-rw-r--r-- | src/devices/sound/mos6560.h | 6 | ||||
-rw-r--r-- | src/devices/sound/mos6581.cpp | 6 | ||||
-rw-r--r-- | src/devices/sound/mos6581.h | 2 | ||||
-rw-r--r-- | src/devices/sound/mos7360.cpp | 13 | ||||
-rw-r--r-- | src/devices/sound/mos7360.h | 2 | ||||
-rw-r--r-- | src/devices/sound/msm5232.cpp | 53 | ||||
-rw-r--r-- | src/devices/sound/msm5232.h | 2 | ||||
-rw-r--r-- | src/devices/sound/multipcm.cpp | 31 | ||||
-rw-r--r-- | src/devices/sound/multipcm.h | 4 | ||||
-rw-r--r-- | src/devices/sound/sid.cpp | 42 | ||||
-rw-r--r-- | src/devices/sound/sid.h | 2 |
21 files changed, 113 insertions, 156 deletions
diff --git a/src/devices/sound/esqpump.cpp b/src/devices/sound/esqpump.cpp index 110508f87b7..bf34520869f 100644 --- a/src/devices/sound/esqpump.cpp +++ b/src/devices/sound/esqpump.cpp @@ -22,9 +22,6 @@ esq_5505_5510_pump_device::esq_5505_5510_pump_device(const machine_config &mconf , ticks_spent_processing(0) , samples_processed(0) { -#if !PUMP_FAKE_ESP_PROCESSING && PUMP_REPLACE_ESP_PROGRAM - e = nullptr; -#endif } void esq_5505_5510_pump_device::device_start() diff --git a/src/devices/sound/l7a1045_l6028_dsp_a.cpp b/src/devices/sound/l7a1045_l6028_dsp_a.cpp index 280d12a20d9..16c45121378 100644 --- a/src/devices/sound/l7a1045_l6028_dsp_a.cpp +++ b/src/devices/sound/l7a1045_l6028_dsp_a.cpp @@ -117,7 +117,7 @@ l7a1045_sound_device::l7a1045_sound_device(const machine_config &mconfig, const void l7a1045_sound_device::device_start() { /* Allocate the stream */ - m_stream = stream_alloc_legacy(0, 2, 66150); //clock() / 384); + m_stream = stream_alloc(0, 2, 66150); //clock() / 384); for (int voice = 0; voice < 32; voice++) { @@ -143,15 +143,16 @@ void l7a1045_sound_device::device_start() //------------------------------------------------- -// sound_stream_update_legacy - handle a stream update +// sound_stream_update - handle a stream update //------------------------------------------------- -void l7a1045_sound_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void l7a1045_sound_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { /* Clear the buffers */ - memset(outputs[0], 0, samples*sizeof(*outputs[0])); - memset(outputs[1], 0, samples*sizeof(*outputs[1])); + outputs[0].fill(0); + outputs[1].fill(0); + constexpr stream_buffer::sample_t sample_scale = 1.0 / (32768.0 * 512.0); for (int i = 0; i < 32; i++) { if (m_key & (1 << i)) @@ -165,7 +166,7 @@ void l7a1045_sound_device::sound_stream_update_legacy(sound_stream &stream, stre uint32_t pos = vptr->pos; uint32_t frac = vptr->frac; - for (int j = 0; j < samples; j++) + for (int j = 0; j < outputs[0].samples(); j++) { int32_t sample; uint8_t data; @@ -192,8 +193,8 @@ void l7a1045_sound_device::sound_stream_update_legacy(sound_stream &stream, stre sample = ((int8_t)(data & 0xfc)) << (3 - (data & 3)); frac += step; - outputs[0][j] += ((sample * vptr->l_volume) >> 9); - outputs[1][j] += ((sample * vptr->r_volume) >> 9); + outputs[0].add(j, stream_buffer::sample_t(sample * vptr->l_volume) * sample_scale); + outputs[1].add(j, stream_buffer::sample_t(sample * vptr->r_volume) * sample_scale); } vptr->pos = pos; diff --git a/src/devices/sound/l7a1045_l6028_dsp_a.h b/src/devices/sound/l7a1045_l6028_dsp_a.h index bc9c3b5d500..542b6aad386 100644 --- a/src/devices/sound/l7a1045_l6028_dsp_a.h +++ b/src/devices/sound/l7a1045_l6028_dsp_a.h @@ -33,7 +33,7 @@ protected: virtual void device_start() 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: struct l7a1045_voice diff --git a/src/devices/sound/lmc1992.cpp b/src/devices/sound/lmc1992.cpp index ad412395d9d..25da0ac327d 100644 --- a/src/devices/sound/lmc1992.cpp +++ b/src/devices/sound/lmc1992.cpp @@ -175,7 +175,7 @@ void lmc1992_device::device_start() // our sound stream //------------------------------------------------- -void lmc1992_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void lmc1992_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { } diff --git a/src/devices/sound/lmc1992.h b/src/devices/sound/lmc1992.h index cfaffc1f13f..beb893d9983 100644 --- a/src/devices/sound/lmc1992.h +++ b/src/devices/sound/lmc1992.h @@ -71,7 +71,7 @@ protected: virtual void device_start() override; // internal callbacks - 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: inline void execute_command(int addr, int data); diff --git a/src/devices/sound/mas3507d.cpp b/src/devices/sound/mas3507d.cpp index 641ec52a06e..b024b6408cd 100644 --- a/src/devices/sound/mas3507d.cpp +++ b/src/devices/sound/mas3507d.cpp @@ -29,7 +29,7 @@ mas3507d_device::mas3507d_device(const machine_config &mconfig, const char *tag, void mas3507d_device::device_start() { current_rate = 44100; - stream = stream_alloc_legacy(0, 2, current_rate); + stream = stream_alloc(0, 2, current_rate); cb_sample.resolve(); } @@ -359,27 +359,25 @@ void mas3507d_device::fill_buffer() } } -void mas3507d_device::append_buffer(stream_sample_t * const *outputs, int &pos, int scount) +void mas3507d_device::append_buffer(std::vector<write_stream_view> &outputs, int &pos, int scount) { - if(!sample_count) - return; - buffered_frame_count = scount; int s1 = scount - pos; if(s1 > sample_count) s1 = sample_count; + constexpr stream_buffer::sample_t sample_scale = 1.0 / 32768.0; if(mp3_info.channels == 1) { for(int i=0; i<s1; i++) { - stream_sample_t v = samples[i]; - outputs[0][i+pos] = v; - outputs[1][i+pos] = v; + stream_buffer::sample_t v = stream_buffer::sample_t(samples[i]) * sample_scale; + outputs[0].put(i+pos, v); + outputs[1].put(i+pos, v); } } else { for(int i=0; i<s1; i++) { - outputs[0][i+pos] = samples[i*2]; - outputs[1][i+pos] = samples[i*2+1]; + outputs[0].put(i+pos, stream_buffer::sample_t(samples[i*2]) * sample_scale); + outputs[1].put(i+pos, stream_buffer::sample_t(samples[i*2+1]) * sample_scale); } } @@ -400,8 +398,9 @@ void mas3507d_device::append_buffer(stream_sample_t * const *outputs, int &pos, total_frame_count += s1; } -void mas3507d_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int csamples) +void mas3507d_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { + int csamples = outputs[0].samples(); int pos = 0; append_buffer(outputs, pos, csamples); @@ -419,10 +418,8 @@ void mas3507d_device::sound_stream_update_legacy(sound_stream &stream, stream_sa total_frame_count = 0; buffered_frame_count = 0; - for(int i=pos; i != csamples; i++) { - outputs[0][i] = 0; - outputs[1][i] = 0; - } + outputs[0].fill(0, pos); + outputs[1].fill(0, pos); return; } append_buffer(outputs, pos, csamples); diff --git a/src/devices/sound/mas3507d.h b/src/devices/sound/mas3507d.h index 31410fa576e..b04e157e2f2 100644 --- a/src/devices/sound/mas3507d.h +++ b/src/devices/sound/mas3507d.h @@ -27,7 +27,7 @@ public: protected: virtual void device_start() override; virtual void device_reset() override; - 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: devcb_read16 cb_sample; @@ -63,7 +63,7 @@ private: void reg_write(uint32_t adr, uint32_t val); void fill_buffer(); - void append_buffer(stream_sample_t * const *outputs, int &pos, int samples); + void append_buffer(std::vector<write_stream_view> &outputs, int &pos, int samples); }; diff --git a/src/devices/sound/mea8000.cpp b/src/devices/sound/mea8000.cpp index 4f7fbc453ac..3cf2ad51a6e 100644 --- a/src/devices/sound/mea8000.cpp +++ b/src/devices/sound/mea8000.cpp @@ -134,7 +134,7 @@ void mea8000_device::device_start() init_tables(); - m_stream = stream_alloc_legacy(0, 1, clock() / 60); + m_stream = stream_alloc(0, 1, clock() / 60); save_item(NAME(m_output)); m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mea8000_device::timer_expire),this)); @@ -422,12 +422,9 @@ void mea8000_device::stop_frame() -void mea8000_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void mea8000_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { - for (int samp = 0; samp < samples; samp++) - { - outputs[0][samp] = m_output; - } + outputs[0].fill(stream_buffer::sample_t(m_output) * (1.0 / 32768.0)); } /* next sample in frame, sampling at 64 kHz */ diff --git a/src/devices/sound/mea8000.h b/src/devices/sound/mea8000.h index 14cb0384d09..7538bffa62c 100644 --- a/src/devices/sound/mea8000.h +++ b/src/devices/sound/mea8000.h @@ -29,7 +29,7 @@ public: protected: // device-level overrides virtual void device_start() override; - 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: /* filter coefficients from frequencies */ @@ -111,7 +111,7 @@ private: emu_timer *m_timer = nullptr; sound_stream * m_stream = nullptr; - stream_sample_t m_output = 0; + int32_t m_output = 0; int m_cos_table[TABLE_LEN]; /* fm => cos coefficient */ int m_exp_table[TABLE_LEN]; /* bw => exp coefficient */ diff --git a/src/devices/sound/mos6560.cpp b/src/devices/sound/mos6560.cpp index 05ab0bcd08e..8522a9b8b6d 100644 --- a/src/devices/sound/mos6560.cpp +++ b/src/devices/sound/mos6560.cpp @@ -622,11 +622,11 @@ void mos6560_device::sound_start() { int i; - m_channel = stream_alloc_legacy(0, 1, machine().sample_rate()); + m_channel = stream_alloc(0, 1, machine().sample_rate()); /* buffer for fastest played sample for 5 second so we have enough data for min 5 second */ m_noisesize = NOISE_FREQUENCY_MAX * NOISE_BUFFER_SIZE_SEC; - m_noise = std::make_unique<int8_t[]>(m_noisesize); + m_noise.resize(m_noisesize); { int noiseshift = 0x7ffff8; char data; @@ -661,17 +661,13 @@ void mos6560_device::sound_start() if (m_tonesize > 0) { - m_tone = std::make_unique<int16_t[]>(m_tonesize); + m_tone.resize(m_tonesize); for (i = 0; i < m_tonesize; i++) { m_tone[i] = (int16_t)(sin (2 * M_PI * i / m_tonesize) * 127 + 0.5); } } - else - { - m_tone = nullptr; - } } @@ -891,12 +887,13 @@ void mos6560_device::device_timer(emu_timer &timer, device_timer_id id, int para // sound_stream_update_legacy - handle a stream update //------------------------------------------------- -void mos6560_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void mos6560_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { int i, v; - stream_sample_t *buffer = outputs[0]; + auto &buffer = outputs[0]; - for (i = 0; i < samples; i++) + constexpr stream_buffer::sample_t sample_scale = 1.0 / 8192.0; + for (i = 0; i < buffer.samples(); i++) { v = 0; if (TONE1_ON /*||(m_tone1pos != 0) */ ) @@ -909,7 +906,7 @@ void mos6560_device::sound_stream_update_legacy(sound_stream &stream, stream_sam if (m_tone1pos >= m_tone1samples) { m_tone1pos = 0; - m_tone1samples = machine().sample_rate() / TONE1_FREQUENCY; + m_tone1samples = buffer.sample_rate() / TONE1_FREQUENCY; if (m_tone1samples == 0) m_tone1samples = 1; } @@ -925,7 +922,7 @@ void mos6560_device::sound_stream_update_legacy(sound_stream &stream, stream_sam if (m_tone2pos >= m_tone2samples) { m_tone2pos = 0; - m_tone2samples = machine().sample_rate() / TONE2_FREQUENCY; + m_tone2samples = buffer.sample_rate() / TONE2_FREQUENCY; if (m_tone2samples == 0) m_tone2samples = 1; } @@ -941,7 +938,7 @@ void mos6560_device::sound_stream_update_legacy(sound_stream &stream, stream_sam if (m_tone3pos >= m_tone3samples) { m_tone3pos = 0; - m_tone3samples = machine().sample_rate() / TONE3_FREQUENCY; + m_tone3samples = buffer.sample_rate() / TONE3_FREQUENCY; if (m_tone3samples == 0) m_tone3samples = 1; } @@ -956,12 +953,11 @@ void mos6560_device::sound_stream_update_legacy(sound_stream &stream, stream_sam m_noisepos = 0; } } - v = (v * VOLUME) << 2; - if (v > 32767) - buffer[i] = 32767; - else if (v < -32767) - buffer[i] = -32767; - else - buffer[i] = v; + v *= VOLUME; + if (v > 8191) + v = 8191; + else if (v < -8191) + v = -8191; + buffer.put(i, stream_buffer::sample_t(v) * sample_scale); } } diff --git a/src/devices/sound/mos6560.h b/src/devices/sound/mos6560.h index cf657255198..6937fdf4eac 100644 --- a/src/devices/sound/mos6560.h +++ b/src/devices/sound/mos6560.h @@ -124,7 +124,7 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) 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; inline uint8_t read_videoram(offs_t offset); inline uint8_t read_colorram(offs_t offset); @@ -176,8 +176,8 @@ protected: m_noisesamples; /* count of samples to give out per tone */ sound_stream *m_channel; - std::unique_ptr<int16_t[]> m_tone; - std::unique_ptr<int8_t[]> m_noise; + std::vector<int16_t> m_tone; + std::vector<int8_t> m_noise; emu_timer *m_line_timer; }; diff --git a/src/devices/sound/mos6581.cpp b/src/devices/sound/mos6581.cpp index 2fe073a1347..0870631ad47 100644 --- a/src/devices/sound/mos6581.cpp +++ b/src/devices/sound/mos6581.cpp @@ -199,7 +199,7 @@ void mos6581_device::device_start() m_read_poty.resolve_safe(0xff); // create sound stream - m_stream = stream_alloc_legacy(0, 1, machine().sample_rate()); + m_stream = stream_alloc(0, 1, machine().sample_rate()); // initialize SID engine m_token->device = this; @@ -239,9 +239,9 @@ void mos6581_device::device_post_load() // our sound stream //------------------------------------------------- -void mos6581_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void mos6581_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { - m_token->fill_buffer(outputs[0], samples); + m_token->fill_buffer(outputs[0]); } diff --git a/src/devices/sound/mos6581.h b/src/devices/sound/mos6581.h index 47e5959ef41..de05db489d3 100644 --- a/src/devices/sound/mos6581.h +++ b/src/devices/sound/mos6581.h @@ -65,7 +65,7 @@ protected: virtual void device_post_load() override; // device_sound_interface 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; void save_state(SID6581_t *token); private: diff --git a/src/devices/sound/mos7360.cpp b/src/devices/sound/mos7360.cpp index 9105fd656e3..3ca5e48ef8f 100644 --- a/src/devices/sound/mos7360.cpp +++ b/src/devices/sound/mos7360.cpp @@ -297,7 +297,7 @@ void mos7360_device::device_start() screen().register_screen_bitmap(m_bitmap); // create sound stream - m_stream = stream_alloc_legacy(0, 1, machine().sample_rate()); + m_stream = stream_alloc(0, 1, machine().sample_rate()); // buffer for fastest played sample for 5 second so we have enough data for min 5 second m_noisesize = NOISE_FREQUENCY_MAX * NOISE_BUFFER_SIZE_SEC; @@ -454,16 +454,17 @@ void mos7360_device::device_timer(emu_timer &timer, device_timer_id id, int para //------------------------------------------------- -// sound_stream_update_legacy - handle update requests for +// sound_stream_update - handle update requests for // our sound stream //------------------------------------------------- -void mos7360_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void mos7360_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { int i, v, a; - stream_sample_t *buffer = outputs[0]; + auto &buffer = outputs[0]; - for (i = 0; i < samples; i++) + constexpr stream_buffer::sample_t sample_scale = 1.0 / 32768.0; + for (i = 0; i < buffer.samples(); i++) { v = 0; @@ -506,7 +507,7 @@ void mos7360_device::sound_stream_update_legacy(sound_stream &stream, stream_sam v = v * a; - buffer[i] = v; + buffer.put(i, stream_buffer::sample_t(v) * sample_scale); } } diff --git a/src/devices/sound/mos7360.h b/src/devices/sound/mos7360.h index 7e41bddb7c6..c8733dc3e46 100644 --- a/src/devices/sound/mos7360.h +++ b/src/devices/sound/mos7360.h @@ -110,7 +110,7 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // device_sound_interface callbacks - 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; inline void set_interrupt(int mask); inline void clear_interrupt(int mask); diff --git a/src/devices/sound/msm5232.cpp b/src/devices/sound/msm5232.cpp index da8fc499dc7..43d02d542e7 100644 --- a/src/devices/sound/msm5232.cpp +++ b/src/devices/sound/msm5232.cpp @@ -34,7 +34,7 @@ void msm5232_device::device_start() init(clock(), rate); - m_stream = stream_alloc_legacy(0, 11, rate); + m_stream = stream_alloc(0, 11, rate); /* register with the save state system */ save_item(NAME(m_EN_out16)); @@ -725,34 +725,35 @@ void msm5232_device::set_clock(int clock) //------------------------------------------------- -// sound_stream_update_legacy - handle a stream update +// sound_stream_update - handle a stream update //------------------------------------------------- -void msm5232_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int samples) +void msm5232_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { - stream_sample_t *buf1 = outputs[0]; - stream_sample_t *buf2 = outputs[1]; - stream_sample_t *buf3 = outputs[2]; - stream_sample_t *buf4 = outputs[3]; - stream_sample_t *buf5 = outputs[4]; - stream_sample_t *buf6 = outputs[5]; - stream_sample_t *buf7 = outputs[6]; - stream_sample_t *buf8 = outputs[7]; - stream_sample_t *bufsolo1 = outputs[8]; - stream_sample_t *bufsolo2 = outputs[9]; - stream_sample_t *bufnoise = outputs[10]; + auto &buf1 = outputs[0]; + auto &buf2 = outputs[1]; + auto &buf3 = outputs[2]; + auto &buf4 = outputs[3]; + auto &buf5 = outputs[4]; + auto &buf6 = outputs[5]; + auto &buf7 = outputs[6]; + auto &buf8 = outputs[7]; + auto &bufsolo1 = outputs[8]; + auto &bufsolo2 = outputs[9]; + auto &bufnoise = outputs[10]; int i; - for (i=0; i<samples; i++) + constexpr stream_buffer::sample_t sample_scale = 1.0 / 32768.0; + for (i=0; i<buf1.samples(); i++) { /* calculate all voices' envelopes */ EG_voices_advance(); TG_group_advance(0); /* calculate tones group 1 */ - buf1[i] = o2; - buf2[i] = o4; - buf3[i] = o8; - buf4[i] = o16; + buf1.put(i, stream_buffer::sample_t(o2) * sample_scale); + buf2.put(i, stream_buffer::sample_t(o4) * sample_scale); + buf3.put(i, stream_buffer::sample_t(o8) * sample_scale); + buf4.put(i, stream_buffer::sample_t(o16) * sample_scale); SAVE_SINGLE_CHANNEL(0,o2) SAVE_SINGLE_CHANNEL(1,o4) @@ -760,13 +761,13 @@ void msm5232_device::sound_stream_update_legacy(sound_stream &stream, stream_sam SAVE_SINGLE_CHANNEL(3,o16) TG_group_advance(1); /* calculate tones group 2 */ - buf5[i] = o2; - buf6[i] = o4; - buf7[i] = o8; - buf8[i] = o16; + buf5.put(i, stream_buffer::sample_t(o2) * sample_scale); + buf6.put(i, stream_buffer::sample_t(o4) * sample_scale); + buf7.put(i, stream_buffer::sample_t(o8) * sample_scale); + buf8.put(i, stream_buffer::sample_t(o16) * sample_scale); - bufsolo1[i] = solo8; - bufsolo2[i] = solo16; + bufsolo1.put(i, stream_buffer::sample_t(solo8) * sample_scale); + bufsolo2.put(i, stream_buffer::sample_t(solo16) * sample_scale); SAVE_SINGLE_CHANNEL(4,o2) SAVE_SINGLE_CHANNEL(5,o4) @@ -794,6 +795,6 @@ void msm5232_device::sound_stream_update_legacy(sound_stream &stream, stream_sam } } - bufnoise[i] = (m_noise_rng & (1<<16)) ? 32767 : 0; + bufnoise.put(i, (m_noise_rng & (1<<16)) ? 1.0 : 0.0); } } diff --git a/src/devices/sound/msm5232.h b/src/devices/sound/msm5232.h index 364f944353b..552cd7669e3 100644 --- a/src/devices/sound/msm5232.h +++ b/src/devices/sound/msm5232.h @@ -26,7 +26,7 @@ protected: virtual void device_post_load() 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: struct VOICE { diff --git a/src/devices/sound/multipcm.cpp b/src/devices/sound/multipcm.cpp index c4a5892990f..150cbd73301 100644 --- a/src/devices/sound/multipcm.cpp +++ b/src/devices/sound/multipcm.cpp @@ -479,7 +479,7 @@ void multipcm_device::device_start() const float clock_divider = 180.0f; m_rate = (float)clock() / clock_divider; - m_stream = stream_alloc_legacy(0, 2, m_rate); + m_stream = stream_alloc(0, 2, m_rate); // Volume + pan table m_left_pan_table = make_unique_clear<int32_t[]>(0x800); @@ -628,20 +628,21 @@ void multipcm_device::device_clock_changed() } //----------------------------------------------------- -// clamp_to_int16 - clamp a 32-bit value to 16 bits +// convert_to_stream_sample - clamp a 32-bit value to +// 16 bits and convert to a stream_buffer::sample_t //----------------------------------------------------- -int16_t multipcm_device::clamp_to_int16(int32_t value) +stream_buffer::sample_t multipcm_device::convert_to_stream_sample(int32_t value) { if (value < -32768) { - return -32768; + return -1.0; } else if (value > 32767) { - return 32767; + return 1.0; } - return (int16_t)value; + return stream_buffer::sample_t(value) * (1.0 / 32768.0); } #if MULTIPCM_LOG_SAMPLES @@ -677,20 +678,12 @@ void multipcm_device::dump_sample(slot_t &slot) #endif //------------------------------------------------- -// sound_stream_update_legacy - handle a stream update +// sound_stream_update - handle a stream update //------------------------------------------------- -void multipcm_device::sound_stream_update_legacy(sound_stream &stream, stream_sample_t const * const *inputs, stream_sample_t * const *outputs, int32_t samples) +void multipcm_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { - stream_sample_t *datap[2]; - - datap[0] = outputs[0]; - datap[1] = outputs[1]; - - memset(datap[0], 0, sizeof(*datap[0]) * samples); - memset(datap[1], 0, sizeof(*datap[1]) * samples); - - for (int32_t i = 0; i < samples; ++i) + for (int32_t i = 0; i < outputs[0].samples(); ++i) { int32_t smpl = 0; int32_t smpr = 0; @@ -741,8 +734,8 @@ void multipcm_device::sound_stream_update_legacy(sound_stream &stream, stream_sa } } - datap[0][i] = clamp_to_int16(smpl); - datap[1][i] = clamp_to_int16(smpr); + outputs[0].put(i, convert_to_stream_sample(smpl)); + outputs[1].put(i, convert_to_stream_sample(smpr)); } } diff --git a/src/devices/sound/multipcm.h b/src/devices/sound/multipcm.h index 4308703b9dc..0298adbdae4 100644 --- a/src/devices/sound/multipcm.h +++ b/src/devices/sound/multipcm.h @@ -29,7 +29,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; @@ -135,7 +135,7 @@ private: void write_slot(slot_t &slot, int32_t reg, uint8_t data); - int16_t clamp_to_int16(int32_t value); + stream_buffer::sample_t convert_to_stream_sample(int32_t value); #if MULTIPCM_LOG_SAMPLES void dump_sample(slot_t &slot); diff --git a/src/devices/sound/sid.cpp b/src/devices/sound/sid.cpp index 26ba13a1f4b..86264810fda 100644 --- a/src/devices/sound/sid.cpp +++ b/src/devices/sound/sid.cpp @@ -29,34 +29,10 @@ float filterResTable[16]; #define maxLogicalVoices 4 -const int mix16monoMiddleIndex = 256*maxLogicalVoices/2; -uint16_t mix16mono[256*maxLogicalVoices]; - -uint16_t zero16bit = 0; /* either signed or unsigned */ -//uint32_t splitBufferLen; - -void MixerInit(int threeVoiceAmplify) +inline stream_buffer::sample_t mix_mono(uint16_t usum) { - long si; - uint16_t ui; - long ampDiv = maxLogicalVoices; - - if (threeVoiceAmplify) - { - ampDiv = (maxLogicalVoices-1); - } - - /* Mixing formulas are optimized by sample input value. */ - - si = (-128*maxLogicalVoices) * 256; - for (ui = 0; ui < sizeof(mix16mono)/sizeof(uint16_t); ui++) - { - mix16mono[ui] = (uint16_t)(si/ampDiv) + zero16bit; - si+=256; - } - + return stream_buffer::sample_t(int16_t(usum - maxLogicalVoices*128)) * (1.0 / (256 * maxLogicalVoices)); } - } // anonymous namespace @@ -85,22 +61,22 @@ inline void SID6581_t::syncEm() } -void SID6581_t::fill_buffer(stream_sample_t *buffer, uint32_t bufferLen) +void SID6581_t::fill_buffer(write_stream_view &buffer) { //void* SID6581_t::fill16bitMono(void* buffer, uint32_t numberOfSamples) - for (; bufferLen > 0; bufferLen--) + for (int sampindex = 0; sampindex < buffer.samples(); sampindex++) { - *buffer++ = (int16_t) mix16mono[unsigned(mix16monoMiddleIndex - +(*optr[0].outProc)(&optr[0]) + buffer.put(sampindex, mix_mono( + (*optr[0].outProc)(&optr[0]) +(*optr[1].outProc)(&optr[1]) - +(optr[2].outProc(&optr[2])&optr3_outputmask) + +((*optr[2].outProc)(&optr[2])&optr3_outputmask) /* hack for digi sounds does n't seam to come from a tone operator ghostbusters and goldrunner everything except volume zeroed */ +(masterVolume<<2) // +(*sampleEmuRout)() - )]; + )); syncEm(); } } @@ -227,8 +203,6 @@ void SID6581_t::init() enveEmuInit(PCMfreq, true); - MixerInit(0); - reset(); } diff --git a/src/devices/sound/sid.h b/src/devices/sound/sid.h index 6e5ad1dfa3f..ecf27c2b300 100644 --- a/src/devices/sound/sid.h +++ b/src/devices/sound/sid.h @@ -63,7 +63,7 @@ struct SID6581_t int port_r(running_machine &machine, int offset); void port_w(int offset, int data); - void fill_buffer(stream_sample_t *buffer, uint32_t bufferLen); + void fill_buffer(write_stream_view &buffer); private: void syncEm(); |