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) {
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