/* ** thinlib (c) 2001 Matthew Conte (matt@conte.com) ** ** ** tl_sound.c ** ** sound driver ** ** $Id: $ */ #include "tl_types.h" #include "tl_sound.h" #include "tl_sb.h" #include "tl_log.h" typedef struct snddriver_s { const char *name; int (*init)(int *sample_rate, int *frag_size, int *format); void (*shutdown)(void); int (*start)(audio_callback_t callback, void *user_data); void (*stop)(void); void (*setrate)(int sample_rate); audio_callback_t callback; void *user_data; } snddriver_t; static snddriver_t sb = { "Sound Blaster", thin_sb_init, thin_sb_shutdown, thin_sb_start, thin_sb_stop, thin_sb_setrate, NULL, NULL }; static snddriver_t *driver_list[] = { &sb, NULL }; static snddriver_t snddriver; int thin_sound_init(thinsound_t *sound_params) { snddriver_t **iter; int sample_rate, frag_size, format; THIN_ASSERT(sound_params); sample_rate = sound_params->sample_rate; frag_size = sound_params->frag_size; format = sound_params->format; for (iter = driver_list; *iter != NULL; iter++) { if (0 == (*iter)->init(&sample_rate, &frag_size, &format)) { snddriver = **iter; /* copy the parameters back */ sound_params->sample_rate = sample_rate; sound_params->frag_size = frag_size; sound_params->format = format; /* and set the callback */ snddriver.callback = sound_params->callback; snddriver.user_data = sound_params->user_data; return 0; } } snddriver.name = NULL; thin_printf("thin: could not find any sound drivers.\n"); return -1; } void thin_sound_shutdown(void) { if (NULL == snddriver.name) return; snddriver.shutdown(); memset(&snddriver, 0, sizeof(snddriver_t)); } void thin_sound_start(void) { if (NULL == snddriver.name) return; THIN_ASSERT(snddriver.callback); snddriver.start(snddriver.callback, snddriver.user_data); } void thin_sound_stop(void) { if (NULL == snddriver.name) return; snddriver.stop(); } void thin_sound_setrate(int sample_rate) { if (snddriver.setrate) snddriver.setrate(sample_rate); } /* ** $Log: $ */