Module Name:    src
Committed By:   christos
Date:           Sat Dec 17 15:18:28 UTC 2016

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

Log Message:
fix broken, audio_{g,s}et_port logic.


To generate a diff of this commit:
cvs rdiff -u -r1.282 -r1.283 src/sys/dev/audio.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/audio.c
diff -u src/sys/dev/audio.c:1.282 src/sys/dev/audio.c:1.283
--- src/sys/dev/audio.c:1.282	Fri Dec 16 17:14:15 2016
+++ src/sys/dev/audio.c	Sat Dec 17 10:18:28 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: audio.c,v 1.282 2016/12/16 22:14:15 christos Exp $	*/
+/*	$NetBSD: audio.c,v 1.283 2016/12/17 15:18:28 christos Exp $	*/
 
 /*-
  * Copyright (c) 2016 Nathanial Sloss <[email protected]>
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.282 2016/12/16 22:14:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.283 2016/12/17 15:18:28 christos Exp $");
 
 #include "audio.h"
 #if NAUDIO > 0
@@ -5623,63 +5623,51 @@ recswvol_func(struct audio_softc *sc, st
 static int
 audio_set_port(struct audio_softc *sc, mixer_ctrl_t *mc)
 {
-	int i, j, n;
-
 	KASSERT(mutex_owned(sc->sc_lock));
 
-	if (mc->dev >= sc->sc_static_nmixer_states) {
-		n = (mc->dev - sc->sc_static_nmixer_states) / 2;
-		i = j = 0;
-		while (i <= n) {
-			j++;
-			if (sc->sc_audiopid[j].pid != -1)
-				i++;
-		}
-		n = j;
+	int d = mc->dev - sc->sc_static_nmixer_states;
 
-		if ((mc->dev - sc->sc_static_nmixer_states) % 2 == 0) {
-			sc->sc_vchan[n]->sc_swvol =
-			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
-		} else {
-			sc->sc_vchan[n]->sc_recswvol =
-			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
-		}
+	if (d < 0)
+		return sc->hw_if->set_port(sc->hw_hdl, mc);
 
-		return 0;
-	}
+	size_t j, n = (size_t)d / 2;
+	
+	for (size_t i = j = 0; i <= n; i++)
+		if (sc->sc_audiopid[i].pid != -1)
+			j++;
+
+	uint8_t *level = &mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
+	uint8_t *vol = (d & 1) == 0 ?
+	    &sc->sc_vchan[j]->sc_swvol : &sc->sc_vchan[j]->sc_recswvol;
 
-	return sc->hw_if->set_port(sc->hw_hdl, mc);
+	*vol = *level;
+	return 0;
 }
 
 static int
 audio_get_port(struct audio_softc *sc, mixer_ctrl_t *mc)
 {
-	int i, j, n;
 
 	KASSERT(mutex_owned(sc->sc_lock));
 
-	if (mc->dev >= sc->sc_static_nmixer_states) {
-		n = (mc->dev - sc->sc_static_nmixer_states) / 2;
-		i = j = 0;
-		while (i <= n) {
+	int d = mc->dev - sc->sc_static_nmixer_states;
+
+	if (d < 0)
+		return sc->hw_if->get_port(sc->hw_hdl, mc);
+
+	size_t j, n = (size_t)d / 2;
+	
+	for (size_t i = j = 0; i <= n; i++)
+		if (sc->sc_audiopid[i].pid != -1)
 			j++;
-			if (sc->sc_audiopid[j].pid != -1)
-				i++;
-		}
-		n = j;
 
-		if ((mc->dev - sc->sc_static_nmixer_states) % 2 == 0) {
-			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
-			    sc->sc_vchan[n]->sc_swvol;
-		} else {
-			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
-			    sc->sc_vchan[n]->sc_recswvol;
-		}
+	u_char *level = &mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
+	uint8_t *vol = (d & 1) == 0 ?
+	    &sc->sc_vchan[j]->sc_swvol : &sc->sc_vchan[j]->sc_recswvol;
 
-		return 0;
-	}
+	*level = *vol;
+	return 0;
 
-	return sc->hw_if->get_port(sc->hw_hdl, mc);
 }
 
 static int

Reply via email to