Index: /trunk/src/VBox/Devices/Audio/DevCodec.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevCodec.cpp	(revision 31189)
+++ /trunk/src/VBox/Devices/Audio/DevCodec.cpp	(revision 31190)
@@ -93,7 +93,6 @@
 #define STAC9220_IS_SPDIFOUT_CMD(cmd) (CODEC_NID((cmd)) == 0x8)
 
-#define STAC9220_IS_DIGPIN_CMD(cmd) (   \
-       CODEC_NID((cmd)) == 0x10         \
-    || CODEC_NID((cmd)) == 0x11)
+#define STAC9220_IS_DIGINPIN_CMD(cmd) (CODEC_NID((cmd)) == 0x11)
+#define STAC9220_IS_DIGOUTPIN_CMD(cmd) (CODEC_NID((cmd)) == 0x10)
 
 #define STAC9220_IS_CD_CMD(cmd) (CODEC_NID((cmd)) == 0x15)
@@ -188,9 +187,41 @@
     return VINF_SUCCESS;
 }
+
+/* F01 */
+static int codecGetConSelectCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
+{
+    Assert((CODEC_CAD(cmd) == pState->id));
+    if (STAC9220_IS_ADCMUX_CMD(cmd))
+        *pResp = pState->pNodes[CODEC_NID(cmd)].adcmux.u32F01_param;
+    else if (STAC9220_IS_DIGOUTPIN_CMD(cmd))
+        *pResp = pState->pNodes[CODEC_NID(cmd)].digout.u32F07_param;
+    return VINF_SUCCESS;
+}
+
+/* 701 */
+static int codecSetConSelectCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
+{
+    uint32_t *pu32Reg = NULL;
+    *pResp = 0;
+    if (STAC9220_IS_ADCMUX_CMD(cmd))
+        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].adcmux.u32F01_param;
+    else if (STAC9220_IS_DIGOUTPIN_CMD(cmd))
+        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digout.u32F01_param;
+    Assert((pu32Reg));
+    if (!pu32Reg)
+        return VINF_SUCCESS;
+    *pu32Reg = (*pu32Reg) & ~CODEC_VERB_8BIT_DATA;
+    *pu32Reg = (*pu32Reg) | (cmd & CODEC_VERB_8BIT_DATA);
+    return VINF_SUCCESS;
+}
+
+/* F07 */
 static int codecGetPinCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
     if (STAC9220_IS_PORT_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].port.u32F07_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGOUTPIN_CMD(cmd))
+        *pResp = pState->pNodes[CODEC_NID(cmd)].digout.u32F07_param;
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F07_param;
     else if (STAC9220_IS_CD_CMD(cmd))
@@ -201,4 +232,5 @@
 }
 
+/* 707 */
 static int codecSetPinCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -207,6 +239,8 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].port.u32F07_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F07_param;
+    else if (STAC9220_IS_DIGOUTPIN_CMD(cmd))
+        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digout.u32F07_param;
     else if (STAC9220_IS_CD_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].cdnode.u32F07_param;
@@ -219,4 +253,5 @@
 }
 
+/* F08 */
 static int codecGetUnsolicitedEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -224,5 +259,5 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].port.u32F08_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F08_param;
     else if (STAC9220_IS_AFG_CMD(cmd))
@@ -235,4 +270,5 @@
 }
 
+/* 708 */
 static int codecSetUnsolicitedEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -241,5 +277,5 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].port.u32F08_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F08_param;
     else if (STAC9220_IS_AFG_CMD(cmd))
@@ -255,4 +291,5 @@
 }
 
+/* F09 */
 static int codecGetPinSense(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -260,5 +297,5 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].port.u32F09_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F09_param;
     else
@@ -266,4 +303,6 @@
     return VINF_SUCCESS;
 }
+
+/* 709 */
 static int codecSetPinSense(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -272,5 +311,5 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].port.u32F08_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F08_param;
     Assert(pu32Reg);
@@ -372,4 +411,5 @@
 }
 
+/* F05 */
 static int codecGetPowerState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -377,22 +417,15 @@
     *pResp = 0;
     if (STAC9220_IS_AFG_CMD(cmd))
-    {
         *pResp = pState->pNodes[CODEC_NID(cmd)].afg.u32F05_param;
-    }
     else if (STAC9220_IS_DAC_CMD(cmd))
-    {
         *pResp = pState->pNodes[CODEC_NID(cmd)].dac.u32F05_param;
-    }
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
-    {
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F05_param;
-    }
     else if (STAC9220_IS_ADC_CMD(cmd))
-    {
         *pResp = pState->pNodes[CODEC_NID(cmd)].adc.u32F05_param;
-    }
-    return VINF_SUCCESS;
-}
-
+    return VINF_SUCCESS;
+}
+
+/* 705 */
 static int codecSetPowerState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -401,19 +434,11 @@
     *pResp = 0;
     if (STAC9220_IS_AFG_CMD(cmd))
-    {
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].afg.u32F05_param;
-    }
     else if (STAC9220_IS_DAC_CMD(cmd))
-    {
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].dac.u32F05_param;
-    }
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
-    {
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F05_param;
-    }
     else if (STAC9220_IS_ADC_CMD(cmd))
-    {
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].adc.u32F05_param;
-    }
     Assert((pu32Reg));
     if (!pu32Reg)
@@ -490,4 +515,5 @@
 }
 
+/* F0C */
 static int codecGetEAPD_BTLEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -497,5 +523,5 @@
     else if (STAC9220_IS_DAC_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].dac.u32F0c_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F0c_param;
     *pResp = 0;
@@ -503,4 +529,5 @@
 }
 
+/* 70C */
 static int codecSetEAPD_BTLEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
 {
@@ -512,5 +539,5 @@
     else if (STAC9220_IS_DAC_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].dac.u32F0c_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F0c_param;
     *pResp = 0;
@@ -559,8 +586,10 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         *pResp = pState->pNodes[CODEC_NID(cmd)].port.u32F1c_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
-        *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F1c_param;
+    else if (STAC9220_IS_DIGOUTPIN_CMD(cmd))
+        *pResp = pState->pNodes[CODEC_NID(cmd)].digout.u32F1c_param;
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
+        *pResp = pState->pNodes[CODEC_NID(cmd)].digout.u32F1c_param;
     else if (STAC9220_IS_CD_CMD(cmd))
-        *pResp = pState->pNodes[CODEC_NID(cmd)].digin.u32F1c_param;
+        *pResp = pState->pNodes[CODEC_NID(cmd)].cdnode.u32F1c_param;
     return VINF_SUCCESS;
 }
@@ -571,6 +600,8 @@
     if (STAC9220_IS_PORT_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].port.u32F1c_param;
-    else if (STAC9220_IS_DIGPIN_CMD(cmd))
-        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].port.u32F1c_param;
+    else if (STAC9220_IS_DIGINPIN_CMD(cmd))
+        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F1c_param;
+    else if (STAC9220_IS_DIGOUTPIN_CMD(cmd))
+        pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digout.u32F1c_param;
     else if (STAC9220_IS_CD_CMD(cmd))
         pu32Reg = &pState->pNodes[CODEC_NID(cmd)].cdnode.u32F1c_param;
@@ -834,10 +865,8 @@
 /*  -----------  --------------------   -----------------------  */
     {0x000F0000, CODEC_VERB_8BIT_CMD , codecGetParameter           },
-    {0x000A0000, CODEC_VERB_16BIT_CMD, codecGetConverterFormat     },
-    {0x00020000, CODEC_VERB_16BIT_CMD, codecSetConverterFormat     },
-    {0x000B0000, CODEC_VERB_16BIT_CMD, codecGetAmplifier           },
-    {0x00030000, CODEC_VERB_16BIT_CMD, codecSetAmplifier           },
+    {0x000F0100, CODEC_VERB_8BIT_CMD , codecGetConSelectCtrl       },
+    {0x00070100, CODEC_VERB_8BIT_CMD , codecSetConSelectCtrl       },
+    {0x000F0600, CODEC_VERB_8BIT_CMD , codecGetStreamId            },
     {0x00070600, CODEC_VERB_8BIT_CMD , codecSetStreamId            },
-    {0x000F0600, CODEC_VERB_8BIT_CMD , codecGetStreamId            },
     {0x000F0700, CODEC_VERB_8BIT_CMD , codecGetPinCtrl             },
     {0x00070700, CODEC_VERB_8BIT_CMD , codecSetPinCtrl             },
@@ -865,4 +894,8 @@
     {0x00071E00, CODEC_VERB_8BIT_CMD , codecSetConfig2             },
     {0x00071F00, CODEC_VERB_8BIT_CMD , codecSetConfig3             },
+    {0x000A0000, CODEC_VERB_16BIT_CMD, codecGetConverterFormat     },
+    {0x00020000, CODEC_VERB_16BIT_CMD, codecSetConverterFormat     },
+    {0x000B0000, CODEC_VERB_16BIT_CMD, codecGetAmplifier           },
+    {0x00030000, CODEC_VERB_16BIT_CMD, codecSetAmplifier           },
 };
 
