$OpenBSD: patch-src_output_sndio_c,v 1.1 2009/04/28 19:07:26 naddy Exp $
--- src/output/sndio.c.orig	Wed Mar 25 00:36:02 2009
+++ src/output/sndio.c	Tue Mar 31 22:32:09 2009
@@ -46,6 +46,14 @@ static int open_sndio(audio_output_t *ao)
 		par.sig = 0;
 		par.bits = 16;
 		break;
+	case MPG123_ENC_SIGNED_32:
+		par.sig = 1;
+		par.bits = 32;
+		break;
+	case MPG123_ENC_UNSIGNED_32:
+		par.sig = 0;
+		par.bits = 32;
+		break;
 	case MPG123_ENC_UNSIGNED_8:
 		par.sig = 0;
 		par.bits = 8;
@@ -67,15 +75,27 @@ static int open_sndio(audio_output_t *ao)
 		sio_close(hdl);
 		return -1;
 	}
-	if ((par.bits != 8 && par.bits != 16) || par.le != SIO_LE_NATIVE) {
+	if ((par.bits != 8 && par.bits != 16 && par.bits != 32) ||
+	    par.le != SIO_LE_NATIVE) {
 		sio_close(hdl);
 		return -1;
 	}
 	ao->rate = par.rate;
 	ao->channels = par.pchan;
-	ao->format = (par.bits == 8) ?
-	    (par.sig ? MPG123_ENC_SIGNED_8 : MPG123_ENC_UNSIGNED_8) :
-	    (par.sig ? MPG123_ENC_SIGNED_16 : MPG123_ENC_UNSIGNED_16);
+	switch (par.bits) {
+	case 8:
+		ao->format = par.sig ? MPG123_ENC_SIGNED_8 :
+		    MPG123_ENC_UNSIGNED_8;
+		break;
+	case 16:
+		ao->format = par.sig ? MPG123_ENC_SIGNED_16 :
+		    MPG123_ENC_UNSIGNED_16;
+		break;
+	case 32:
+		ao->format = par.sig ? MPG123_ENC_SIGNED_32 :
+		    MPG123_ENC_UNSIGNED_32;
+		break;
+	}
 	ao->userptr = hdl;
 	return 0;
 }
@@ -83,6 +103,7 @@ static int open_sndio(audio_output_t *ao)
 static int get_formats_sndio(audio_output_t *ao)
 {
 	return (MPG123_ENC_SIGNED_16|MPG123_ENC_UNSIGNED_16|
+	    MPG123_ENC_SIGNED_32|MPG123_ENC_UNSIGNED_32|
 	    MPG123_ENC_UNSIGNED_8|MPG123_ENC_SIGNED_8);
 }
 
