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