summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound/speaker.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/sound/speaker.c')
-rw-r--r--src/emu/sound/speaker.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/emu/sound/speaker.c b/src/emu/sound/speaker.c
new file mode 100644
index 00000000000..4fba85bb5e3
--- /dev/null
+++ b/src/emu/sound/speaker.c
@@ -0,0 +1,104 @@
+/***************************************************************************
+
+ speaker.c
+
+ Sound driver to emulate a simple speaker,
+ driven by one or more output bits
+
+****************************************************************************/
+
+#include "sndintrf.h"
+#include "streams.h"
+#include "speaker.h"
+
+static INT16 default_levels[2] = {0,32767};
+
+struct speaker
+{
+ sound_stream *channel;
+ INT16 *levels;
+ int num_levels;
+ int level;
+};
+
+
+
+static void speaker_sound_update(void *param,stream_sample_t **inputs, stream_sample_t **_buffer,int length)
+{
+ struct speaker *sp = (struct speaker *) param;
+ stream_sample_t *buffer = _buffer[0];
+ int volume = sp->levels[sp->level];
+
+ while( length-- > 0 )
+ *buffer++ = volume;
+}
+
+
+
+static void *speaker_start(int sndindex, int clock, const void *config)
+{
+ struct speaker *sp = auto_malloc(sizeof(*sp));
+
+ sp->channel = stream_create(0, 1, Machine->sample_rate, sp, speaker_sound_update);
+ sp->num_levels = 2;
+ sp->levels = default_levels;
+ sp->level = 0;
+ return sp;
+}
+
+
+
+void speaker_level_w(int which, int new_level)
+{
+ struct speaker *sp = sndti_token(SOUND_SPEAKER, which);
+
+ if( new_level < 0 )
+ new_level = 0;
+ else
+ if( new_level >= sp->num_levels )
+ new_level = sp->num_levels - 1;
+
+ if( new_level == sp->level )
+ return;
+
+ /* force streams.c to update sound until this point in time now */
+ stream_update(sp->channel);
+
+ sp->level = new_level;
+}
+
+
+
+/**************************************************************************
+ * Generic get_info
+ **************************************************************************/
+
+static void speaker_set_info(void *token, UINT32 state, sndinfo *info)
+{
+ switch (state)
+ {
+ /* no parameters to set */
+ }
+}
+
+
+void speaker_get_info(void *token, UINT32 state, sndinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case SNDINFO_PTR_SET_INFO: info->set_info = speaker_set_info; break;
+ case SNDINFO_PTR_START: info->start = speaker_start; break;
+ case SNDINFO_PTR_STOP: /* nothing */ break;
+ case SNDINFO_PTR_RESET: /* nothing */ break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case SNDINFO_STR_NAME: info->s = "Speaker"; break;
+ case SNDINFO_STR_CORE_FAMILY: info->s = "Speaker"; break;
+ case SNDINFO_STR_CORE_VERSION: info->s = "1.0"; break;
+ case SNDINFO_STR_CORE_FILE: info->s = __FILE__; break;
+ case SNDINFO_STR_CORE_CREDITS: info->s = "Copyright (c) 2005, The MESS Team"; break;
+ }
+}