Recently Written · git

sad

sad (2f30.org simple audio daemon) with a Cygwin/OSS port on branch cygwin

git clone https://github.com/equwal/sad

Log | Files | Refs


commit b86364909a9bf32c03b18f8699c493bee125c474
sin <sin@2f30.org>
2014-12-31 17:58:19 +0000

Use Format for outputs too

 alsa.c       |  6 +++---
 config.def.h | 39 ++++++++++++++++++++++++++++++++++++---
 fifo.c       |  2 +-
 output.c     | 18 +++++++-----------
 sad.h        |  2 +-
 sndio.c      | 12 ++++++------
 6 files changed, 54 insertions(+), 25 deletions(-)
diff --git a/alsa.c b/alsa.c
index 85c0843..cb6620f 100644
--- a/alsa.c
+++ b/alsa.c
@@ -60,7 +60,7 @@ err0:
 }
 
 static int
-alsaopen(int bits, int rate, int channels)
+alsaopen(Format *fmt)
 {
 	snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
 	int r;
@@ -71,12 +71,12 @@ alsaopen(int bits, int rate, int channels)
 	}
 
 	if ((r = snd_pcm_set_params(hdl, format, SND_PCM_ACCESS_RW_INTERLEAVED,
-	     channels, rate, 1, 500000)) < 0) {
+	     fmt->channels, fmt->rate, 1, 500000)) < 0) {
 		warnx("send_pcm_set_params: %s\n", snd_strerror(r));
 		goto err0;
 	}
 
-	framesize = (bits + 7) / 8 * channels;
+	framesize = (fmt->bits + 7) / 8 * fmt->channels;
 	return 0;
 
 err0:
diff --git a/config.def.h b/config.def.h
index 410b065..e008986 100644
--- a/config.def.h
+++ b/config.def.h
@@ -1,7 +1,40 @@
 #define RESAMPLEQUALITY SOXR_QQ
 
 Outputdesc outputdescs[] = {
-	{ "sndio", 16, 44100, 2, 0, 0, &sndiooutput, NULL },
-	{ "alsa" , 16, 44100, 2, 1, 0, &alsaoutput,  NULL },
-	{ "fifo",  16, 44100, 2, 0, 0, &fifooutput,  NULL },
+	{
+		.name = "sndio",
+		.fmt = {
+			.bits = 16,
+			.rate = 44100,
+			.channels = 2
+		},
+		.enabled = 0,
+		.active = 0,
+		.output = &sndiooutput,
+		.resampler = NULL
+	},
+	{
+		.name = "alsa",
+		.fmt = {
+			.bits = 16,
+			.rate = 44100,
+			.channels = 2
+		},
+		.enabled = 0,
+		.active = 0,
+		.output = &alsaoutput,
+		.resampler = NULL
+	},
+	{
+		.name = "fifo",
+		.fmt = {
+			.bits = 16,
+			.rate = 44100,
+			.channels = 2
+		},
+		.enabled = 0,
+		.active = 0,
+		.output = &fifooutput,
+		.resampler = NULL
+	},
 };
diff --git a/fifo.c b/fifo.c
index 2f77845..8da3f5e 100644
--- a/fifo.c
+++ b/fifo.c
@@ -19,7 +19,7 @@ fifovol(int vol)
 }
 
 static int
-fifoopen(int bits, int rate, int channels)
+fifoopen(Format *fmt)
 {
 	unlink("/tmp/sad-fifo");
 	if (mkfifo("/tmp/sad-fifo", 0644) < 0) {
diff --git a/output.c b/output.c
index a5d091f..c5bff4f 100644
--- a/output.c
+++ b/output.c
@@ -12,9 +12,7 @@
 
 typedef struct {
 	char   *name;
-	int     bits;
-	int     rate;
-	int     channels;
+	Format  fmt;
 	int     enabled;
 	int     active;
 	Output *output;
@@ -35,8 +33,8 @@ initresampler(Format *fmt, Outputdesc *desc)
 
 	if (desc->resampler)
 		soxr_delete(desc->resampler);
-	desc->resampler = soxr_create(fmt->rate, desc->rate,
-	                              desc->channels,
+	desc->resampler = soxr_create(fmt->rate, desc->fmt.rate,
+	                              desc->fmt.channels,
 	                              NULL,
 	                              &iospec,
 	                              &quality,
@@ -73,9 +71,7 @@ openoutput(Outputdesc *desc)
 	if (desc->active)
 		return 0;
 
-	if (desc->output->open(desc->bits,
-	                       desc->rate,
-	                       desc->channels) < 0) {
+	if (desc->output->open(&desc->fmt) < 0) {
 		desc->active = 0;
 		return -1;
 	}
@@ -144,16 +140,16 @@ playoutput(Format *fmt, Outputdesc *desc, void *inbuf, size_t nbytes)
 	if (!desc->active)
 		return 0;
 
-	if (desc->rate == fmt->rate) {
+	if (desc->fmt.rate == fmt->rate) {
 		if (desc->output->play(inbuf, nbytes) < 0)
 			return -1;
 		return 0;
 	}
 
 	/* perform SRC */
-	framesize = (desc->bits + 7) / 8 * desc->channels;
+	framesize = (desc->fmt.bits + 7) / 8 * desc->fmt.channels;
 	inframes = nbytes / framesize;
-	ratio = (float)desc->rate / fmt->rate;
+	ratio = (float)desc->fmt.rate / fmt->rate;
 	outframes = inframes * ratio + 1;
 	outbuf = malloc(outframes * framesize);
 	if (!outbuf)
diff --git a/sad.h b/sad.h
index e2e3eb1..1ba2fa1 100644
--- a/sad.h
+++ b/sad.h
@@ -42,7 +42,7 @@ typedef struct {
 
 typedef struct {
 	int (*vol)(int);
-	int (*open)(int, int, int);
+	int (*open)(Format *);
 	int (*play)(void *, size_t);
 	int (*close)(void);
 } Output;
diff --git a/sndio.c b/sndio.c
index 221dd22..803fd8e 100644
--- a/sndio.c
+++ b/sndio.c
@@ -20,7 +20,7 @@ sndiovol(int vol)
 }
 
 static int
-sndioopen(int bits, int rate, int channels)
+sndioopen(Format *fmt)
 {
 	struct sio_par par;
 
@@ -31,9 +31,9 @@ sndioopen(int bits, int rate, int channels)
 	}
 
 	sio_initpar(&par);
-	par.bits = bits;
-	par.rate = rate;
-	par.pchan = channels;
+	par.bits = fmt->bits;
+	par.rate = fmt->rate;
+	par.pchan = fmt->channels;
 	par.sig = 1;
 	par.le = SIO_LE_NATIVE;
 
@@ -42,8 +42,8 @@ sndioopen(int bits, int rate, int channels)
 		goto err0;
 	}
 
-	if (par.bits != bits || par.rate != rate ||
-	    par.pchan != channels || par.le != SIO_LE_NATIVE ||
+	if (par.bits != fmt->bits || par.rate != fmt->rate ||
+	    par.pchan != fmt->channels || par.le != SIO_LE_NATIVE ||
 	    par.sig != 1) {
 		warnx("unsupported audio params");
 		goto err0;