21 #include "../../SDL_internal.h" 23 #if SDL_AUDIO_DRIVER_NETBSD 34 #include <sys/ioctl.h> 36 #include <sys/types.h> 37 #include <sys/audioio.h> 41 #include "../../core/unix/SDL_poll.h" 42 #include "../SDL_audio_c.h" 43 #include "../SDL_audiodev_c.h" 54 NETBSDAUDIO_DetectDevices(
void)
61 NETBSDAUDIO_Status(
_THIS)
66 const audio_prinfo *prinfo;
68 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
69 fprintf(stderr,
"AUDIO_GETINFO failed.\n");
73 prinfo = this->iscapture ? &info.play : &info.record;
77 "buffer size : %d bytes\n" 78 "sample rate : %i Hz\n" 80 "precision : %i-bit\n" 86 "error occured : %s\n" 90 this->iscapture ?
"record" :
"play",
99 prinfo->pause ?
"yes" :
"no",
100 prinfo->error ?
"yes" :
"no",
101 prinfo->waiting ?
"yes" :
"no",
102 prinfo->active ?
"yes" :
"no");
106 "monitor_gain : %i\n" 107 "hw block size : %d bytes\n" 108 "hi watermark : %i\n" 109 "lo watermark : %i\n" 114 info.hiwat, info.lowat,
115 (info.mode == AUMODE_PLAY) ?
"PLAY" 116 : (info.mode = AUMODE_RECORD) ?
"RECORD" 117 : (info.mode == AUMODE_PLAY_ALL ?
"PLAY_ALL" :
"?"));
125 NETBSDAUDIO_WaitDevice(
_THIS)
127 #ifndef USE_BLOCKING_WRITES 129 if (this->hidden->frame_ticks) {
140 fprintf(stderr,
"Waiting for audio to get ready\n");
145 "Audio timeout - buggy audio driver? (disabled)";
150 fprintf(stderr,
"SDL: %s\n", message);
153 this->hidden->audio_fd = -1;
155 fprintf(stderr,
"Done disabling audio\n");
159 fprintf(stderr,
"Ready!\n");
166 NETBSDAUDIO_PlayDevice(
_THIS)
172 written = write(this->hidden->audio_fd,
173 &this->hidden->mixbuf[p], this->hidden->mixlen - p);
177 if (written == -1 && errno != 0 && errno != EAGAIN && errno != EINTR) {
184 fprintf(stderr,
"Wrote %d bytes of audio data\n", written);
188 || ((written < 0) && ((errno == 0) || (errno == EAGAIN)))) {
194 if (this->hidden->frame_ticks) {
195 this->hidden->next_frame += this->hidden->frame_ticks;
205 NETBSDAUDIO_GetDeviceBuf(
_THIS)
207 return (this->hidden->mixbuf);
212 NETBSDAUDIO_CaptureFromDevice(
_THIS,
void *_buffer,
int buflen)
219 br = read(this->hidden->audio_fd, buffer + p, buflen - p);
222 if (br == -1 && errno != 0 && errno != EAGAIN && errno != EINTR) {
229 fprintf(stderr,
"Captured %d bytes of audio data\n", br);
233 || ((br < 0) && ((errno == 0) || (errno == EAGAIN)))) {
236 }
while (p < buflen);
240 NETBSDAUDIO_FlushCapture(
_THIS)
246 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
252 const size_t len =
SDL_min(
sizeof (buf), remain);
253 const int br = read(this->hidden->audio_fd, buf, len);
262 NETBSDAUDIO_CloseDevice(
_THIS)
264 if (this->hidden->audio_fd >= 0) {
265 close(this->hidden->audio_fd);
272 NETBSDAUDIO_OpenDevice(
_THIS,
void *
handle,
const char *devname,
int iscapture)
277 audio_prinfo *prinfo = iscapture ? &info.play : &info.record;
281 if (devname ==
NULL) {
283 if (devname ==
NULL) {
291 if (this->hidden ==
NULL) {
297 this->hidden->audio_fd = open(devname, flags, 0);
298 if (this->hidden->audio_fd < 0) {
299 return SDL_SetError(
"Couldn't open %s: %s", devname, strerror(errno));
302 AUDIO_INITINFO(&info);
308 info.mode = iscapture ? AUMODE_RECORD : AUMODE_PLAY;
309 if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) < 0) {
310 return SDL_SetError(
"Couldn't put device into play mode");
313 AUDIO_INITINFO(&info);
318 prinfo->encoding = AUDIO_ENCODING_ULINEAR;
319 prinfo->precision = 8;
322 prinfo->encoding = AUDIO_ENCODING_SLINEAR;
323 prinfo->precision = 8;
326 prinfo->encoding = AUDIO_ENCODING_SLINEAR_LE;
327 prinfo->precision = 16;
330 prinfo->encoding = AUDIO_ENCODING_SLINEAR_BE;
331 prinfo->precision = 16;
334 prinfo->encoding = AUDIO_ENCODING_ULINEAR_LE;
335 prinfo->precision = 16;
338 prinfo->encoding = AUDIO_ENCODING_ULINEAR_BE;
339 prinfo->precision = 16;
345 if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) == 0) {
356 AUDIO_INITINFO(&info);
358 if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) == -1) {
361 AUDIO_INITINFO(&info);
362 prinfo->sample_rate = this->
spec.
freq;
366 (
void) ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info);
367 (
void) ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info);
368 this->
spec.
freq = prinfo->sample_rate;
372 this->hidden->mixlen = this->
spec.
size;
374 if (this->hidden->mixbuf ==
NULL) {
377 SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size);
380 NETBSDAUDIO_Status(
this);
407 "netbsd",
"NetBSD audio", NETBSDAUDIO_Init, 0
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
int SDL_IOReady(int fd, SDL_bool forWrite, int timeoutMS)
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.
SDL_AudioFormat SDL_NextAudioFormat(void)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
#define SDL_GetAudioDeviceName
void SDL_EnumUnixAudioDevices(const int classic, int(*test)(int))
EGLImageKHR EGLint EGLint * handle
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define OPEN_FLAGS_OUTPUT
#define SDL_AUDIO_BITSIZE(x)
void SDL_CalculateAudioSpec(SDL_AudioSpec *spec)
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)
void(* CloseDevice)(_THIS)
int AllowsArbitraryDeviceNames
void(* FlushCapture)(_THIS)
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
AudioBootStrap NETBSDAUDIO_bootstrap
Uint8 *(* GetDeviceBuf)(_THIS)