Module Name:    src
Committed By:   mlelstv
Date:           Mon Apr 10 15:04:49 UTC 2023

Modified Files:
        src/sys/dev/pad: pad.c

Log Message:
Write slinear_le 16bit samples, independent from platform and
AUDIO_INTERNAL_BITS.


To generate a diff of this commit:
cvs rdiff -u -r1.79 -r1.80 src/sys/dev/pad/pad.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.79 src/sys/dev/pad/pad.c:1.80
--- src/sys/dev/pad/pad.c:1.79	Tue Jan 24 08:17:11 2023
+++ src/sys/dev/pad/pad.c	Mon Apr 10 15:04:49 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.79 2023/01/24 08:17:11 mlelstv Exp $ */
+/* $NetBSD: pad.c,v 1.80 2023/04/10 15:04:49 mlelstv Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.79 2023/01/24 08:17:11 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.80 2023/04/10 15:04:49 mlelstv Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -745,7 +745,7 @@ pad_swvol_codec(audio_filter_arg_t *arg)
 {
 	struct pad_softc *sc = arg->context;
 	const aint_t *src;
-	aint_t *dst;
+	uint8_t *dst;
 	u_int sample_count;
 	u_int i;
 
@@ -755,7 +755,30 @@ pad_swvol_codec(audio_filter_arg_t *arg)
 	for (i = 0; i < sample_count; i++) {
 		aint2_t v = (aint2_t)(*src++);
 		v = v * sc->sc_swvol / 255;
-		*dst++ = (aint_t)v;
+
+		CTASSERT(PADPREC <= AUDIO_INTERNAL_BITS * 2);
+#if PADPREC > AUDIO_INTERNAL_BITS
+		v = v << (PADPREC - AUDIO_INTERNAL_BITS);
+#elif PADPREC < AUDIO_INTERNAL_BITS
+		v = v >> (AUDIO_INTERNAL_BITS - PADPREC);
+#endif
+
+		/* AUDIO_ENCODING_SLINEAR_LE */
+#if PADPREC > 0
+		*dst++ = v;
+#endif
+#if PADPREC > 8
+		v >>= 8;
+		*dst++ = v;
+#endif
+#if PADPREC > 16
+		v >>= 8;
+		*dst++ = v;
+#endif
+#if PADPREC > 24
+		v >>= 8;
+		*dst++ = v;
+#endif
 	}
 }
 

Reply via email to