Module Name:    src
Committed By:   mlelstv
Date:           Sun Apr 23 06:13:35 UTC 2023

Modified Files:
        src/sys/dev/usb: uaudio.c

Log Message:
Weed out duplicate sample rates and add comment about UAC2 clocks.


To generate a diff of this commit:
cvs rdiff -u -r1.179 -r1.180 src/sys/dev/usb/uaudio.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/usb/uaudio.c
diff -u src/sys/dev/usb/uaudio.c:1.179 src/sys/dev/usb/uaudio.c:1.180
--- src/sys/dev/usb/uaudio.c:1.179	Sun Apr 16 19:26:20 2023
+++ src/sys/dev/usb/uaudio.c	Sun Apr 23 06:13:35 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: uaudio.c,v 1.179 2023/04/16 19:26:20 mlelstv Exp $	*/
+/*	$NetBSD: uaudio.c,v 1.180 2023/04/23 06:13:35 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1999, 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uaudio.c,v 1.179 2023/04/16 19:26:20 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uaudio.c,v 1.180 2023/04/23 06:13:35 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -2479,9 +2479,20 @@ Static u_int
 uaudio_get_rates(struct uaudio_softc *sc, int mode, u_int *freqs, u_int len)
 {
 	struct mixerctl *mc;
-	u_int n, freq, start, end, step;
-	int j, k, count;
+	u_int freq, start, end, step;
+	u_int i, n;
+	u_int k, count;
+	int j;
 
+	/*
+	 * With UAC2 the sample rate isn't part of the data format,
+	 * instead, you have separate clock sources that may be
+	 * assigned to individual terminals (inputs, outputs).
+	 *
+	 * For audio(4) we only distinguish between input and output
+	 * formats and collect the unique rates from all possible clock
+	 * sources.
+	 */
 	n = 0;
 	for (j = 0; j < sc->sc_nratectls; ++j) {
 
@@ -2499,6 +2510,18 @@ uaudio_get_rates(struct uaudio_softc *sc
 			end   = (u_int) mc->ranges[k].maxval;
 			step  = (u_int) mc->ranges[k].resval;
 			for (freq = start; freq <= end; freq += step) {
+				/* remove duplicates */
+				for (i = 0; i < n; ++i) {
+					if (freqs[i] == freq)
+						break;
+				}
+				if (i < n) {
+					if (step == 0)
+						break;
+					continue;
+				}
+
+				/* store or count */
 				if (len != 0) {
 					if (n >= len)
 						goto done;

Reply via email to