Commit Diff


commit - 7fc831ea00ec72448ae3f54f24b047528daa61d8
commit + 185967030a0dc1ee4374b6b325846d5eb418a7f6
blob - 5ffd863eac37fe864762b9097dcebca55980af97
blob + 54e4fc551fa5328387a9796fb5c69c6d7fe2e7ee
--- player_mad.c
+++ player_mad.c
@@ -42,6 +42,7 @@ struct buffer {
 	const void *start;
 	size_t length;
 	int sample_rate;
+	int channels;
 };
 
 static enum mad_flow
@@ -56,6 +57,7 @@ input(void *d, struct mad_stream *stream)
 	mad_stream_buffer(stream, buffer->start, buffer->length);
 	buffer->length = 0;
 	buffer->sample_rate = 0;
+	buffer->channels = 0;
 	return MAD_FLOW_CONTINUE;
 }
 
@@ -93,17 +95,14 @@ output(void *data, const struct mad_header *header, st
 	leftch = pcm->samples[0];
 	rightch = pcm->samples[1];
 
-	if (buffer->sample_rate != pcm->samplerate) {
+	if (buffer->sample_rate != pcm->samplerate ||
+	    buffer->channels != pcm->channels) {
 		buffer->sample_rate = pcm->samplerate;
-		if (player_setup(pcm->samplerate, 2) == -1)
+		buffer->channels = pcm->channels;
+		if (player_setup(pcm->samplerate, pcm->channels) == -1)
 			err(1, "player_setrate");
 	}
 
-	if (pcm->channels != 2) {
-		printf("mono not supported!\n");
-		return MAD_FLOW_STOP;
-	}
-
 	for (i = 0, len = 0; i < nsamples; ++i) {
 		if (len+4 >= sizeof(buf)) {
 			sio_write(hdl, buf, len);
@@ -115,9 +114,11 @@ output(void *data, const struct mad_header *header, st
 		buf[len++] = sample & 0xff;
 		buf[len++] = (sample >> 8) & 0xff;
 
-		sample = scale(*rightch++);
-		buf[len++] = sample & 0xff;
-		buf[len++] = (sample >> 8) & 0xff;
+		if (pcm->channels == 2) {
+			sample = scale(*rightch++);
+			buf[len++] = sample & 0xff;
+			buf[len++] = (sample >> 8) & 0xff;
+		}
 	}
 
 	if (len != 0)