summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-01-11 12:04:18 +0000
committermav <mav@FreeBSD.org>2009-01-11 12:04:18 +0000
commitb95d10610bda5db5546103e55dddd01fad4a6eae (patch)
treec8d53da37bf98dbda42e716c522fcdbdcc7dabaa /sys/dev/sound
parentdd783f73a1ccb28bb1e5647466949f9c814e4592 (diff)
downloadFreeBSD-src-b95d10610bda5db5546103e55dddd01fad4a6eae.zip
FreeBSD-src-b95d10610bda5db5546103e55dddd01fad4a6eae.tar.gz
Fix unwanted crosschannel mixing, possible on some codecs like
VIA VT1708B and Realtek ALC268.
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/pci/hda/hdac.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index e3b0df4..c0d5d8a 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -83,7 +83,7 @@
#include "mixer_if.h"
-#define HDA_DRV_TEST_REV "20081226_0122"
+#define HDA_DRV_TEST_REV "20090110_0123"
SND_DECLARE_FILE("$FreeBSD$");
@@ -5554,7 +5554,7 @@ hdac_audio_disable_crossas(struct hdac_devinfo *devinfo)
struct hdac_audio_ctl *ctl;
int i, j;
- /* Disable crossassociatement connections. */
+ /* Disable crossassociatement and unwanted crosschannel connections. */
/* ... using selectors */
for (i = devinfo->startnode; i < devinfo->endnode; i++) {
w = hdac_widget_get(devinfo, i);
@@ -5572,7 +5572,10 @@ hdac_audio_disable_crossas(struct hdac_devinfo *devinfo)
cw = hdac_widget_get(devinfo, w->conns[j]);
if (cw == NULL || w->enable == 0)
continue;
- if (w->bindas == cw->bindas || cw->bindas == -2)
+ if (cw->bindas == -2)
+ continue;
+ if (w->bindas == cw->bindas &&
+ (w->bindseqmask & cw->bindseqmask) != 0)
continue;
w->connsenable[j] = 0;
HDA_BOOTHVERBOSE(
@@ -5591,7 +5594,8 @@ hdac_audio_disable_crossas(struct hdac_devinfo *devinfo)
if (ctl->widget->bindas == -2 ||
ctl->childwidget->bindas == -2)
continue;
- if (ctl->widget->bindas != ctl->childwidget->bindas) {
+ if (ctl->widget->bindas != ctl->childwidget->bindas ||
+ (ctl->widget->bindseqmask & ctl->childwidget->bindseqmask) == 0) {
ctl->forcemute = 1;
ctl->muted = HDA_AMP_MUTE_ALL;
ctl->left = 0;
OpenPOWER on IntegriCloud