diff options
Diffstat (limited to 'src/devices/sound/dac.h')
-rw-r--r-- | src/devices/sound/dac.h | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/src/devices/sound/dac.h b/src/devices/sound/dac.h index f1793b5f569..7a48ba80998 100644 --- a/src/devices/sound/dac.h +++ b/src/devices/sound/dac.h @@ -45,9 +45,10 @@ public: }; template <unsigned bits> -constexpr stream_sample_t dac_multiply(const double vref, const stream_sample_t code) +constexpr stream_buffer::sample_t dac_multiply(const double vref, const s32 code) { - return (bits > 1) ? ((vref * code) / (1 << (bits))) : (vref * code); + constexpr stream_buffer::sample_t scale = 1.0 / stream_buffer::sample_t((bits > 1) ? (1 << (bits)) : 1); + return vref * scale * stream_buffer::sample_t(code); } template <unsigned bits> @@ -62,12 +63,12 @@ protected: } sound_stream * m_stream; - stream_sample_t m_code; + s32 m_code; const double m_gain; - inline void setCode(stream_sample_t code) + inline void setCode(s32 code) { - code &= ~(~std::make_unsigned_t<stream_sample_t>(0) << bits); + code &= ~(~u32(0) << bits); if (m_code != code) { m_stream->update(); @@ -75,7 +76,7 @@ protected: } } - virtual void sound_stream_update_tag(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) = 0; + virtual void sound_stream_update_tag(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) = 0; }; template <unsigned bits> @@ -84,14 +85,14 @@ class dac_code_binary : protected dac_code<bits> protected: using dac_code<bits>::dac_code; - virtual void sound_stream_update_tag(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override + virtual void sound_stream_update_tag(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override { - for (int samp = 0; samp < samples; samp++) + for (int samp = 0; samp < outputs[0].samples(); samp++) { - double const vref_pos = inputs[DAC_VREF_POS_INPUT][samp] * this->m_gain; - double const vref_neg = inputs[DAC_VREF_NEG_INPUT][samp] * this->m_gain; - stream_sample_t const vout = vref_neg + dac_multiply<bits>(vref_pos - vref_neg, this->m_code); - outputs[0][samp] = vout; + double const vref_pos = inputs[DAC_VREF_POS_INPUT].get(samp) * this->m_gain; + double const vref_neg = inputs[DAC_VREF_NEG_INPUT].get(samp) * this->m_gain; + stream_buffer::sample_t const vout = vref_neg + dac_multiply<bits>(vref_pos - vref_neg, this->m_code); + outputs[0].put(samp, vout); } } }; @@ -102,24 +103,24 @@ class dac_code_ones_complement : protected dac_code<bits> protected: using dac_code<bits>::dac_code; - virtual void sound_stream_update_tag(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override + virtual void sound_stream_update_tag(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override { if (this->m_code & (1 << (bits - 1))) { - for (int samp = 0; samp < samples; samp++) + for (int samp = 0; samp < outputs[0].samples(); samp++) { - double const vref_neg = inputs[DAC_VREF_NEG_INPUT][samp] * this->m_gain; - stream_sample_t const vout = dac_multiply<bits - 1>(vref_neg, this->m_code ^ ~(~0U << bits)); - outputs[0][samp] = vout; + double const vref_neg = inputs[DAC_VREF_NEG_INPUT].get(samp) * this->m_gain; + stream_buffer::sample_t const vout = dac_multiply<bits - 1>(vref_neg, this->m_code ^ ~(~0U << bits)); + outputs[0].put(samp, vout); } } else { - for (int samp = 0; samp < samples; samp++) + for (int samp = 0; samp < outputs[0].samples(); samp++) { - double const vref_pos = inputs[DAC_VREF_POS_INPUT][samp] * this->m_gain; - stream_sample_t const vout = dac_multiply<bits - 1>(vref_pos, this->m_code); - outputs[0][samp] = vout; + double const vref_pos = inputs[DAC_VREF_POS_INPUT].get(samp) * this->m_gain; + stream_buffer::sample_t const vout = dac_multiply<bits - 1>(vref_pos, this->m_code); + outputs[0].put(samp, vout); } } } @@ -131,14 +132,14 @@ class dac_code_twos_complement : protected dac_code<bits> protected: using dac_code<bits>::dac_code; - virtual void sound_stream_update_tag(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override + virtual void sound_stream_update_tag(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override { - for (int samp = 0; samp < samples; samp++) + for (int samp = 0; samp < outputs[0].samples(); samp++) { - double const vref_pos = inputs[DAC_VREF_POS_INPUT][samp] * this->m_gain; - double const vref_neg = inputs[DAC_VREF_NEG_INPUT][samp] * this->m_gain; - stream_sample_t const vout = vref_neg + dac_multiply<bits>(vref_pos - vref_neg, this->m_code ^ (1 << (bits - 1))); - outputs[0][samp] = vout; + double const vref_pos = inputs[DAC_VREF_POS_INPUT].get(samp) * this->m_gain; + double const vref_neg = inputs[DAC_VREF_NEG_INPUT].get(samp) * this->m_gain; + stream_buffer::sample_t const vout = vref_neg + dac_multiply<bits>(vref_pos - vref_neg, this->m_code ^ (1 << (bits - 1))); + outputs[0].put(samp, vout); } } }; @@ -149,24 +150,24 @@ class dac_code_sign_magntitude : protected dac_code<bits> protected: using dac_code<bits>::dac_code; - virtual void sound_stream_update_tag(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override + virtual void sound_stream_update_tag(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override { if (this->m_code & (1 << (bits - 1))) { - for (int samp = 0; samp < samples; samp++) + for (int samp = 0; samp < outputs[0].samples(); samp++) { - double const vref_neg = inputs[DAC_VREF_NEG_INPUT][samp] * this->m_gain; - stream_sample_t const vout = dac_multiply<bits - 1>(vref_neg, this->m_code ^ (1 << (bits - 1))); - outputs[0][samp] = vout; + double const vref_neg = inputs[DAC_VREF_NEG_INPUT].get(samp) * this->m_gain; + stream_buffer::sample_t const vout = dac_multiply<bits - 1>(vref_neg, this->m_code ^ (1 << (bits - 1))); + outputs[0].put(samp, vout); } } else { - for (int samp = 0; samp < samples; samp++) + for (int samp = 0; samp < outputs[0].samples(); samp++) { - double const vref_pos = inputs[DAC_VREF_POS_INPUT][samp] * this->m_gain; - stream_sample_t const vout = dac_multiply<bits - 1>(vref_pos, this->m_code); - outputs[0][samp] = vout; + double const vref_pos = inputs[DAC_VREF_POS_INPUT].get(samp) * this->m_gain; + stream_buffer::sample_t const vout = dac_multiply<bits - 1>(vref_pos, this->m_code); + outputs[0].put(samp, vout); } } } @@ -193,9 +194,9 @@ protected: save_item(NAME(this->m_code)); } - virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **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 { - _dac_code::sound_stream_update_tag(stream, inputs, outputs, samples); + _dac_code::sound_stream_update_tag(stream, inputs, outputs); } }; |