shithub: npe

Download patch

ref: 623f5427f2e5d9cbc7540e8e2a72981c973e4cac
parent: 3265f44938f2d6d8e954feac427aaf48a7c31b42
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Thu Mar 18 06:08:47 EDT 2021

sdl2: take audio logic into a separate file

--- /dev/null
+++ b/libnpe_sdl2/audio.c
@@ -1,0 +1,153 @@
+#include <SDL2/SDL.h>
+
+enum {
+	Aout = 2,
+	Arec,
+
+	Audiobufsz = 8192,
+};
+
+typedef struct Audiodev Audiodev;
+
+struct Audiodev {
+	QLock;
+	void (*cb)(void *, Uint8 *, int);
+	void *userdata;
+	char *name;
+	Channel *wait;
+	int paused;
+	int fd;
+	int pid;
+	int mode;
+	Uint8 buf[Audiobufsz];
+};
+
+/* FIXME extra USB audio devices? */
+static Audiodev au[4] = {
+	[0] = {.fd = -1, .mode = -1},
+	[1] = {.fd = -1, .mode = -1},
+	[Aout] = {.name = "/dev/audio", .fd = -1, .pid = -1, .mode = OWRITE},
+	[Arec] = {.name = "/dev/audio", .fd = -1, .pid = -1, .mode = OREAD},
+};
+
+int
+SDL_GetNumAudioDevices(int iscapture)
+{
+	/* FIXME look for extra USB devices? */
+	USED(iscapture);
+	return 1;
+}
+
+char *
+SDL_GetAudioDeviceName(int index, int iscapture)
+{
+	/* FIXME look for extra USB devices? */
+	USED(index);
+	return au[iscapture ? Arec : Aout].name;
+}
+
+void
+SDL_LockAudioDevice(SDL_AudioDeviceID id)
+{
+	qlock(&au[id]);
+}
+
+void
+SDL_UnlockAudioDevice(SDL_AudioDeviceID id)
+{
+	qunlock(&au[id]);
+}
+
+static void
+audiothread(void *p)
+{
+	Audiodev *a;
+
+	a = p;
+	threadsetname("%s (%s)", a->name, a->mode == OREAD ? "out" : "in");
+
+	for(;;){
+		qlock(a);
+		if(a->paused)
+			memset(a->buf, 0, sizeof(a->buf));
+		else
+			a->cb(a->userdata, a->buf, sizeof(a->buf));
+		qunlock(a);
+
+		if(write(a->fd, a->buf, sizeof(a->buf)) != sizeof(a->buf))
+			break;
+	}
+
+	sendul(a->wait, 0);
+
+	threadexits(nil);
+}
+
+void
+SDL_PauseAudioDevice(SDL_AudioDeviceID id, SDL_bool pause)
+{
+	Audiodev *a;
+
+	a = &au[id];
+	if(a->paused && !pause){
+		if(a->pid < 0)
+			a->pid = proccreate(audiothread, a, mainstacksize);
+		a->paused = 0;
+	}else if(!a->paused && pause){
+		a->paused = 1;
+	}
+}
+
+SDL_AudioDeviceID
+SDL_OpenAudioDevice(char *dev, int rec, SDL_AudioSpec *want, SDL_AudioSpec *have, u32int change)
+{
+	Audiodev *a;
+	SDL_AudioDeviceID id;
+
+	/* FIXME look for extra USB devices? */
+	USED(dev);
+
+	if(change != SDL_AUDIO_ALLOW_ANY_CHANGE){ /* FIXME sampling in mono */
+		werrstr("SDL_OpenAudioDevice: changes not implemented");
+		return 0;
+	}
+
+	have->freq = 44100;
+	have->format = AUDIO_S16;
+	have->channels = 2;
+	have->samples = want->samples;
+
+	id = rec ? Arec : Aout;
+	a = &au[id];
+
+	if(a->fd < 0 && (a->fd = open("/dev/audio", a->mode|OCEXEC)) < 0){
+		werrstr("SDL_OpenAudioDevice: %r");
+		return 0;
+	}
+
+	a->userdata = want->userdata;
+	a->cb = want->callback;
+	a->paused = 1;
+	a->wait = chancreate(sizeof(ulong), 0);
+
+	return id;
+}
+
+void
+SDL_CloseAudioDevice(SDL_AudioDeviceID id)
+{
+	Audiodev *a;
+
+	a = &au[id];
+
+	qlock(a);
+	close(a->fd);
+	a->fd = -1;
+	a->pid = -1;
+	a->userdata = nil;
+	a->cb = nil;
+	qunlock(a);
+
+	recvul(a->wait);
+	chanfree(a->wait);
+}
--- a/libnpe_sdl2/mkfile
+++ b/libnpe_sdl2/mkfile
@@ -6,6 +6,7 @@
 HFILES=\
 
 OFILES=\
+	audio.$O\
 	sdl2.$O\
 
 UPDATE=\
--- a/libnpe_sdl2/sdl2.c
+++ b/libnpe_sdl2/sdl2.c
@@ -10,12 +10,7 @@
 #include <sys/stat.h>
 #include "_npe.h"
 
-typedef struct Audiodev Audiodev;
-
 enum {
-	Aout = 2,
-	Arec,
-
 	/* FIXME missing plumber→dropfile */
 	Ckey = 0,
 	Ckeytype,
@@ -26,8 +21,6 @@
 	Rdown = 0,
 	Rup,
 	Rrepeat,
-
-	Audiobufsz = 16384,
 };
 
 struct SDL_Window {
@@ -63,25 +56,6 @@
 	.format = SDL_PIXELFORMAT_ARGB8888,
 };
 
-struct Audiodev {
-	QLock;
-	int paused;
-	int fd;
-	int pid;
-	int mode;
-	Uint8 buf[Audiobufsz];
-	void *userdata;
-	void (*cb)(void *, Uint8 *, int);
-};
-
-/* FIXME extra USB audio devices? */
-static Audiodev au[4] = {
-	[0] = {.fd = -1, .mode = -1},
-	[1] = {.fd = -1, .mode = -1},
-	[Aout] = {.fd = -1, .pid = -1, .mode = OWRITE},
-	[Arec] = {.fd = -1, .pid = -1, .mode = OREAD},
-};
-
 static SDL_Window onewin;
 static SDL_Renderer oneren;
 static int kmod;
@@ -275,121 +249,6 @@
 	setcursor(mctl, (cursor == nil && showcursor) ? nil : &nocursor);
 
 	return showcursor;
-}
-
-int
-SDL_GetNumAudioDevices(int iscapture)
-{
-	/* FIXME look for extra USB devices? */
-	USED(iscapture);
-	return 1;
-}
-
-char *
-SDL_GetAudioDeviceName(int index, int iscapture)
-{
-	/* FIXME look for extra USB devices? */
-	USED(index); USED(iscapture);
-	return "/dev/audio";
-}
-
-void
-SDL_LockAudioDevice(SDL_AudioDeviceID id)
-{
-	qlock(&au[id]);
-}
-
-void
-SDL_UnlockAudioDevice(SDL_AudioDeviceID id)
-{
-	qunlock(&au[id]);
-}
-
-static void
-audiothread(void *p)
-{
-	Audiodev *d;
-
-	d = p;
-	threadsetname("audio %s", d == &au[Aout] ? "out" : "in");
-
-	for(;;){
-		qlock(d);
-		if(d->paused)
-			memset(d->buf, 0, sizeof(d->buf));
-		else
-			d->cb(d->userdata, d->buf, sizeof(d->buf));
-		qunlock(d);
-
-		if(write(d->fd, d->buf, sizeof(d->buf)) != sizeof(d->buf))
-			break;
-	}
-
-	threadexits(nil);
-}
-
-void
-SDL_PauseAudioDevice(SDL_AudioDeviceID id, SDL_bool pause)
-{
-	Audiodev *a;
-
-	a = &au[id];
-	if(a->paused && !pause){
-		if(a->pid < 0)
-			a->pid = proccreate(audiothread, a, mainstacksize);
-		a->paused = 0;
-	}else if(!a->paused && pause){
-		a->paused = 1;
-	}
-}
-
-SDL_AudioDeviceID
-SDL_OpenAudioDevice(char *dev, int rec, SDL_AudioSpec *want, SDL_AudioSpec *have, u32int change)
-{
-	Audiodev *a;
-	SDL_AudioDeviceID id;
-
-	/* FIXME look for extra USB devices? */
-	USED(dev);
-
-	if(change != SDL_AUDIO_ALLOW_ANY_CHANGE){ /* FIXME sampling in mono */
-		werrstr("SDL_OpenAudioDevice: changes not implemented");
-		return 0;
-	}
-
-	have->freq = 44100;
-	have->format = AUDIO_S16;
-	have->channels = 2;
-	have->samples = want->samples;
-
-	id = rec ? Arec : Aout;
-	a = &au[id];
-
-	if(a->fd < 0 && (a->fd = open("/dev/audio", a->mode|OCEXEC)) < 0){
-		werrstr("SDL_OpenAudioDevice: %r");
-		return 0;
-	}
-
-	a->userdata = want->userdata;
-	a->cb = want->callback;
-	a->paused = 1;
-
-	return id;
-}
-
-void
-SDL_CloseAudioDevice(SDL_AudioDeviceID id)
-{
-	Audiodev *a;
-
-	a = &au[id];
-	qlock(a);
-	close(a->fd);
-	a->fd = -1;
-	a->pid = -1;
-	a->userdata = nil;
-	a->cb = nil;
-	qunlock(a);
 }
 
 u64int