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" 49 NETBSDAUDIO_DetectDevices(
void)
56 NETBSDAUDIO_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" :
"?"));
127 NETBSDAUDIO_PlayDevice(
_THIS)
142 fprintf(stderr,
"Wrote %d bytes of audio data\n", written);
147 NETBSDAUDIO_GetDeviceBuf(
_THIS)
149 return (this->hidden->mixbuf);
154 NETBSDAUDIO_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);
173 NETBSDAUDIO_FlushCapture(
_THIS)
179 if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) {
185 const size_t len =
SDL_min(
sizeof (buf), remain);
186 const int br = read(this->hidden->audio_fd, buf, len);
195 NETBSDAUDIO_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
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
void(* DetectDevices)(void)
GLfloat GLfloat GLfloat GLfloat h
void(* PlayDevice)(_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
#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)