On Mon, Mar 8, 2010 at 1:29 AM, Jacob Meuser <jake...@sdf.lonestar.org>wrote:

>
> won't help with this problem.  the GPIOs in azalia aren't exposed
> through gpioctl.
>


I've learned something!



>
> it's probably a matter of figuring out what's "special" about the
> headphone jack on the Macs.  turning on VRef for output seems odd, but
> apparently works for some of the MacbookPro models.
>
> of course, you'll probably want to turn up outputs.master and/or
> outputs.mix3 ...
>
>
Actually, the headphones jack is now working correctly.
I had applied your larger patch to fresh sources, not including your first
patch.
I put 0x00a1106b back to AZ_QRK_WID_OVREF50.
Now that I've eliminated user retardation all seems well with no mixerctl
changes.

On a related note, I have not spent enough time with CVS to figure out easy
patch management while helping you. I applied these patches the
old-fashioned way.
Hence, my desire to show you these diffs (functional!):

--- azalia.c.orig    Mon Mar  8 08:04:56 2010
+++ azalia.c    Mon Mar  8 08:04:56 2010
@@ -1660,7 +1660,8 @@

     this->na_dacs = this->na_dacs_d = 0;
     this->na_adcs = this->na_adcs_d = 0;
-    this->speaker = this->spkr_dac = this->fhp = this->fhp_dac =
+        this->speaker = this->speaker2 = this->spkr_dac =
+            this->fhp = this->fhp_dac =
         this->mic = this->mic_adc = -1;
     this->nsense_pins = 0;
     this->nout_jacks = 0;
@@ -1704,13 +1705,22 @@
             case CORB_CD_FIXED:
                 switch (w->d.pin.device) {
                 case CORB_CD_SPEAKER:
-                    if ((this->speaker == -1) ||
-                        (w->d.pin.association <
-                        this->w[this->speaker].d.pin.association)) {
+                                        if (this->speaker == -1) {
                         this->speaker = i;
+                                        } else if (w->d.pin.association <
+
this->w[this->speaker].d.pin.association ||
+                                            (w->d.pin.association ==
+
this->w[this->speaker].d.pin.association &&
+                                            w->d.pin.sequence <
+
this->w[this->speaker].d.pin.sequence)) {
+                                                this->speaker2 =
this->speaker;
+                                                this->speaker = i;
+                                        } else {
+                                                this->speaker2 = i;
+                                        }
+                                        if (this->speaker == i)
                         this->spkr_dac =
                             azalia_codec_find_defdac(this, i, 0);
-                    }
                     break;
                 case CORB_CD_MICIN:
                     this->mic = i;
@@ -1938,7 +1948,8 @@
             switch(w->d.pin.device) {
             /* primary - output by default */
             case CORB_CD_SPEAKER:
-                if (w->nid == this->speaker)
+                                if (w->nid == this->speaker ||
+                                    w->nid == this->speaker2)
                     break;
                 /* FALLTHROUGH */
             case CORB_CD_HEADPHONE:
@@ -1991,7 +2002,8 @@
                 break;
             /* secondary - output by default */
             case CORB_CD_SPEAKER:
-                if (w->nid == this->speaker)
+                                if (w->nid == this->speaker ||
+                                    w->nid == this->speaker2)
                     break;
                 /* FALLTHROUGH */
             case CORB_CD_HEADPHONE:
@@ -2264,6 +2276,27 @@
                 this->spkr_dac = conv;
             else
                 this->opins[0].conv = conv;
+                }
+        }
+
+        /* If there is a speaker2, try to connect it to spkr_dac. */
+        if (this->speaker2 != -1) {
+                conn = conv = -1;
+                w = &this->w[this->speaker2];
+                for (i = 0; i < w->nconnections; i++) {
+                        conv = azalia_codec_find_defdac(this,
+                            w->connections[i], 1);
+                        if (conv == this->spkr_dac) {
+                                conn = i;
+                                break;
+                        }
+                }
+                if (conn != -1) {
+                        err = azalia_comresp(this, w->nid,
+                            CORB_SET_CONNECTION_SELECT_CONTROL, conn, 0);
+                        if (err)
+                                return(err);
+                        w->selected = conn;
                }
        }

--- azalia.h.orig    Mon Mar  8 08:04:56 2010
+++ azalia.h    Mon Mar  8 08:04:56 2010
@@ -536,7 +536,7 @@
 } __packed rirb_entry_t;


-#define AZALIA_DEBUG
+/* #define AZALIA_DEBUG */
 #ifdef AZALIA_DEBUG
 # define DPRINTF(x)    do { printf x; } while (0/*CONSTCOND*/)
 #else
@@ -691,7 +691,8 @@
     nid_t mic;        /* fixed (internal) mic */
     nid_t mic_adc;
     nid_t speaker;        /* fixed (internal) speaker */
-    nid_t spkr_dac;
+        nid_t speaker2;         /* 2nd fixed (internal) speaker */
+        nid_t spkr_dac;         /* default DAC for speaker and speaker2 */
     nid_t input_mixer;
     nid_t fhp;        /* front headphone jack */
     nid_t fhp_dac;
--- azalia_codec.c.orig    Mon Mar  8 08:04:56 2010
+++ azalia_codec.c    Mon Mar  8 08:04:56 2010
@@ -132,7 +132,8 @@
             this->subid == 0x00a3106b) {    /* APPLE_MB4 */
             this->qrks |= AZ_QRK_GPIO_UNMUTE_0;
         }
-        if (this->subid == 0x00a0106b)
+                if (this->subid == 0x00a1106b ||
+                    this->subid == 0x00a0106b)
             this->qrks |= AZ_QRK_WID_OVREF50;
         break;
     case 0x10ec0888:
@@ -547,11 +548,17 @@
             mc.un.ord = vol;
             err = azalia_mixer_set(this, this->speaker,
                 MI_TARGET_OUTAMP, &mc);
+                        if (this->speaker2 != -1)
+                                err = azalia_mixer_set(this,
this->speaker2,
+                                    MI_TARGET_OUTAMP, &mc);
             break;
         case AZ_SPKR_MUTE_SPKR_DIR:
             mc.un.ord = vol ? 0 : 1;
             err = azalia_mixer_set(this, this->speaker,
                 MI_TARGET_PINDIR, &mc);
+                        if (this->speaker2 != -1)
+                                err = azalia_mixer_set(this,
this->speaker2,
+                                    MI_TARGET_PINDIR, &mc);
             break;
         case AZ_SPKR_MUTE_DAC_MUTE:
             mc.un.ord = vol;
@@ -763,7 +770,8 @@
         /* input mute */
         if (w->widgetcap & COP_AWCAP_INAMP &&
             w->inamp_cap & COP_AMPCAP_MUTE &&
-            w->nid != this->speaker) {
+                    w->nid != this->speaker &&
+                    w->nid != this->speaker2) {
             if (w->type != COP_AWTYPE_AUDIO_MIXER) {
                 MIXER_REG_PROLOG;
                 snprintf(d->label.name, sizeof(d->label.name),
@@ -790,7 +798,8 @@
                     if (!azalia_widget_enabled(this,
                         w->connections[j]))
                         continue;
-                    if (w->connections[j] == this->speaker)
+                                        if (w->connections[j] ==
this->speaker ||
+                                            w->connections[j] ==
this->speaker2)
                         continue;
                     d->un.s.member[k].mask = 1 << j;
                     strlcpy(d->un.s.member[k].label.name,
@@ -807,7 +816,8 @@
         /* input gain */
         if (w->widgetcap & COP_AWCAP_INAMP &&
             COP_AMPCAP_NUMSTEPS(w->inamp_cap) &&
-            w->nid != this->speaker) {
+                    w->nid != this->speaker &&
+                    w->nid != this->speaker2) {
             if (w->type != COP_AWTYPE_AUDIO_SELECTOR &&
                 w->type != COP_AWTYPE_AUDIO_MIXER) {
                 MIXER_REG_PROLOG;
@@ -829,7 +839,8 @@
                     if (!azalia_widget_enabled(this,
                         w->connections[j]))
                         continue;
-                    if (w->connections[j] == this->speaker)
+                                        if (w->connections[j] ==
this->speaker ||
+                                            w->connections[j] ==
this->speaker2)
                         continue;
                     MIXER_REG_PROLOG;
                     snprintf(d->label.name,
@@ -868,7 +879,8 @@
                 if (!azalia_widget_enabled(this,
                     w->connections[j]))
                     continue;
-                if (w->connections[j] == this->speaker)
+                                if (w->connections[j] == this->speaker ||
+                                    w->connections[j] == this->speaker2)
                     continue;
                 d->un.s.member[k].mask = 1 << j;
                 strlcpy(d->un.s.member[k].label.name,

Reply via email to