21 #include "../../SDL_internal.h" 23 #if SDL_AUDIO_DRIVER_BSD 34 #include <sys/ioctl.h> 36 #include <sys/types.h> 37 #include <sys/audioio.h> 41 #include "../SDL_audio_c.h" 42 #include "../SDL_audiodev_c.h" 53 BSDAUDIO_DetectDevices(
void)
60 BSDAUDIO_Status(
_THIS)
65 const audio_prinfo *prinfo;
67 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
68 fprintf(stderr,
"AUDIO_GETINFO failed.\n");
72 prinfo = this->iscapture ? &info.play : &info.record;
76 "buffer size : %d bytes\n" 77 "sample rate : %i Hz\n" 79 "precision : %i-bit\n" 85 "error occured : %s\n" 89 this->iscapture ?
"record" :
"play",
98 prinfo->pause ?
"yes" :
"no",
99 prinfo->error ?
"yes" :
"no",
100 prinfo->waiting ?
"yes" :
"no",
101 prinfo->active ?
"yes" :
"no");
105 "monitor_gain : %i\n" 106 "hw block size : %d bytes\n" 107 "hi watermark : %i\n" 108 "lo watermark : %i\n" 113 info.hiwat, info.lowat,
114 (info.mode == AUMODE_PLAY) ?
"PLAY" 115 : (info.mode = AUMODE_RECORD) ?
"RECORD" 116 : (info.mode == AUMODE_PLAY_ALL ?
"PLAY_ALL" :
"?"));
124 BSDAUDIO_WaitDevice(
_THIS)
126 #ifndef USE_BLOCKING_WRITES 128 if (this->hidden->frame_ticks) {
142 FD_SET(this->hidden->audio_fd, &fdset);
146 fprintf(stderr,
"Waiting for audio to get ready\n");
151 "Audio timeout - buggy audio driver? (disabled)";
156 fprintf(stderr,
"SDL: %s\n", message);
159 this->hidden->audio_fd = -1;
161 fprintf(stderr,
"Done disabling audio\n");
165 fprintf(stderr,
"Ready!\n");
172 BSDAUDIO_PlayDevice(
_THIS)
178 written = write(this->hidden->audio_fd,
179 &this->hidden->mixbuf[p], this->hidden->mixlen - p);
183 if (written == -1 && errno != 0 && errno != EAGAIN && errno != EINTR) {
190 fprintf(stderr,
"Wrote %d bytes of audio data\n", written);
194 || ((written < 0) && ((errno == 0) || (errno == EAGAIN)))) {
200 if (this->hidden->frame_ticks) {
201 this->hidden->next_frame += this->hidden->frame_ticks;
211 BSDAUDIO_GetDeviceBuf(
_THIS)
213 return (this->hidden->mixbuf);
218 BSDAUDIO_CaptureFromDevice(
_THIS,
void *_buffer,
int buflen)
225 br = read(this->hidden->audio_fd, buffer + p, buflen - p);
228 if (br == -1 && errno != 0 && errno != EAGAIN && errno != EINTR) {
235 fprintf(stderr,
"Captured %d bytes of audio data\n", br);
239 || ((br < 0) && ((errno == 0) || (errno == EAGAIN)))) {
242 }
while (p < buflen);
246 BSDAUDIO_FlushCapture(
_THIS)
252 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
258 const size_t len =
SDL_min(
sizeof (buf), remain);
259 const int br = read(this->hidden->audio_fd, buf, len);
268 BSDAUDIO_CloseDevice(
_THIS)
270 if (this->hidden->audio_fd >= 0) {
271 close(this->hidden->audio_fd);
278 BSDAUDIO_OpenDevice(
_THIS,
void *handle,
const char *devname,
int iscapture)
283 audio_prinfo *prinfo = iscapture ? &info.play : &info.record;
287 if (devname ==
NULL) {
289 if (devname ==
NULL) {
297 if (this->hidden ==
NULL) {
303 this->hidden->audio_fd = open(devname, flags, 0);
304 if (this->hidden->audio_fd < 0) {
305 return SDL_SetError(
"Couldn't open %s: %s", devname, strerror(errno));
308 AUDIO_INITINFO(&info);
314 info.mode = iscapture ? AUMODE_RECORD : AUMODE_PLAY;
315 if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) < 0) {
316 return SDL_SetError(
"Couldn't put device into play mode");
319 AUDIO_INITINFO(&info);
324 prinfo->encoding = AUDIO_ENCODING_ULINEAR;
325 prinfo->precision = 8;
328 prinfo->encoding = AUDIO_ENCODING_SLINEAR;
329 prinfo->precision = 8;
332 prinfo->encoding = AUDIO_ENCODING_SLINEAR_LE;
333 prinfo->precision = 16;
336 prinfo->encoding = AUDIO_ENCODING_SLINEAR_BE;
337 prinfo->precision = 16;
340 prinfo->encoding = AUDIO_ENCODING_ULINEAR_LE;
341 prinfo->precision = 16;
344 prinfo->encoding = AUDIO_ENCODING_ULINEAR_BE;
345 prinfo->precision = 16;
351 if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) == 0) {
362 AUDIO_INITINFO(&info);
364 if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) == -1) {
367 AUDIO_INITINFO(&info);
368 prinfo->sample_rate = this->
spec.
freq;
372 (
void) ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info);
373 (
void) ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info);
374 this->
spec.
freq = prinfo->sample_rate;
378 this->hidden->mixlen = this->
spec.
size;
380 if (this->hidden->mixbuf ==
NULL) {
383 SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size);
386 BSDAUDIO_Status(
this);
413 "bsd",
"BSD audio", BSDAUDIO_Init, 0
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
void(* DetectDevices)(void)
GLuint GLsizei const GLchar * message
void(* PlayDevice)(_THIS)
void(* WaitDevice)(_THIS)
void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)
Uint16 SDL_AudioFormat
Audio format flags.
AudioBootStrap BSD_AUDIO_bootstrap
SDL_AudioFormat SDL_NextAudioFormat(void)
#define SDL_GetAudioDeviceName
void SDL_EnumUnixAudioDevices(const int classic, int(*test)(int))
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define OPEN_FLAGS_OUTPUT
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_AUDIO_BITSIZE(x)
void SDL_CalculateAudioSpec(SDL_AudioSpec *spec)
int32_t Sint32
A signed 32-bit integer type.
GLenum GLuint GLenum GLsizei const GLchar * buf
int(* OpenDevice)(_THIS, void *handle, const char *devname, int iscapture)
#define SDL_OutOfMemory()
int(* CaptureFromDevice)(_THIS, void *buffer, int buflen)
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)
int AllowsArbitraryDeviceNames
void(* FlushCapture)(_THIS)
GLbitfield GLuint64 timeout
Uint8 *(* GetDeviceBuf)(_THIS)