22 #include "../../SDL_internal.h" 24 #if SDL_AUDIO_DRIVER_SNDIO 39 #include "../SDL_audio_c.h" 42 #ifdef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC 46 static struct sio_hdl * (*SNDIO_sio_open)(
const char *,
unsigned int, int);
47 static void (*SNDIO_sio_close)(
struct sio_hdl *);
48 static int (*SNDIO_sio_setpar)(
struct sio_hdl *,
struct sio_par *);
49 static int (*SNDIO_sio_getpar)(
struct sio_hdl *,
struct sio_par *);
50 static int (*SNDIO_sio_start)(
struct sio_hdl *);
51 static int (*SNDIO_sio_stop)(
struct sio_hdl *);
52 static size_t (*SNDIO_sio_read)(
struct sio_hdl *,
void *,
size_t);
53 static size_t (*SNDIO_sio_write)(
struct sio_hdl *,
const void *,
size_t);
54 static void (*SNDIO_sio_initpar)(
struct sio_par *);
56 #ifdef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC 57 static const char *sndio_library = SDL_AUDIO_DRIVER_SNDIO_DYNAMIC;
58 static void *sndio_handle =
NULL;
61 load_sndio_sym(
const char *fn,
void **
addr)
73 #define SDL_SNDIO_SYM(x) \ 74 if (!load_sndio_sym(#x, (void **) (char *) &SNDIO_##x)) return -1 76 #define SDL_SNDIO_SYM(x) SNDIO_##x = x 82 SDL_SNDIO_SYM(sio_open);
83 SDL_SNDIO_SYM(sio_close);
84 SDL_SNDIO_SYM(sio_setpar);
85 SDL_SNDIO_SYM(sio_getpar);
86 SDL_SNDIO_SYM(sio_start);
87 SDL_SNDIO_SYM(sio_stop);
88 SDL_SNDIO_SYM(sio_read);
89 SDL_SNDIO_SYM(sio_write);
90 SDL_SNDIO_SYM(sio_initpar);
96 #ifdef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC 99 UnloadSNDIOLibrary(
void)
101 if (sndio_handle !=
NULL) {
108 LoadSNDIOLibrary(
void)
111 if (sndio_handle ==
NULL) {
113 if (sndio_handle ==
NULL) {
117 retval = load_sndio_syms();
119 UnloadSNDIOLibrary();
129 UnloadSNDIOLibrary(
void)
134 LoadSNDIOLibrary(
void)
146 SNDIO_WaitDevice(
_THIS)
152 SNDIO_PlayDevice(
_THIS)
154 const int written = SNDIO_sio_write(this->hidden->dev,
155 this->hidden->mixbuf,
156 this->hidden->mixlen);
159 if ( written == 0 ) {
163 fprintf(stderr,
"Wrote %d bytes of audio data\n", written);
168 SNDIO_GetDeviceBuf(
_THIS)
170 return this->hidden->mixbuf;
174 SNDIO_CloseDevice(
_THIS)
176 if ( this->hidden->dev !=
NULL ) {
177 SNDIO_sio_stop(this->hidden->dev);
178 SNDIO_sio_close(this->hidden->dev);
185 SNDIO_OpenDevice(
_THIS,
void *handle,
const char *devname,
int iscapture)
193 if (this->hidden ==
NULL) {
198 this->hidden->mixlen = this->
spec.
size;
201 if ((this->hidden->dev = SNDIO_sio_open(SIO_DEVANY, SIO_PLAY, 0)) ==
NULL) {
205 SNDIO_sio_initpar(&par);
210 par.appbufsz = par.round * 2;
214 while (test_format && (status < 0)) {
220 if (SNDIO_sio_setpar(this->hidden->dev, &par) == 0) {
223 if (SNDIO_sio_getpar(this->hidden->dev, &par) == 0) {
226 if (par.bps != SIO_BPS(par.bits)) {
229 if ((par.bits == 8 * par.bps) || (par.msb)) {
238 return SDL_SetError(
"sndio: Couldn't find any hardware audio formats");
241 if ((par.bps == 4) && (par.sig) && (par.le))
243 else if ((par.bps == 4) && (par.sig) && (!par.le))
245 else if ((par.bps == 2) && (par.sig) && (par.le))
247 else if ((par.bps == 2) && (par.sig) && (!par.le))
249 else if ((par.bps == 2) && (!par.sig) && (par.le))
251 else if ((par.bps == 2) && (!par.sig) && (!par.le))
253 else if ((par.bps == 1) && (par.sig))
255 else if ((par.bps == 1) && (!par.sig))
258 return SDL_SetError(
"sndio: Got unsupported hardware audio format.");
269 this->hidden->mixlen = this->
spec.
size;
271 if (this->hidden->mixbuf ==
NULL) {
274 SDL_memset(this->hidden->mixbuf, this->spec.silence, this->hidden->mixlen);
276 if (!SNDIO_sio_start(this->hidden->dev)) {
285 SNDIO_Deinitialize(
void)
287 UnloadSNDIOLibrary();
293 if (LoadSNDIOLibrary() < 0) {
310 "sndio",
"OpenBSD sndio", SNDIO_Init, 0
#define SDL_AUDIO_ISLITTLEENDIAN(x)
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
void(* PlayDevice)(_THIS)
void(* WaitDevice)(_THIS)
#define SDL_AUDIO_ISSIGNED(x)
void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)
Uint16 SDL_AudioFormat
Audio format flags.
SDL_AudioFormat SDL_NextAudioFormat(void)
#define SDL_AUDIO_ISFLOAT(x)
int OnlyHasDefaultOutputDevice
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_AUDIO_BITSIZE(x)
void(* Deinitialize)(void)
void SDL_CalculateAudioSpec(SDL_AudioSpec *spec)
int(* OpenDevice)(_THIS, void *handle, const char *devname, int iscapture)
#define SDL_OutOfMemory()
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
void(* CloseDevice)(_THIS)
Uint8 *(* GetDeviceBuf)(_THIS)
void * SDL_LoadFunction(void *handle, const char *name)
AudioBootStrap SNDIO_bootstrap