summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/dac.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/dac.h')
-rw-r--r--src/devices/sound/dac.h77
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);
}
};