summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Meuser <jakemsr@cvs.openbsd.org>2009-05-01 02:55:17 +0000
committerJacob Meuser <jakemsr@cvs.openbsd.org>2009-05-01 02:55:17 +0000
commit6d410f7d6372bae1272a5a228f8ed28bf9d5dce8 (patch)
tree2c1ad7df540717f7d542c591313a51d138a0d769
parent16ddb2df214a31dcae5a99afc5e5c45534c38ffa (diff)
allow jack sensing to mute the DAC the speaker is connected to by
default, as long is the first output pin is not also connected to that DAC. cleanup a bit now that there are multiple muting methods.
-rw-r--r--sys/dev/pci/azalia.h7
-rw-r--r--sys/dev/pci/azalia_codec.c40
2 files changed, 36 insertions, 11 deletions
diff --git a/sys/dev/pci/azalia.h b/sys/dev/pci/azalia.h
index a3bc08cd13c..42780cf1806 100644
--- a/sys/dev/pci/azalia.h
+++ b/sys/dev/pci/azalia.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: azalia.h,v 1.43 2009/04/24 16:05:06 jakemsr Exp $ */
+/* $OpenBSD: azalia.h,v 1.44 2009/05/01 02:55:16 jakemsr Exp $ */
/* $NetBSD: azalia.h,v 1.6 2006/01/16 14:15:26 kent Exp $ */
/*-
@@ -670,6 +670,11 @@ typedef struct codec_t {
nid_t spkr_dac;
int spkr_muters;
+ int spkr_mute_method;
+#define AZ_SPKR_MUTE_NONE 0
+#define AZ_SPKR_MUTE_SPKR_MUTE 1
+#define AZ_SPKR_MUTE_SPKR_DIR 2
+#define AZ_SPKR_MUTE_DAC_MUTE 3
volgroup_t playvols;
volgroup_t recvols;
diff --git a/sys/dev/pci/azalia_codec.c b/sys/dev/pci/azalia_codec.c
index 16d2cb276f2..83f82560f9c 100644
--- a/sys/dev/pci/azalia_codec.c
+++ b/sys/dev/pci/azalia_codec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: azalia_codec.c,v 1.120 2009/04/27 23:49:04 jakemsr Exp $ */
+/* $OpenBSD: azalia_codec.c,v 1.121 2009/05/01 02:55:16 jakemsr Exp $ */
/* $NetBSD: azalia_codec.c,v 1.8 2006/05/10 11:17:27 kent Exp $ */
/*-
@@ -445,15 +445,22 @@ azalia_generic_unsol(codec_t *this, int tag)
}
if (err)
break;
- if ((this->w[this->speaker].widgetcap & COP_AWCAP_OUTAMP) &&
- (this->w[this->speaker].outamp_cap & COP_AMPCAP_MUTE)) {
+ switch(this->spkr_mute_method) {
+ case AZ_SPKR_MUTE_SPKR_MUTE:
mc.un.ord = vol;
err = azalia_generic_mixer_set(this, this->speaker,
MI_TARGET_OUTAMP, &mc);
- } else {
+ break;
+ case AZ_SPKR_MUTE_SPKR_DIR:
mc.un.ord = vol ? 0 : 1;
err = azalia_generic_mixer_set(this, this->speaker,
MI_TARGET_PINDIR, &mc);
+ break;
+ case AZ_SPKR_MUTE_DAC_MUTE:
+ mc.un.ord = vol;
+ err = azalia_generic_mixer_set(this, this->spkr_dac,
+ MI_TARGET_OUTAMP, &mc);
+ break;
}
break;
@@ -893,12 +900,25 @@ azalia_generic_mixer_init(codec_t *this)
}
/* spkr mute by jack sense */
- w = &this->w[this->speaker];
- if (this->nsense_pins > 0 && this->speaker != -1 &&
- (((w->widgetcap & COP_AWCAP_OUTAMP) &&
- (w->outamp_cap & COP_AMPCAP_MUTE)) ||
- ((w->d.pin.cap & COP_PINCAP_OUTPUT) &&
- (w->d.pin.cap & COP_PINCAP_INPUT)))) {
+ this->spkr_mute_method = AZ_SPKR_MUTE_NONE;
+ if (this->speaker != -1 && this->spkr_dac != -1 && this->nsense_pins > 0) {
+ w = &this->w[this->speaker];
+ if ((w->widgetcap & COP_AWCAP_OUTAMP) &&
+ (w->outamp_cap & COP_AMPCAP_MUTE))
+ this->spkr_mute_method = AZ_SPKR_MUTE_SPKR_MUTE;
+ else if ((w->d.pin.cap & COP_PINCAP_OUTPUT) &&
+ (w->d.pin.cap & COP_PINCAP_INPUT))
+ this->spkr_mute_method = AZ_SPKR_MUTE_SPKR_DIR;
+ else {
+ w = &this->w[this->spkr_dac];
+ if (w->nid != this->dacs.groups[0].conv[0] &&
+ (w->widgetcap & COP_AWCAP_OUTAMP) &&
+ (w->outamp_cap & COP_AMPCAP_MUTE))
+ this->spkr_mute_method = AZ_SPKR_MUTE_DAC_MUTE;
+ }
+ }
+ if (this->spkr_mute_method != AZ_SPKR_MUTE_NONE) {
+ w = &this->w[this->speaker];
MIXER_REG_PROLOG;
m->nid = w->nid;
snprintf(d->label.name, sizeof(d->label.name),