121 lines
2.2 KiB
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: $
|
||
|
*/
|