diff options
Diffstat (limited to 'src/devices/sound/beep.cpp')
-rw-r--r-- | src/devices/sound/beep.cpp | 84 |
1 files changed, 29 insertions, 55 deletions
diff --git a/src/devices/sound/beep.cpp b/src/devices/sound/beep.cpp index 6212bed7915..9a341a7a2d3 100644 --- a/src/devices/sound/beep.cpp +++ b/src/devices/sound/beep.cpp @@ -2,40 +2,26 @@ // copyright-holders:Kevin Thacker /*************************************************************************** - beep.c + Simple beeper sound driver This is used for computers/systems which can only output a constant tone. This tone can be turned on and off. e.g. PCW and PCW16 computer systems - KT - 25-Jun-2000 - - Sound handler ****************************************************************************/ #include "emu.h" -#include "sound/beep.h" - -#define BEEP_RATE (48000) +#include "beep.h" // device type definition DEFINE_DEVICE_TYPE(BEEP, beep_device, "beep", "Beep") - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// beep_device - constructor -//------------------------------------------------- - beep_device::beep_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, BEEP, tag, owner, clock) , device_sound_interface(mconfig, *this) , m_stream(nullptr) - , m_enable(0) + , m_enable(false) , m_frequency(clock) { } @@ -47,9 +33,12 @@ beep_device::beep_device(const machine_config &mconfig, const char *tag, device_ void beep_device::device_start() { - m_stream = stream_alloc(0, 1, BEEP_RATE); - m_enable = 0; - m_signal = 0x07fff; + // large stream buffer to favour emu/sound.cpp resample quality + m_stream = stream_alloc(0, 1, 48000 * 32); + + m_enable = false; + m_incr = 0; + m_signal = 1.0; // register for savestates save_item(NAME(m_enable)); @@ -63,40 +52,24 @@ void beep_device::device_start() // sound_stream_update - handle a stream update //------------------------------------------------- -void beep_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +void beep_device::sound_stream_update(sound_stream &stream) { - stream_sample_t *buffer = outputs[0]; - int16_t signal = m_signal; - int clock = 0, rate = BEEP_RATE / 2; - - /* get progress through wave */ - int incr = m_incr; - - if (m_frequency > 0) - clock = m_frequency; - - /* if we're not enabled, just fill with 0 */ - if ( !m_enable || clock == 0 ) - { - memset( buffer, 0, samples * sizeof(*buffer) ); + // if we're not enabled, just leave cleared + if (!m_enable || m_frequency == 0) return; - } - /* fill in the sample */ - while( samples-- > 0 ) + // fill in the sample + for (int sampindex = 0; sampindex < stream.samples(); sampindex++) { - *buffer++ = signal; - incr -= clock; - while( incr < 0 ) + m_incr -= m_frequency; + while (m_incr < 0) { - incr += rate; - signal = -signal; + m_incr += stream.sample_rate() / 2; + m_signal = -m_signal; } - } - /* store progress through wave */ - m_incr = incr; - m_signal = signal; + stream.put(0, sampindex, m_signal); + } } @@ -104,19 +77,18 @@ void beep_device::sound_stream_update(sound_stream &stream, stream_sample_t **in // changing state to on from off will restart tone //------------------------------------------------- -WRITE_LINE_MEMBER(beep_device::set_state) +void beep_device::set_state(int state) { - /* only update if new state is not the same as old state */ - int on = (state) ? 1 : 0; - if (m_enable == on) + // only update if new state is not the same as old state + if (m_enable == bool(state)) return; m_stream->update(); - m_enable = on; + m_enable = bool(state); - /* restart wave from beginning */ + // restart wave from beginning m_incr = 0; - m_signal = 0x07fff; + m_signal = 1.0; } @@ -131,6 +103,8 @@ void beep_device::set_clock(uint32_t frequency) m_stream->update(); m_frequency = frequency; - m_signal = 0x07fff; + + // restart wave from beginning m_incr = 0; + m_signal = 1.0; } |