diff options
Diffstat (limited to 'src/emu/sound/speaker.c')
-rw-r--r-- | src/emu/sound/speaker.c | 104 |
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; + } +} |