Index: /trunk/src/VBox/Devices/Audio/DevHda.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHda.cpp	(revision 88501)
+++ /trunk/src/VBox/Devices/Audio/DevHda.cpp	(revision 88502)
@@ -754,19 +754,16 @@
 }
 
-#ifdef IN_RING3
-
-/**
- * Processes the next CORB buffer command in the queue (ring-3).
- *
- * Note: This function only will be called when the ring-0 version did not have an appropriate dispatcher.
+
+/**
+ * Processes the next CORB buffer command in the queue.
  *
  * This will invoke the HDA codec ring-3 verb dispatcher.
  *
- * @returns VBox status code suitable for MMIO write return.
+ * @returns VBox status code.
  * @param   pDevIns             The device instance.
  * @param   pThis               The shared HDA device state.
  * @param   pThisCC             The ring-0 HDA device state.
  */
-static int hdaR3CORBCmdProcess(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTATER3 pThisCC)
+static int hdaCORBCmdProcess(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTATECC pThisCC)
 {
     Log3Func(("ENTER CORB(RP:%x, WP:%x) RIRBWP:%x\n", HDA_REG(pThis, CORBRP), HDA_REG(pThis, CORBWP), HDA_REG(pThis, RIRBWP)));
@@ -778,9 +775,8 @@
     }
 
-    /* Note: Command buffer syncing was already done in R0. */
-
     Assert(pThis->cbCorbBuf);
 
-    int rc;
+    int rc = hdaCmdSync(pDevIns, pThis, true /* Sync from guest */);
+    AssertRCReturn(rc, rc);
 
     /*
@@ -796,4 +792,10 @@
     uint8_t        rirbWp       = HDA_REG(pThis, RIRBWP);
 
+#ifndef IN_RING3
+    /*
+     * Check t
+     */
+#endif
+
     /*
      * The loop.
@@ -810,11 +812,25 @@
          */
         uint64_t uResp = 0;
+#ifndef IN_RING3
+        rc = pThisCC->Codec.pfnLookup(&pThis->Codec, &pThisCC->Codec, HDA_CODEC_CMD(uCmd, 0 /* Codec index */), &uResp);
+#else
         rc = pThisCC->pCodec->pfnLookup(&pThis->Codec, pThisCC->pCodec, HDA_CODEC_CMD(uCmd, 0 /* Codec index */), &uResp);
-        if (RT_FAILURE(rc)) /* Can return VERR_NOT_FOUND. */
+#endif
+        if (RT_SUCCESS(rc))
+            AssertRCSuccess(rc); /* no informational statuses */
+        else
+        {
+#ifndef IN_RING3
+            if (rc == VERR_INVALID_CONTEXT)
+            {
+                corbRp = corbRp == 0 ? cCorbEntries - 1 : corbRp - 1;
+                LogFunc(("->R3 CORB - uCmd=%#x\n", uCmd));
+                rc = PDMDevHlpTaskTrigger(pDevIns, pThis->hCorbDmaTask);
+                AssertRCReturn(rc, rc);
+                break; /* take the normal way out. */
+            }
+#endif
             Log3Func(("Lookup for codec verb %08x failed: %Rrc\n", uCmd, rc));
-
-        /* Note: No return here (as we're doing for the ring-0 version);
-                 we still need to do the interrupt handling below. */
-
+        }
         Log3Func(("Codec verb %08x -> response %016RX64\n", uCmd, uResp));
 
@@ -881,127 +897,20 @@
 }
 
-#else /* IN_RING0 */
-
-/**
- * Processes the next CORB buffer command in the queue (ring-0).
- *
- * This will invoke the HDA codec verb dispatcher.
- *
- * @returns VBox status code suitable for MMIO write return.
- * @param   pDevIns             The device instance.
- * @param   pThis               The shared HDA device state.
- * @param   pThisCC             The ring-0 HDA device state.
- */
-static int hdaR0CORBCmdProcess(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTATER0 pThisCC)
-{
-    Log3Func(("CORB(RP:%x, WP:%x) RIRBWP:%x\n", HDA_REG(pThis, CORBRP), HDA_REG(pThis, CORBWP), HDA_REG(pThis, RIRBWP)));
-
-    if (!(HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA))
-    {
-        LogFunc(("CORB DMA not active, skipping\n"));
-        return VINF_SUCCESS;
-    }
-
-    Assert(pThis->cbCorbBuf);
-
-    int rc = hdaCmdSync(pDevIns, pThis, true /* Sync from guest */);
-    AssertRCReturn(rc, rc);
-
-    /*
-     * Prepare local copies of relevant registers.
-     */
-    uint16_t cIntCnt = HDA_REG(pThis, RINTCNT) & 0xff;
-    if (!cIntCnt) /* 0 means 256 interrupts. */
-        cIntCnt = HDA_MAX_RINTCNT;
-
-    uint32_t const cCorbEntries = RT_MIN(RT_MAX(pThis->cbCorbBuf, 1), sizeof(pThis->au32CorbBuf)) / HDA_CORB_ELEMENT_SIZE;
-    uint8_t  const corbWp       = HDA_REG(pThis, CORBWP) % cCorbEntries;
-    uint8_t        corbRp       = HDA_REG(pThis, CORBRP);
-    uint8_t        rirbWp       = HDA_REG(pThis, RIRBWP);
-
-    /*
-     * The loop.
-     */
-    Log3Func(("START CORB(RP:%x, WP:%x) RIRBWP:%x, RINTCNT:%RU8/%RU8\n", corbRp, corbWp, rirbWp, pThis->u16RespIntCnt, cIntCnt));
-    while (corbRp != corbWp)
-    {
-        /* Fetch the command from the CORB. */
-        corbRp = (corbRp + 1) /* Advance +1 as the first command(s) are at CORBWP + 1. */ % cCorbEntries;
-        uint32_t const uCmd = pThis->au32CorbBuf[corbRp];
-
-        /*
-         * Execute the command.
-         */
-        uint64_t uResp = 0;
-        rc = pThisCC->Codec.pfnLookup(&pThis->Codec, &pThisCC->Codec, HDA_CODEC_CMD(uCmd, 0 /* Codec index */), &uResp);
-        if (RT_FAILURE(rc)) /* Can return VERR_NOT_FOUND. */
-        {
-            Log3Func(("Lookup for codec verb %08x failed: %Rrc\n", uCmd, rc));
-            return rc;
-        }
-        Log3Func(("Codec verb %08x -> response %016RX64\n", uCmd, uResp));
-
-        if (   (uResp & CODEC_RESPONSE_UNSOLICITED)
-            && !(HDA_REG(pThis, GCTL) & HDA_GCTL_UNSOL))
-        {
-            LogFunc(("Unexpected unsolicited response.\n"));
-            HDA_REG(pThis, CORBRP) = corbRp;
-            /** @todo r=andy No RIRB syncing to guest required in that case? */
-            /** @todo r=bird: Why isn't RIRBWP updated here.  The response might come
-             *        after already processing several commands, can't it?  (When you think
-             *        about it, it is bascially the same question as Andy is asking.) */
-            return VINF_SUCCESS;
-        }
-
-        /*
-         * Store the response in the RIRB.
-         */
-        AssertCompile(HDA_RIRB_SIZE == RT_ELEMENTS(pThis->au64RirbBuf));
-        rirbWp = (rirbWp + 1) % HDA_RIRB_SIZE;
-        pThis->au64RirbBuf[rirbWp] = uResp;
-
-        /*
-         * Send interrupt if needed.
-         */
-        bool fSendInterrupt = false;
-        pThis->u16RespIntCnt++;
-        if (pThis->u16RespIntCnt >= cIntCnt) /* Response interrupt count reached? */
-        {
-            pThis->u16RespIntCnt = 0; /* Reset internal interrupt response counter. */
-
-            Log3Func(("Response interrupt count reached (%RU16)\n", pThis->u16RespIntCnt));
-            fSendInterrupt = true;
-        }
-        else if (corbRp == corbWp) /* Did we reach the end of the current command buffer? */
-        {
-            Log3Func(("Command buffer empty\n"));
-            fSendInterrupt = true;
-        }
-        if (fSendInterrupt)
-        {
-            if (HDA_REG(pThis, RIRBCTL) & HDA_RIRBCTL_RINTCTL) /* Response Interrupt Control (RINTCTL) enabled? */
-            {
-                HDA_REG(pThis, RIRBSTS) |= HDA_RIRBSTS_RINTFL;
-                HDA_PROCESS_INTERRUPT(pDevIns, pThis);
-            }
-        }
-    }
-
-    /*
-     * Put register locals back.
-     */
-    Log3Func(("END CORB(RP:%x, WP:%x) RIRBWP:%x, RINTCNT:%RU8/%RU8\n", corbRp, corbWp, rirbWp, pThis->u16RespIntCnt, cIntCnt));
-    HDA_REG(pThis, CORBRP) = corbRp;
-    HDA_REG(pThis, RIRBWP) = rirbWp;
-
-    /*
-     * Write out the response.
-     */
-    rc = hdaCmdSync(pDevIns, pThis, false /* Sync to guest */);
-    AssertRC(rc);
-
-    return rc;
-}
-
+#ifdef IN_RING3
+/**
+ * @callback_method_impl{FNPDMTASKDEV, Continue CORB DMA in ring-3}
+ */
+static DECLCALLBACK(void) hdaR3CorbDmaTaskWorker(PPDMDEVINS pDevIns, void *pvUser)
+{
+    PHDASTATE       pThis   = PDMDEVINS_2_DATA(pDevIns, PHDASTATE);
+    PHDASTATER3     pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER3);
+    RT_NOREF(pvUser);
+    LogFlowFunc(("\n"));
+
+    DEVHDA_LOCK(pDevIns, pThis);
+    hdaCORBCmdProcess(pDevIns, pThis, pThisCC);
+    DEVHDA_UNLOCK(pDevIns, pThis);
+
+}
 #endif /* IN_RING3 */
 
@@ -1235,17 +1144,9 @@
 
     if (HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA) /* DMA engine started? */
-    {
-#ifdef IN_RING3
-        /* ignore rc */ hdaR3CORBCmdProcess(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER3));
-
-#else
-        if (hdaR0CORBCmdProcess(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER0)) == VERR_NOT_FOUND)
-            return VINF_IOM_R3_MMIO_WRITE; /* Try ring-3. */
-#endif
-    }
+        rc = hdaCORBCmdProcess(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATECC));
     else
         LogFunc(("CORB DMA not running, skipping\n"));
 
-    return VINF_SUCCESS;
+    return rc;
 }
 
@@ -1310,15 +1211,5 @@
     AssertRCSuccess(VBOXSTRICTRC_VAL(rc));
 
-#ifdef IN_RING3
-    rc = hdaR3CORBCmdProcess(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER3));
-    if (rc == VERR_NOT_FOUND)
-        rc = VINF_SUCCESS;
-#else
-    rc = hdaR0CORBCmdProcess(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER0));
-    if (rc == VERR_NOT_FOUND) /* Try ring-3. */
-        rc = VINF_IOM_R3_MMIO_WRITE;
-#endif
-
-    return rc;
+    return hdaCORBCmdProcess(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATECC));
 }
 
@@ -4757,4 +4648,5 @@
     pThis->cbCorbBuf            = HDA_CORB_SIZE * HDA_CORB_ELEMENT_SIZE;
     pThis->cbRirbBuf            = HDA_RIRB_SIZE * HDA_RIRB_ELEMENT_SIZE;
+    pThis->hCorbDmaTask         = NIL_PDMTASKHANDLE;
 
     /** @todo r=bird: There are probably other things which should be
@@ -4972,4 +4864,9 @@
     }
 # endif
+
+    /* Create task for continuing CORB DMA in ring-3. */
+    rc = PDMDevHlpTaskCreate(pDevIns, PDMTASK_F_RZ, "HDA CORB DMA",
+                             hdaR3CorbDmaTaskWorker, NULL /*pvUser*/, &pThis->hCorbDmaTask);
+    AssertRCReturn(rc,rc);
 
     rc = PDMDevHlpSSMRegisterEx(pDevIns, HDA_SAVED_STATE_VERSION, sizeof(*pThis), NULL /*pszBefore*/,
Index: /trunk/src/VBox/Devices/Audio/DevHda.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHda.h	(revision 88501)
+++ /trunk/src/VBox/Devices/Audio/DevHda.h	(revision 88502)
@@ -131,4 +131,7 @@
     /** The start time of the wall clock (WALCLK), measured on the virtual sync clock. */
     uint64_t                tsWalClkStart;
+    /** CORB DMA task handle.
+     * We use this when there is stuff we cannot handle in ring-0.  */
+    PDMTASKHANDLE           hCorbDmaTask;
     /** The CORB buffer. */
     uint32_t                au32CorbBuf[HDA_CORB_SIZE];
@@ -269,4 +272,7 @@
 
 
+/** Pointer to the context specific HDA state (HDASTATER3 or HDASTATER0). */
+typedef CTX_SUFF(PHDASTATE) PHDASTATECC;
+
 #endif /* !VBOX_INCLUDED_SRC_Audio_DevHda_h */
 
Index: /trunk/src/VBox/Devices/Audio/DevHdaCodec.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHdaCodec.cpp	(revision 88501)
+++ /trunk/src/VBox/Devices/Audio/DevHdaCodec.cpp	(revision 88502)
@@ -97,4 +97,8 @@
 #define STAC9221_NUM_NODES                                 0x1C
 
+
+/*********************************************************************************************************************************
+*   Global Variables                                                                                                             *
+*********************************************************************************************************************************/
 #ifdef IN_RING3
 
@@ -141,4 +145,6 @@
 #endif /* IN_RING3 */
 
+
+
 #if 0 /* unused */
 static DECLCALLBACK(void) stac9220DbgNodes(PHDACODEC pThis, PCDBGFINFOHLP pHlp, const char *pszArgs)
@@ -157,4 +163,5 @@
 }
 #endif
+
 
 /**
@@ -924,6 +931,4 @@
 }
 
-#ifdef IN_RING0
-
 DECLINLINE(void) hdaCodecSetRegisterU16(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset)
 {
@@ -931,5 +936,4 @@
 }
 
-#endif
 
 /*
@@ -938,7 +942,7 @@
 #if 0 /* unused */
 
-static DECLCALLBACK(int) vrbProcUnimplemented(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
-    RT_NOREF(pThis, cmd);
+static DECLCALLBACK(int) vrbProcUnimplemented(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThis, pThisCC, cmd);
     LogFlowFunc(("cmd(raw:%x: cad:%x, d:%c, nid:%x, verb:%x)\n", cmd,
                  CODEC_CAD(cmd), CODEC_DIRECT(cmd) ? 'N' : 'Y', CODEC_NID(cmd), CODEC_VERBDATA(cmd)));
@@ -947,8 +951,8 @@
 }
 
-static DECLCALLBACK(int) vrbProcBreak(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
+static DECLCALLBACK(int) vrbProcBreak(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
 {
     int rc;
-    rc = vrbProcUnimplemented(pThis, cmd, pResp);
+    rc = vrbProcUnimplemented(pThis, pThisCC, cmd, pResp);
     *pResp |= CODEC_RESPONSE_UNSOLICITED;
     return rc;
@@ -957,9 +961,9 @@
 #endif /* unused */
 
-#ifdef IN_RING0
 
 /* B-- */
-static DECLCALLBACK(int) vrbProcGetAmplifier(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetAmplifier(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1005,6 +1009,7 @@
 }
 
-static DECLCALLBACK(int) vrbProcGetParameter(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetParameter(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     Assert((cmd & CODEC_VERB_8BIT_DATA) < CODECNODE_F00_PARAM_LENGTH);
     if ((cmd & CODEC_VERB_8BIT_DATA) >= CODECNODE_F00_PARAM_LENGTH)
@@ -1021,6 +1026,7 @@
 
 /* F01 */
-static DECLCALLBACK(int) vrbProcGetConSelectCtrl(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetConSelectCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1042,6 +1048,7 @@
 
 /* 701 */
-static DECLCALLBACK(int) vrbProcSetConSelectCtrl(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetConSelectCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1067,6 +1074,7 @@
 
 /* F07 */
-static DECLCALLBACK(int) vrbProcGetPinCtrl(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetPinCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1090,6 +1098,7 @@
 
 /* 707 */
-static DECLCALLBACK(int) vrbProcSetPinCtrl(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetPinCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1118,6 +1127,7 @@
 
 /* F08 */
-static DECLCALLBACK(int) vrbProcGetUnsolicitedEnabled(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetUnsolicitedEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1141,6 +1151,7 @@
 
 /* 708 */
-static DECLCALLBACK(int) vrbProcSetUnsolicitedEnabled(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetUnsolicitedEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1168,6 +1179,7 @@
 
 /* F09 */
-static DECLCALLBACK(int) vrbProcGetPinSense(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetPinSense(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1186,6 +1198,7 @@
 
 /* 709 */
-static DECLCALLBACK(int) vrbProcSetPinSense(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetPinSense(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1204,6 +1217,7 @@
 }
 
-static DECLCALLBACK(int) vrbProcGetConnectionListEntry(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetConnectionListEntry(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1219,6 +1233,7 @@
 
 /* F03 */
-static DECLCALLBACK(int) vrbProcGetProcessingState(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetProcessingState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1230,6 +1245,7 @@
 
 /* 703 */
-static DECLCALLBACK(int) vrbProcSetProcessingState(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetProcessingState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1240,6 +1256,7 @@
 
 /* F0D */
-static DECLCALLBACK(int) vrbProcGetDigitalConverter(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetDigitalConverter(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1264,18 +1281,21 @@
 
 /* 70D */
-static DECLCALLBACK(int) vrbProcSetDigitalConverter1(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetDigitalConverter1(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     return codecSetDigitalConverter(pThis, cmd, 0, pResp);
 }
 
 /* 70E */
-static DECLCALLBACK(int) vrbProcSetDigitalConverter2(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetDigitalConverter2(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     return codecSetDigitalConverter(pThis, cmd, 8, pResp);
 }
 
 /* F20 */
-static DECLCALLBACK(int) vrbProcGetSubId(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetSubId(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     Assert(CODEC_CAD(cmd) == pThis->id);
     Assert(CODEC_NID(cmd) < pThis->cTotalNodes);
@@ -1311,6 +1331,7 @@
 
 /* 720 */
-static DECLCALLBACK(int) vrbProcSetSubId0(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetSubId0(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetSubIdX(pThis, cmd, 0);
@@ -1318,6 +1339,7 @@
 
 /* 721 */
-static DECLCALLBACK(int) vrbProcSetSubId1(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetSubId1(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetSubIdX(pThis, cmd, 8);
@@ -1325,6 +1347,7 @@
 
 /* 722 */
-static DECLCALLBACK(int) vrbProcSetSubId2(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetSubId2(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetSubIdX(pThis, cmd, 16);
@@ -1332,12 +1355,14 @@
 
 /* 723 */
-static DECLCALLBACK(int) vrbProcSetSubId3(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetSubId3(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetSubIdX(pThis, cmd, 24);
 }
 
-static DECLCALLBACK(int) vrbProcReset(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcReset(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     Assert(CODEC_CAD(cmd) == pThis->id);
 
@@ -1357,6 +1382,7 @@
 
 /* F05 */
-static DECLCALLBACK(int) vrbProcGetPowerState(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetPowerState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1387,6 +1413,7 @@
 /* 705 */
 #if 1
-static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1489,6 +1516,7 @@
 }
 
-static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     Assert(CODEC_CAD(cmd) == pThis->id);
     Assert(CODEC_NID(cmd) < pThis->cTotalNodes);
@@ -1557,6 +1585,7 @@
 
 /* F06 */
-static DECLCALLBACK(int) vrbProcGetStreamId(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetStreamId(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1581,6 +1610,7 @@
 
 /* A0 */
-static DECLCALLBACK(int) vrbProcGetConverterFormat(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetConverterFormat(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1602,6 +1632,7 @@
 
 /* Also see section 3.7.1. */
-static DECLCALLBACK(int) vrbProcSetConverterFormat(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetConverterFormat(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1621,6 +1652,7 @@
 
 /* F0C */
-static DECLCALLBACK(int) vrbProcGetEAPD_BTLEnabled(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetEAPD_BTLEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1638,6 +1670,7 @@
 
 /* 70C */
-static DECLCALLBACK(int) vrbProcSetEAPD_BTLEnabled(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetEAPD_BTLEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1659,6 +1692,7 @@
 
 /* F0F */
-static DECLCALLBACK(int) vrbProcGetVolumeKnobCtrl(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetVolumeKnobCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1672,6 +1706,7 @@
 
 /* 70F */
-static DECLCALLBACK(int) vrbProcSetVolumeKnobCtrl(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetVolumeKnobCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1689,7 +1724,7 @@
 
 /* F15 */
-static DECLCALLBACK(int) vrbProcGetGPIOData(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
-    RT_NOREF(pThis, cmd);
+static DECLCALLBACK(int) vrbProcGetGPIOData(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThis, pThisCC, cmd);
     *pResp = 0;
     return VINF_SUCCESS;
@@ -1697,7 +1732,7 @@
 
 /* 715 */
-static DECLCALLBACK(int) vrbProcSetGPIOData(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
-    RT_NOREF(pThis, cmd);
+static DECLCALLBACK(int) vrbProcSetGPIOData(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThis, pThisCC, cmd);
     *pResp = 0;
     return VINF_SUCCESS;
@@ -1705,7 +1740,7 @@
 
 /* F16 */
-static DECLCALLBACK(int) vrbProcGetGPIOEnableMask(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
-    RT_NOREF(pThis, cmd);
+static DECLCALLBACK(int) vrbProcGetGPIOEnableMask(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThis, pThisCC, cmd);
     *pResp = 0;
     return VINF_SUCCESS;
@@ -1713,7 +1748,7 @@
 
 /* 716 */
-static DECLCALLBACK(int) vrbProcSetGPIOEnableMask(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
-    RT_NOREF(pThis, cmd);
+static DECLCALLBACK(int) vrbProcSetGPIOEnableMask(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThis, pThisCC, cmd);
     *pResp = 0;
     return VINF_SUCCESS;
@@ -1721,6 +1756,7 @@
 
 /* F17 */
-static DECLCALLBACK(int) vrbProcGetGPIODirection(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetGPIODirection(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1735,6 +1771,7 @@
 
 /* 717 */
-static DECLCALLBACK(int) vrbProcSetGPIODirection(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetGPIODirection(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1752,6 +1789,7 @@
 
 /* F1C */
-static DECLCALLBACK(int) vrbProcGetConfig(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetConfig(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1799,6 +1837,7 @@
 
 /* 71C */
-static DECLCALLBACK(int) vrbProcSetConfig0(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetConfig0(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetConfigX(pThis, cmd, 0);
@@ -1806,6 +1845,7 @@
 
 /* 71D */
-static DECLCALLBACK(int) vrbProcSetConfig1(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetConfig1(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetConfigX(pThis, cmd, 8);
@@ -1813,6 +1853,7 @@
 
 /* 71E */
-static DECLCALLBACK(int) vrbProcSetConfig2(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetConfig2(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetConfigX(pThis, cmd, 16);
@@ -1820,6 +1861,7 @@
 
 /* 71E */
-static DECLCALLBACK(int) vrbProcSetConfig3(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetConfig3(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
     return codecSetConfigX(pThis, cmd, 24);
@@ -1827,6 +1869,7 @@
 
 /* F04 */
-static DECLCALLBACK(int) vrbProcGetSDISelect(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcGetSDISelect(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1840,6 +1883,7 @@
 
 /* 704 */
-static DECLCALLBACK(int) vrbProcSetSDISelect(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp)
-{
+static DECLCALLBACK(int) vrbProcSetSDISelect(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
+{
+    RT_NOREF(pThisCC);
     *pResp = 0;
 
@@ -1856,8 +1900,8 @@
 }
 
-#else /* IN_RING3 */
+#ifdef IN_RING3
 
 /* 3-- */
-static DECLCALLBACK(int) vrbProcR3SetAmplifier(PHDACODEC pThis, PHDACODECR3 pThisCC, uint32_t cmd, uint64_t *pResp)
+static DECLCALLBACK(int) vrbProcR3SetAmplifier(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
 {
     *pResp = 0;
@@ -1924,5 +1968,5 @@
 
 /* 706 */
-static DECLCALLBACK(int) vrbProcR3SetStreamId(PHDACODEC pThis, PHDACODECR3 pThisCC, uint32_t cmd, uint64_t *pResp)
+static DECLCALLBACK(int) vrbProcR3SetStreamId(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp)
 {
     *pResp = 0;
@@ -1938,5 +1982,5 @@
 
     PDMAUDIODIR enmDir;
-    uint32_t *pu32Addr = NULL;
+    uint32_t   *pu32Addr;
     if (hdaCodecIsDacNode(pThis, CODEC_NID(cmd)))
     {
@@ -1963,114 +2007,97 @@
         enmDir = PDMAUDIODIR_UNKNOWN;
         LogRel2(("HDA: Warning: Unhandled set stream ID command for NID0x%02x: 0x%x\n", CODEC_NID(cmd), cmd));
+        return VINF_SUCCESS;
     }
 
     /* Do we (re-)assign our input/output SDn (SDI/SDO) IDs? */
-    if (enmDir != PDMAUDIODIR_UNKNOWN)
-    {
-        pThis->aNodes[CODEC_NID(cmd)].node.uSD      = uSD;
-        pThis->aNodes[CODEC_NID(cmd)].node.uChannel = uChannel;
-
-        if (enmDir == PDMAUDIODIR_OUT)
-        {
-            /** @todo Check if non-interleaved streams need a different channel / SDn? */
-
-            /* Propagate to the controller. */
-            pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_FRONT,      uSD, uChannel);
-#ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
-            pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_CENTER_LFE, uSD, uChannel);
-            pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_REAR,       uSD, uChannel);
-#endif
-        }
-        else if (enmDir == PDMAUDIODIR_IN)
-        {
-            pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_LINE_IN,    uSD, uChannel);
-#ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
-            pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_MIC_IN,     uSD, uChannel);
-#endif
-        }
-    }
-
-    if (pu32Addr)
-        hdaCodecSetRegisterU8(pu32Addr, cmd, 0);
-
-    return VINF_SUCCESS;
-}
-
-#endif /* IN_RING0 */
-
-#ifdef IN_RING0
+    pThis->aNodes[CODEC_NID(cmd)].node.uSD      = uSD;
+    pThis->aNodes[CODEC_NID(cmd)].node.uChannel = uChannel;
+
+    if (enmDir == PDMAUDIODIR_OUT)
+    {
+        /** @todo Check if non-interleaved streams need a different channel / SDn? */
+
+        /* Propagate to the controller. */
+        pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_FRONT,      uSD, uChannel);
+# ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
+        pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_CENTER_LFE, uSD, uChannel);
+        pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_REAR,       uSD, uChannel);
+# endif
+    }
+    else if (enmDir == PDMAUDIODIR_IN)
+    {
+        pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_LINE_IN,    uSD, uChannel);
+# ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
+        pThisCC->pfnCbMixerControl(pThisCC->pDevIns, PDMAUDIOMIXERCTL_MIC_IN,     uSD, uChannel);
+# endif
+    }
+
+    hdaCodecSetRegisterU8(pu32Addr, cmd, 0);
+
+    return VINF_SUCCESS;
+}
+
+#endif /* IN_RING3 */
+
 
 /**
- * HDA codec verb map for ring-0.
+ * HDA codec verb descriptors.
+ *
  * @todo Any reason not to use binary search here?
  *      bird: because you'd need to sort the entries first...
  */
-static const CODECVERBR0 g_aCodecVerbsR0[] =
-{
-    /* Verb        Verb mask            Callback                        Name
-     * ---------- --------------------- ----------------------------------------------------------
-     */
-    { 0x000F0000, CODEC_VERB_8BIT_CMD , vrbProcGetParameter           , "GetParameter          " },
-    { 0x000F0100, CODEC_VERB_8BIT_CMD , vrbProcGetConSelectCtrl       , "GetConSelectCtrl      " },
-    { 0x00070100, CODEC_VERB_8BIT_CMD , vrbProcSetConSelectCtrl       , "SetConSelectCtrl      " },
-    { 0x000F0600, CODEC_VERB_8BIT_CMD , vrbProcGetStreamId            , "GetStreamId           " },
-    { 0x000F0700, CODEC_VERB_8BIT_CMD , vrbProcGetPinCtrl             , "GetPinCtrl            " },
-    { 0x00070700, CODEC_VERB_8BIT_CMD , vrbProcSetPinCtrl             , "SetPinCtrl            " },
-    { 0x000F0800, CODEC_VERB_8BIT_CMD , vrbProcGetUnsolicitedEnabled  , "GetUnsolicitedEnabled " },
-    { 0x00070800, CODEC_VERB_8BIT_CMD , vrbProcSetUnsolicitedEnabled  , "SetUnsolicitedEnabled " },
-    { 0x000F0900, CODEC_VERB_8BIT_CMD , vrbProcGetPinSense            , "GetPinSense           " },
-    { 0x00070900, CODEC_VERB_8BIT_CMD , vrbProcSetPinSense            , "SetPinSense           " },
-    { 0x000F0200, CODEC_VERB_8BIT_CMD , vrbProcGetConnectionListEntry , "GetConnectionListEntry" },
-    { 0x000F0300, CODEC_VERB_8BIT_CMD , vrbProcGetProcessingState     , "GetProcessingState    " },
-    { 0x00070300, CODEC_VERB_8BIT_CMD , vrbProcSetProcessingState     , "SetProcessingState    " },
-    { 0x000F0D00, CODEC_VERB_8BIT_CMD , vrbProcGetDigitalConverter    , "GetDigitalConverter   " },
-    { 0x00070D00, CODEC_VERB_8BIT_CMD , vrbProcSetDigitalConverter1   , "SetDigitalConverter1  " },
-    { 0x00070E00, CODEC_VERB_8BIT_CMD , vrbProcSetDigitalConverter2   , "SetDigitalConverter2  " },
-    { 0x000F2000, CODEC_VERB_8BIT_CMD , vrbProcGetSubId               , "GetSubId              " },
-    { 0x00072000, CODEC_VERB_8BIT_CMD , vrbProcSetSubId0              , "SetSubId0             " },
-    { 0x00072100, CODEC_VERB_8BIT_CMD , vrbProcSetSubId1              , "SetSubId1             " },
-    { 0x00072200, CODEC_VERB_8BIT_CMD , vrbProcSetSubId2              , "SetSubId2             " },
-    { 0x00072300, CODEC_VERB_8BIT_CMD , vrbProcSetSubId3              , "SetSubId3             " },
-    { 0x0007FF00, CODEC_VERB_8BIT_CMD , vrbProcReset                  , "Reset                 " },
-    { 0x000F0500, CODEC_VERB_8BIT_CMD , vrbProcGetPowerState          , "GetPowerState         " },
-    { 0x00070500, CODEC_VERB_8BIT_CMD , vrbProcSetPowerState          , "SetPowerState         " },
-    { 0x000F0C00, CODEC_VERB_8BIT_CMD , vrbProcGetEAPD_BTLEnabled     , "GetEAPD_BTLEnabled    " },
-    { 0x00070C00, CODEC_VERB_8BIT_CMD , vrbProcSetEAPD_BTLEnabled     , "SetEAPD_BTLEnabled    " },
-    { 0x000F0F00, CODEC_VERB_8BIT_CMD , vrbProcGetVolumeKnobCtrl      , "GetVolumeKnobCtrl     " },
-    { 0x00070F00, CODEC_VERB_8BIT_CMD , vrbProcSetVolumeKnobCtrl      , "SetVolumeKnobCtrl     " },
-    { 0x000F1500, CODEC_VERB_8BIT_CMD , vrbProcGetGPIOData            , "GetGPIOData           " },
-    { 0x00071500, CODEC_VERB_8BIT_CMD , vrbProcSetGPIOData            , "SetGPIOData           " },
-    { 0x000F1600, CODEC_VERB_8BIT_CMD , vrbProcGetGPIOEnableMask      , "GetGPIOEnableMask     " },
-    { 0x00071600, CODEC_VERB_8BIT_CMD , vrbProcSetGPIOEnableMask      , "SetGPIOEnableMask     " },
-    { 0x000F1700, CODEC_VERB_8BIT_CMD , vrbProcGetGPIODirection       , "GetGPIODirection      " },
-    { 0x00071700, CODEC_VERB_8BIT_CMD , vrbProcSetGPIODirection       , "SetGPIODirection      " },
-    { 0x000F1C00, CODEC_VERB_8BIT_CMD , vrbProcGetConfig              , "GetConfig             " },
-    { 0x00071C00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig0             , "SetConfig0            " },
-    { 0x00071D00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig1             , "SetConfig1            " },
-    { 0x00071E00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig2             , "SetConfig2            " },
-    { 0x00071F00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig3             , "SetConfig3            " },
-    { 0x000A0000, CODEC_VERB_16BIT_CMD, vrbProcGetConverterFormat     , "GetConverterFormat    " },
-    { 0x00020000, CODEC_VERB_16BIT_CMD, vrbProcSetConverterFormat     , "SetConverterFormat    " },
-    { 0x000B0000, CODEC_VERB_16BIT_CMD, vrbProcGetAmplifier           , "GetAmplifier          " },
-    { 0x000F0400, CODEC_VERB_8BIT_CMD , vrbProcGetSDISelect           , "GetSDISelect          " },
-    { 0x00070400, CODEC_VERB_8BIT_CMD , vrbProcSetSDISelect           , "SetSDISelect          " }
+static const CODECVERB g_aCodecVerbs[] =
+{
+    /* Verb        Verb mask            Callback                                   Name
+       ---------- --------------------- ------------------------------------------------------------------- */
+    { 0x000F0000, CODEC_VERB_8BIT_CMD , vrbProcGetParameter                      , "GetParameter          " },
+    { 0x000F0100, CODEC_VERB_8BIT_CMD , vrbProcGetConSelectCtrl                  , "GetConSelectCtrl      " },
+    { 0x00070100, CODEC_VERB_8BIT_CMD , vrbProcSetConSelectCtrl                  , "SetConSelectCtrl      " },
+    { 0x000F0600, CODEC_VERB_8BIT_CMD , vrbProcGetStreamId                       , "GetStreamId           " },
+    { 0x00070600, CODEC_VERB_8BIT_CMD , CTX_EXPR(vrbProcR3SetStreamId,NULL,NULL) , "SetStreamId           " },
+    { 0x000F0700, CODEC_VERB_8BIT_CMD , vrbProcGetPinCtrl                        , "GetPinCtrl            " },
+    { 0x00070700, CODEC_VERB_8BIT_CMD , vrbProcSetPinCtrl                        , "SetPinCtrl            " },
+    { 0x000F0800, CODEC_VERB_8BIT_CMD , vrbProcGetUnsolicitedEnabled             , "GetUnsolicitedEnabled " },
+    { 0x00070800, CODEC_VERB_8BIT_CMD , vrbProcSetUnsolicitedEnabled             , "SetUnsolicitedEnabled " },
+    { 0x000F0900, CODEC_VERB_8BIT_CMD , vrbProcGetPinSense                       , "GetPinSense           " },
+    { 0x00070900, CODEC_VERB_8BIT_CMD , vrbProcSetPinSense                       , "SetPinSense           " },
+    { 0x000F0200, CODEC_VERB_8BIT_CMD , vrbProcGetConnectionListEntry            , "GetConnectionListEntry" },
+    { 0x000F0300, CODEC_VERB_8BIT_CMD , vrbProcGetProcessingState                , "GetProcessingState    " },
+    { 0x00070300, CODEC_VERB_8BIT_CMD , vrbProcSetProcessingState                , "SetProcessingState    " },
+    { 0x000F0D00, CODEC_VERB_8BIT_CMD , vrbProcGetDigitalConverter               , "GetDigitalConverter   " },
+    { 0x00070D00, CODEC_VERB_8BIT_CMD , vrbProcSetDigitalConverter1              , "SetDigitalConverter1  " },
+    { 0x00070E00, CODEC_VERB_8BIT_CMD , vrbProcSetDigitalConverter2              , "SetDigitalConverter2  " },
+    { 0x000F2000, CODEC_VERB_8BIT_CMD , vrbProcGetSubId                          , "GetSubId              " },
+    { 0x00072000, CODEC_VERB_8BIT_CMD , vrbProcSetSubId0                         , "SetSubId0             " },
+    { 0x00072100, CODEC_VERB_8BIT_CMD , vrbProcSetSubId1                         , "SetSubId1             " },
+    { 0x00072200, CODEC_VERB_8BIT_CMD , vrbProcSetSubId2                         , "SetSubId2             " },
+    { 0x00072300, CODEC_VERB_8BIT_CMD , vrbProcSetSubId3                         , "SetSubId3             " },
+    { 0x0007FF00, CODEC_VERB_8BIT_CMD , vrbProcReset                             , "Reset                 " },
+    { 0x000F0500, CODEC_VERB_8BIT_CMD , vrbProcGetPowerState                     , "GetPowerState         " },
+    { 0x00070500, CODEC_VERB_8BIT_CMD , vrbProcSetPowerState                     , "SetPowerState         " },
+    { 0x000F0C00, CODEC_VERB_8BIT_CMD , vrbProcGetEAPD_BTLEnabled                , "GetEAPD_BTLEnabled    " },
+    { 0x00070C00, CODEC_VERB_8BIT_CMD , vrbProcSetEAPD_BTLEnabled                , "SetEAPD_BTLEnabled    " },
+    { 0x000F0F00, CODEC_VERB_8BIT_CMD , vrbProcGetVolumeKnobCtrl                 , "GetVolumeKnobCtrl     " },
+    { 0x00070F00, CODEC_VERB_8BIT_CMD , vrbProcSetVolumeKnobCtrl                 , "SetVolumeKnobCtrl     " },
+    { 0x000F1500, CODEC_VERB_8BIT_CMD , vrbProcGetGPIOData                       , "GetGPIOData           " },
+    { 0x00071500, CODEC_VERB_8BIT_CMD , vrbProcSetGPIOData                       , "SetGPIOData           " },
+    { 0x000F1600, CODEC_VERB_8BIT_CMD , vrbProcGetGPIOEnableMask                 , "GetGPIOEnableMask     " },
+    { 0x00071600, CODEC_VERB_8BIT_CMD , vrbProcSetGPIOEnableMask                 , "SetGPIOEnableMask     " },
+    { 0x000F1700, CODEC_VERB_8BIT_CMD , vrbProcGetGPIODirection                  , "GetGPIODirection      " },
+    { 0x00071700, CODEC_VERB_8BIT_CMD , vrbProcSetGPIODirection                  , "SetGPIODirection      " },
+    { 0x000F1C00, CODEC_VERB_8BIT_CMD , vrbProcGetConfig                         , "GetConfig             " },
+    { 0x00071C00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig0                        , "SetConfig0            " },
+    { 0x00071D00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig1                        , "SetConfig1            " },
+    { 0x00071E00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig2                        , "SetConfig2            " },
+    { 0x00071F00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig3                        , "SetConfig3            " },
+    { 0x000A0000, CODEC_VERB_16BIT_CMD, vrbProcGetConverterFormat                , "GetConverterFormat    " },
+    { 0x00020000, CODEC_VERB_16BIT_CMD, vrbProcSetConverterFormat                , "SetConverterFormat    " },
+    { 0x000B0000, CODEC_VERB_16BIT_CMD, vrbProcGetAmplifier                      , "GetAmplifier          " },
+    { 0x00030000, CODEC_VERB_16BIT_CMD, CTX_EXPR(vrbProcR3SetAmplifier,NULL,NULL), "SetAmplifier          " },
+    { 0x000F0400, CODEC_VERB_8BIT_CMD , vrbProcGetSDISelect                      , "GetSDISelect          " },
+    { 0x00070400, CODEC_VERB_8BIT_CMD , vrbProcSetSDISelect                      , "SetSDISelect          " },
     /** @todo Implement 0x7e7: IDT Set GPIO (STAC922x only). */
 };
 
-#else /* IN_RING3 */
-
-/**
- * HDA codec verb map for ring-3.
- */
-static const CODECVERBR3 g_aCodecVerbsR3[] =
-{
-   /* Verb        Verb mask            Callback                        Name
-    * ---------- --------------------- ----------------------------------------------------------
-    */
-   { 0x00070600, CODEC_VERB_8BIT_CMD , vrbProcR3SetStreamId          , "SetStreamId           " },
-   { 0x00030000, CODEC_VERB_16BIT_CMD, vrbProcR3SetAmplifier         , "SetAmplifier          " }
-};
-
-#endif /* IN_RING0 */
 
 #ifdef IN_RING3
@@ -2311,95 +2338,57 @@
 }
 
-static DECLCALLBACK(int) codecR3Lookup(PHDACODEC pThis, PHDACODECR3 pThisCC, uint32_t cmd, uint64_t *puResp)
-{
-    AssertPtrReturn(pThisCC,  VERR_INVALID_POINTER);
-    AssertPtrReturn(puResp, VERR_INVALID_POINTER);
-
-    STAM_COUNTER_INC(&pThisCC->StatLookupsR3);
-
-    if (CODEC_CAD(cmd) != pThis->id)
-    {
-        *puResp = 0;
-        AssertMsgFailed(("Unknown codec address 0x%x\n", CODEC_CAD(cmd)));
-        return VERR_INVALID_PARAMETER;
-    }
-
-    if (   CODEC_VERBDATA(cmd) == 0
-        || CODEC_NID(cmd) >= pThis->cTotalNodes)
-    {
-        *puResp = 0;
-        AssertMsgFailed(("[NID0x%02x] Unknown / invalid node or data (0x%x)\n", CODEC_NID(cmd), CODEC_VERBDATA(cmd)));
-        return VERR_INVALID_PARAMETER;
-    }
-
-    /** @todo r=andy Implement a binary search here. */
-    for (size_t i = 0; i < pThisCC->cVerbs; i++)
-    {
-        PCODECVERBR3 pVerb = &pThisCC->aVerbs[i];
-
-        if ((CODEC_VERBDATA(cmd) & pVerb->mask) == pThisCC->aVerbs[i].verb)
-        {
-            AssertPtrReturn(pVerb->pfn, VERR_NOT_IMPLEMENTED); /* Paranoia. */
-
-            int rc2 = pVerb->pfn(pThis, pThisCC, cmd, puResp);
-            AssertRC(rc2);
+#endif /* IN_RING3 */
+
+/**
+ * Implements
+ */
+static DECLCALLBACK(int) codecLookup(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t uCmd, uint64_t *puResp)
+{
+    /*
+     * Clear the return value and assert some sanity.
+     */
+    AssertPtr(puResp);
+    *puResp = 0;
+    AssertPtr(pThis);
+    AssertPtr(pThisCC);
+    AssertMsgReturn(CODEC_CAD(uCmd) == pThis->id,
+                    ("Unknown codec address 0x%x\n", CODEC_CAD(uCmd)),
+                    VERR_INVALID_PARAMETER);
+    AssertMsgReturn(   CODEC_VERBDATA(uCmd) != 0
+                    && CODEC_NID(uCmd) < pThis->cTotalNodes,
+                    ("[NID0x%02x] Unknown / invalid node or data (0x%x)\n", CODEC_NID(uCmd), CODEC_VERBDATA(uCmd)),
+                    VERR_INVALID_PARAMETER);
+    STAM_COUNTER_INC(&pThis->CTX_SUFF(StatLookups));
+
+    /*
+     * Lookup the verb.
+     * Note! if we want other verb tables, add a table selector before the loop.
+     */
+    for (size_t i = 0; i < RT_ELEMENTS(g_aCodecVerbs); i++)
+    {
+        if ((CODEC_VERBDATA(uCmd) & g_aCodecVerbs[i].fMask) == g_aCodecVerbs[i].uVerb)
+        {
+#ifndef IN_RING3
+            if (!g_aCodecVerbs[i].pfn)
+            {
+                Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> VERR_INVALID_CONTEXT\n", /* -> ring-3 */
+                          CODEC_NID(uCmd), g_aCodecVerbs[i].uVerb, g_aCodecVerbs[i].pszName, CODEC_VERB_PAYLOAD8(uCmd)));
+                return VERR_INVALID_CONTEXT;
+            }
+#endif
+            AssertPtrReturn(g_aCodecVerbs[i].pfn, VERR_INTERNAL_ERROR_5); /* Paranoia^2. */
+
+            int rc = g_aCodecVerbs[i].pfn(pThis, pThisCC, uCmd, puResp);
+            AssertRC(rc);
             Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> 0x%x\n",
-                      CODEC_NID(cmd), pVerb->verb, pVerb->pszName, CODEC_VERB_PAYLOAD8(cmd), *puResp));
-            return rc2;
-        }
-    }
-
-    *puResp = 0;
-    LogFunc(("[NID0x%02x] Callback for %x not found\n", CODEC_NID(cmd), CODEC_VERBDATA(cmd)));
+                      CODEC_NID(uCmd), g_aCodecVerbs[i].uVerb, g_aCodecVerbs[i].pszName, CODEC_VERB_PAYLOAD8(uCmd), *puResp));
+            return rc;
+        }
+    }
+
+    LogFunc(("[NID0x%02x] Callback for %x not found\n", CODEC_NID(uCmd), CODEC_VERBDATA(uCmd)));
     return VERR_NOT_FOUND;
 }
 
-#else /* IN_RING0 */
-
-static DECLCALLBACK(int) codecR0Lookup(PHDACODEC pThis, PHDACODECR0 pThisCC, uint32_t cmd, uint64_t *puResp)
-{
-    AssertPtrReturn(pThis,  VERR_INVALID_POINTER);
-    AssertPtrReturn(puResp, VERR_INVALID_POINTER);
-
-    STAM_COUNTER_INC(&pThisCC->StatLookupsR0);
-
-    if (CODEC_CAD(cmd) != pThis->id)
-    {
-        *puResp = 0;
-        AssertMsgFailed(("Unknown codec address 0x%x\n", CODEC_CAD(cmd)));
-        return VERR_INVALID_PARAMETER;
-    }
-
-    if (   CODEC_VERBDATA(cmd) == 0
-        || CODEC_NID(cmd) >= pThis->cTotalNodes)
-    {
-        *puResp = 0;
-        AssertMsgFailed(("[NID0x%02x] Unknown / invalid node or data (0x%x)\n", CODEC_NID(cmd), CODEC_VERBDATA(cmd)));
-        return VERR_INVALID_PARAMETER;
-    }
-
-    /** @todo r=andy Implement a binary search here. */
-    for (size_t i = 0; i < pThisCC->cVerbs; i++)
-    {
-        PCODECVERBR0 pVerb = &pThisCC->aVerbs[i];
-
-        if ((CODEC_VERBDATA(cmd) & pVerb->mask) == pThisCC->aVerbs[i].verb)
-        {
-            AssertPtrReturn(pVerb->pfn, VERR_NOT_IMPLEMENTED); /* Paranoia. */
-
-            int rc2 = pVerb->pfn(pThis, cmd, puResp);
-            AssertRC(rc2);
-            Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> 0x%x\n",
-                      CODEC_NID(cmd), pVerb->verb, pVerb->pszName, CODEC_VERB_PAYLOAD8(cmd), *puResp));
-            return rc2;
-        }
-    }
-
-    *puResp = 0;
-    LogFunc(("[NID0x%02x] Callback for %x not found\n", CODEC_NID(cmd), CODEC_VERBDATA(cmd)));
-    return VERR_NOT_FOUND;
-}
-
-#endif /* IN_RING0 */
 
 /*
@@ -2573,6 +2562,5 @@
  * @param   pCfg                CFGM node to use for configuration.
  */
-int hdaR3CodecConstruct(PPDMDEVINS pDevIns, PHDACODEC pThis, PHDACODECR3 pThisCC,
-                        uint16_t uLUN, PCFGMNODE pCfg)
+int hdaR3CodecConstruct(PPDMDEVINS pDevIns, PHDACODEC pThis, PHDACODECR3 pThisCC, uint16_t uLUN, PCFGMNODE pCfg)
 {
     AssertPtrReturn(pDevIns, VERR_INVALID_POINTER);
@@ -2600,11 +2588,7 @@
     }
 
-    memcpy(&pThisCC->aVerbs, &g_aCodecVerbsR3, sizeof(CODECVERBR3) * RT_ELEMENTS(g_aCodecVerbsR3));
-    pThisCC->cVerbs = RT_ELEMENTS(g_aCodecVerbsR3);
-
     pThisCC->pfnDbgSelector  = codecR3DbgSelector;
     pThisCC->pfnDbgListNodes = codecR3DbgListNodes;
-
-    pThisCC->pfnLookup       = codecR3Lookup;
+    pThisCC->pfnLookup       = codecLookup;
 
     /*
@@ -2619,14 +2603,13 @@
     AssertRCReturn(rc, rc);
 
-#ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
-# error "Implement mic-in support!"
-#endif
+# ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
+#  error "Implement mic-in support!"
+# endif
 
     /*
      * Statistics
      */
-#ifdef VBOX_WITH_STATISTICS
-    PDMDevHlpSTAMRegister(pDevIns, &pThisCC->StatLookupsR3, STAMTYPE_COUNTER, "Codec/LookupsR3", STAMUNIT_OCCURENCES, "Number of R3 codecLookup calls");
-#endif
+    PDMDevHlpSTAMRegister(pDevIns, &pThis->StatLookupsR3, STAMTYPE_COUNTER, "Codec/LookupsR0", STAMUNIT_OCCURENCES, "Number of R0 codecLookup calls");
+    PDMDevHlpSTAMRegister(pDevIns, &pThis->StatLookupsR0, STAMTYPE_COUNTER, "Codec/LookupsR3", STAMUNIT_OCCURENCES, "Number of R3 codecLookup calls");
 
     return rc;
@@ -2649,22 +2632,12 @@
     AssertPtrReturn(pThisCC, VERR_INVALID_POINTER);
 
-    memcpy(&pThisCC->aVerbs, &g_aCodecVerbsR0, sizeof(CODECVERBR0) * RT_ELEMENTS(g_aCodecVerbsR0));
-    pThisCC->cVerbs = RT_ELEMENTS(g_aCodecVerbsR0);
-
-    pThisCC->pfnLookup = codecR0Lookup;
+    pThisCC->pfnLookup = codecLookup;
 
     /* Note: Everything else is done in the R3 part. */
 
-    /*
-     * Statistics
-     */
-#ifdef VBOX_WITH_STATISTICS
-    /** @todo */
-#endif
-
-    return VINF_SUCCESS;
-}
-
-#endif /* IN_RING3 */
+    return VINF_SUCCESS;
+}
+
+#endif /* IN_RING0 */
 
 /**
Index: /trunk/src/VBox/Devices/Audio/DevHdaCodec.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHdaCodec.h	(revision 88501)
+++ /trunk/src/VBox/Devices/Audio/DevHdaCodec.h	(revision 88502)
@@ -30,10 +30,14 @@
 /** Pointer to a ring-3 HDA device state.  */
 typedef struct HDASTATER3 *PHDASTATER3;
+
 /** The ICH HDA (Intel) common codec state. */
 typedef struct HDACODEC *PHDACODEC;
-/** The ICH HDA (Intel) ring-0 state. */
+/** The ICH HDA (Intel) ring-0 codec state. */
 typedef struct HDACODECR0 *PHDACODECR0;
-/** The ICH HDA (Intel) ring-3 state. */
+/** The ICH HDA (Intel) ring-3 codec state. */
 typedef struct HDACODECR3 *PHDACODECR3;
+/** The ICH HDA (Intel) current context codec state. */
+typedef CTX_SUFF(PHDACODEC) PHDACODECCC;
+
 /** The HDA host driver backend. */
 typedef struct HDADRIVER *PHDADRIVER;
@@ -51,12 +55,4 @@
     CODEC_TYPE__32BIT_HACK = 0x7fffffff
 } CODEC_TYPE;
-
-/**
- * Verb processor method.
- */
-typedef DECLCALLBACKTYPE(int, FNHDACODECVERBPROCESSORR0,(PHDACODEC pThis, uint32_t cmd, uint64_t *pResp));
-typedef FNHDACODECVERBPROCESSORR0 *PFNHDACODECVERBPROCESSORR0;
-typedef DECLCALLBACKTYPE(int, FNHDACODECVERBPROCESSORR3,(PHDACODEC pThis, PHDACODECR3 pThisCC, uint32_t cmd, uint64_t *pResp));
-typedef FNHDACODECVERBPROCESSORR3 *PFNHDACODECVERBPROCESSORR3;
 
 /* PRM 5.3.1 */
@@ -568,36 +564,25 @@
 
 /**
- * Structure for maintaining a codec verb implementation (ring-0).
- */
-typedef struct CODECVERBR0
+ * A codec verb descriptor.
+ */
+typedef struct CODECVERB
 {
     /** Verb. */
-    uint32_t                   verb;
+    uint32_t                   uVerb;
     /** Verb mask. */
-    uint32_t                   mask;
-    /** Function pointer for implementation callback. */
-    PFNHDACODECVERBPROCESSORR0 pfn;
+    uint32_t                   fMask;
+    /**
+     * Function pointer for implementation callback.
+     *
+     * This is always a valid  pointer in ring-3, while elsewhere a NULL indicates
+     * that we must return to ring-3 to process it.
+     */
+    DECLCALLBACKMEMBER(int,    pfn, (PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t uCmd, uint64_t *puResp));
     /** Friendly name, for debugging. */
     const char                *pszName;
-} CODECVERBR0;
-/** Ponter to a  codec verb implementation (ring-0). */
-typedef CODECVERBR0 *PCODECVERBR0;
-
-/**
- * Structure for maintaining a codec verb implementation (ring-3).
- */
-typedef struct CODECVERBR3
-{
-    /** Verb. */
-    uint32_t                   verb;
-    /** Verb mask. */
-    uint32_t                   mask;
-    /** Function pointer for implementation callback. */
-    PFNHDACODECVERBPROCESSORR3 pfn;
-    /** Friendly name, for debugging. */
-    const char                *pszName;
-} CODECVERBR3;
-/** Ponter to a  codec verb implementation (ring-3). */
-typedef CODECVERBR3 *PCODECVERBR3;
+} CODECVERB;
+/** Pointer to a const codec verb descriptor. */
+typedef CODECVERB const *PCCODECVERB;
+
 
 #define AMPLIFIER_SIZE 60
@@ -623,7 +608,8 @@
     uint32_t        au32F02_param[CODECNODE_F02_PARAM_LENGTH];
 } CODECCOMMONNODE;
-typedef CODECCOMMONNODE *PCODECCOMMONNODE;
 AssertCompile(CODECNODE_F00_PARAM_LENGTH == 20);  /* saved state */
 AssertCompile(CODECNODE_F02_PARAM_LENGTH == 16); /* saved state */
+AssertCompileSize(CODECCOMMONNODE, (1 + 20 + 16) * sizeof(uint32_t));
+typedef CODECCOMMONNODE *PCODECCOMMONNODE;
 
 /**
@@ -835,5 +821,4 @@
 AssertNodeSize(CODECNODE, 60 + 6);
 
-#define CODEC_VERBS_MAX     64
 #define CODEC_NODES_MAX     32
 
@@ -853,8 +838,8 @@
 
     CODECNODE  aNodes[CODEC_NODES_MAX];
-    size_t     cNodes;
+    uint32_t   cNodes;
 
     bool       fInReset;
-    uint8_t    abPadding1[3];
+    uint8_t    abPadding1[3]; /**< @todo r=bird: Merge with bPadding2 and eliminate both */
 
     uint8_t    cTotalNodes;
@@ -876,4 +861,7 @@
     uint8_t    au8VolKnobs[CODEC_NODES_MAX];
     uint8_t    au8Reserveds[CODEC_NODES_MAX];
+
+    STAMCOUNTER StatLookupsR0;
+    STAMCOUNTER StatLookupsR3;
 } HDACODEC;
 
@@ -883,18 +871,12 @@
 typedef struct HDACODECR0
 {
-    CODECVERBR0             aVerbs[CODEC_VERBS_MAX];
-    size_t                  cVerbs;
-
     /** @name Public codec functions.
      *  @{  */
+#if 0 /** @todo r=bird: why can I just disable these and not get compile errors?  Unfinished code?  No comments.  Not at all amused! */
     DECLR0CALLBACKMEMBER(void, pfnReset, (PHDACODEC pThis, PHDACODECR0 pThisCC));
     DECLR0CALLBACKMEMBER(int,  pfnNodeReset, (PHDACODEC pThis, uint8_t nID, PCODECNODE pNode));
+#endif
     DECLR0CALLBACKMEMBER(int,  pfnLookup, (PHDACODEC pThis, PHDACODECR0 pThisCC, uint32_t uVerb, uint64_t *puResp));
     /** @} */
-
-#ifdef VBOX_WITH_STATISTICS
-    STAMCOUNTER StatLookupsR0;
-#endif
-
 } HDACODECR0;
 
@@ -906,7 +888,4 @@
 typedef struct HDACODECR3
 {
-    CODECVERBR3             aVerbs[CODEC_VERBS_MAX];
-    size_t                  cVerbs;
-
     /** @name Public codec functions.
      *  @{  */
@@ -965,10 +944,4 @@
     DECLR3CALLBACKMEMBER(int,  pfnCbMixerSetVolume, (PPDMDEVINS pDevIns, PDMAUDIOMIXERCTL enmMixerCtl, PPDMAUDIOVOLUME pVol));
     /** @} */
-
-#ifdef VBOX_WITH_STATISTICS
-    STAMCOUNTER StatLookupsR0;
-    STAMCOUNTER StatLookupsR3;
-#endif
-
 } HDACODECR3;
 
