gnuboy-for-dfi/sys/thinlib/lib/tl_sound.c

121 lines
2.2 KiB
C

/*
** 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: $
*/