21#include "../../SDL_internal.h"
23#if SDL_AUDIO_DRIVER_NETBSD
37#include <sys/audioio.h>
41#include "../../core/unix/SDL_poll.h"
42#include "../SDL_audio_c.h"
43#include "../SDL_audiodev_c.h"
49NETBSDAUDIO_DetectDevices(
void)
56NETBSDAUDIO_Status(
_THIS)
61 const struct audio_prinfo *prinfo;
63 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
64 fprintf(stderr,
"AUDIO_GETINFO failed.\n");
68 prinfo = this->iscapture ? &info.record : &info.play;
72 "buffer size : %d bytes\n"
73 "sample rate : %i Hz\n"
75 "precision : %i-bit\n"
81 "error occured : %s\n"
85 this->iscapture ?
"record" :
"play",
94 prinfo->pause ?
"yes" :
"no",
95 prinfo->error ?
"yes" :
"no",
96 prinfo->waiting ?
"yes" :
"no",
97 prinfo->active ?
"yes" :
"no");
101 "monitor_gain : %i\n"
102 "hw block size : %d bytes\n"
103 "hi watermark : %i\n"
104 "lo watermark : %i\n"
109 info.hiwat, info.lowat,
110 (info.mode == AUMODE_PLAY) ?
"PLAY"
111 : (info.mode = AUMODE_RECORD) ?
"RECORD"
112 : (info.mode == AUMODE_PLAY_ALL ?
"PLAY_ALL" :
"?"));
127NETBSDAUDIO_PlayDevice(
_THIS)
133 written = write(
h->audio_fd,
h->mixbuf,
h->mixlen);
142 fprintf(stderr,
"Wrote %d bytes of audio data\n",
written);
147NETBSDAUDIO_GetDeviceBuf(
_THIS)
149 return (this->hidden->mixbuf);
154NETBSDAUDIO_CaptureFromDevice(
_THIS,
void *_buffer,
int buflen)
159 br = read(this->hidden->audio_fd,
buffer, buflen);
167 fprintf(stderr,
"Captured %d bytes of audio data\n", br);
173NETBSDAUDIO_FlushCapture(
_THIS)
179 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
186 const int br = read(this->hidden->audio_fd,
buf,
len);
195NETBSDAUDIO_CloseDevice(
_THIS)
197 if (this->hidden->audio_fd >= 0) {
198 close(this->hidden->audio_fd);
209 struct audio_prinfo *prinfo = iscapture ? &info.record : &info.play;
213 if (devname ==
NULL) {
215 if (devname ==
NULL) {
223 if (this->hidden ==
NULL) {
229 this->hidden->audio_fd = open(devname,
iscapture ? O_RDONLY : O_WRONLY);
230 if (this->hidden->audio_fd < 0) {
231 return SDL_SetError(
"Couldn't open %s: %s", devname, strerror(errno));
234 AUDIO_INITINFO(&info);
236 prinfo->encoding = AUDIO_ENCODING_NONE;
241 prinfo->encoding = AUDIO_ENCODING_ULINEAR;
242 prinfo->precision = 8;
245 prinfo->encoding = AUDIO_ENCODING_SLINEAR;
246 prinfo->precision = 8;
249 prinfo->encoding = AUDIO_ENCODING_SLINEAR_LE;
250 prinfo->precision = 16;
253 prinfo->encoding = AUDIO_ENCODING_SLINEAR_BE;
254 prinfo->precision = 16;
257 prinfo->encoding = AUDIO_ENCODING_ULINEAR_LE;
258 prinfo->precision = 16;
261 prinfo->encoding = AUDIO_ENCODING_ULINEAR_BE;
262 prinfo->precision = 16;
265 if (prinfo->encoding != AUDIO_ENCODING_NONE) {
271 if (prinfo->encoding == AUDIO_ENCODING_NONE) {
280 info.mode =
iscapture ? AUMODE_RECORD : AUMODE_PLAY;
284 prinfo->sample_rate = this->
spec.
freq;
286 (
void) ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info);
288 (
void) ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info);
289 this->
spec.
freq = prinfo->sample_rate;
294 this->hidden->mixlen = this->
spec.
size;
296 if (this->hidden->mixbuf ==
NULL) {
299 SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size);
302 NETBSDAUDIO_Status(
this);
328 "netbsd",
"NetBSD audio", NETBSDAUDIO_Init, 0
void SDL_CalculateAudioSpec(SDL_AudioSpec *spec)
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)
SDL_AudioFormat SDL_NextAudioFormat(void)
Uint16 SDL_AudioFormat
Audio format flags.
#define SDL_AUDIO_BITSIZE(x)
void SDL_EnumUnixAudioDevices(const int classic, int(*test)(int))
#define SDL_GetAudioDeviceName
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
#define SDL_OutOfMemory()
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
GLenum GLuint GLenum GLsizei const GLchar * buf
GLfloat GLfloat GLfloat GLfloat h
AudioBootStrap NETBSDAUDIO_bootstrap
EGLImageKHR EGLint EGLint * handle
void(* PlayDevice)(_THIS)
void(* CloseDevice)(_THIS)
void(* FlushCapture)(_THIS)
void(* DetectDevices)(void)
int AllowsArbitraryDeviceNames
int(* CaptureFromDevice)(_THIS, void *buffer, int buflen)
int(* OpenDevice)(_THIS, void *handle, const char *devname, int iscapture)
Uint8 *(* GetDeviceBuf)(_THIS)