diff options
Diffstat (limited to 'src/devices/sound/dac76.cpp')
-rw-r--r-- | src/devices/sound/dac76.cpp | 64 |
1 files changed, 53 insertions, 11 deletions
diff --git a/src/devices/sound/dac76.cpp b/src/devices/sound/dac76.cpp index 388ccb7f2b0..cbd0530eb4a 100644 --- a/src/devices/sound/dac76.cpp +++ b/src/devices/sound/dac76.cpp @@ -1,5 +1,5 @@ -// license: GPL-2.0+ -// copyright-holders: Dirk Best +// license:BSD-3-Clause +// copyright-holders:Dirk Best /*************************************************************************** PMI DAC-76 COMDAC @@ -38,12 +38,38 @@ dac76_device::dac76_device(const machine_config &mconfig, const char *tag, devic device_t(mconfig, DAC76, tag, owner, clock), device_sound_interface(mconfig, *this), m_stream(nullptr), + m_streaming_iref(false), + m_voltage_output(false), + m_r_pos(1.0F), + m_r_neg(1.0F), m_chord(0), m_step(0), - m_sb(false) + m_sb(false), + m_fixed_iref(1.0F) { } +void dac76_device::configure_streaming_iref(bool streaming_iref) +{ + m_streaming_iref = streaming_iref; +} + +void dac76_device::configure_voltage_output(float i2v_r_pos, float i2v_r_neg) +{ + m_voltage_output = true; + m_r_pos = i2v_r_pos; + m_r_neg = i2v_r_neg; +} + +void dac76_device::set_fixed_iref(float iref) +{ + if (m_fixed_iref == iref) + return; + if (m_stream != nullptr) + m_stream->update(); + m_fixed_iref = iref; +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -51,12 +77,14 @@ dac76_device::dac76_device(const machine_config &mconfig, const char *tag, devic void dac76_device::device_start() { // create sound stream - m_stream = machine().sound().stream_alloc(*this, 0, 1, machine().sample_rate() * 8); + const int input_count = m_streaming_iref ? 1 : 0; + m_stream = stream_alloc(input_count, 1, machine().sample_rate() * 8); // register for save states save_item(NAME(m_chord)); save_item(NAME(m_step)); save_item(NAME(m_sb)); + save_item(NAME(m_fixed_iref)); } //------------------------------------------------- @@ -75,18 +103,32 @@ void dac76_device::device_reset() // our sound stream //------------------------------------------------- -void dac76_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +void dac76_device::sound_stream_update(sound_stream &stream) { // get current output level int step_size = (2 << m_chord); - stream_sample_t vout = m_level[m_chord] + m_step * step_size; + s32 vout = m_level[m_chord] + m_step * step_size; // apply sign bit vout *= (m_sb ? +1 : -1); - // range is 0-8031, normalize to about 0-32768 range - vout *= 4; - - for (int i = 0; i < samples; i++) - outputs[0][i] = vout; + // range is 0-8031, normalize to 0-1 range + sound_stream::sample_t y = sound_stream::sample_t(vout) * (1.0 / 8031.0); + + if (m_voltage_output) + { + constexpr float FULL_SCALE_MULT = 3.8F; // From datasheet. + y *= ((y >= 0) ? m_r_pos : m_r_neg) * FULL_SCALE_MULT; + } + + if (m_streaming_iref) + { + const int n = stream.samples(); + for (int i = 0; i < n; ++i) + stream.put(0, i, stream.get(0, i) * y); + } + else + { + stream.fill(0, m_fixed_iref * y); + } } |