Index: /trunk/src/VBox/Devices/Audio/DevIchAc97.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevIchAc97.cpp	(revision 68414)
+++ /trunk/src/VBox/Devices/Audio/DevIchAc97.cpp	(revision 68415)
@@ -472,4 +472,5 @@
 static uint32_t           ichac97StreamGetFree(PAC97STREAM pStream);
 static int                ichac97StreamTransfer(PAC97STATE pThis, PAC97STREAM pStream, uint32_t cbToProcessMax);
+static void               ichac97StreamUpdate(PAC97STATE pThis, PAC97STREAM pStream, bool fInTimer);
 
 static DECLCALLBACK(void) ichac97Reset(PPDMDEVINS pDevIns);
@@ -1016,35 +1017,5 @@
             }
 
-            uint32_t cbToProcess;
-            uint32_t cbProcessed = 0;
-
-            switch (pStream->u8SD)
-            {
-                /* Input. */
-                case AC97SOUNDSOURCE_PI_INDEX:
-                case AC97SOUNDSOURCE_MC_INDEX:
-                {
-                    cbToProcess = (uint32_t)RTCircBufFree(pCircBuf);
-                    if (cbToProcess)
-                        rc2 = ichac97StreamWrite(pThis, pStream, pMixSink, (uint32_t)cbToProcess, &cbProcessed);
-                    break;
-                }
-
-                /* Output. */
-                case AC97SOUNDSOURCE_PO_INDEX:
-                {
-                    cbToProcess = (uint32_t)RTCircBufUsed(pCircBuf);
-                    if (cbToProcess)
-                        rc2 = ichac97StreamRead(pThis, pStream, pMixSink, (uint32_t)cbToProcess, &cbProcessed);
-                    break;
-                }
-
-                default:
-                    AssertFailedStmt(rc2 = VERR_NOT_SUPPORTED);
-                    break;
-            }
-
-            if (RT_SUCCESS(rc2))
-                rc2 = AudioMixerSinkUpdate(pMixSink);
+            ichac97StreamUpdate(pThis, pStream, false /* fInTimer */);
 
             int rc3 = RTCritSectLeave(&pAIO->CritSect);
@@ -1219,14 +1190,9 @@
 static void ichac97StreamUpdate(PAC97STATE pThis, PAC97STREAM pStream, bool fInTimer)
 {
-    ichac97StreamLock(pStream);
-
     PAUDMIXSINK pSink = ichac97IndexToSink(pThis, pStream->u8SD);
     AssertPtr(pSink);
 
     if (!AudioMixerSinkIsActive(pSink)) /* No sink available? Bail out. */
-    {
-        ichac97StreamUnlock(pStream);
         return;
-    }
 
     int rc2;
@@ -1340,6 +1306,4 @@
 #endif
     }
-
-    ichac97StreamUnlock(pStream);
 }
 
@@ -2188,4 +2152,6 @@
     AssertReturn(cbToProcessMax, VERR_INVALID_PARAMETER);
 
+    ichac97StreamLock(pStream);
+
     PAC97BMREGS pRegs = &pStream->Regs;
 
@@ -2205,4 +2171,5 @@
         }
 
+        ichac97StreamUnlock(pStream);
         return VINF_SUCCESS;
     }
@@ -2212,4 +2179,6 @@
     {
         Log3Func(("[SD%RU8] BCIS set\n", pStream->u8SD));
+
+        ichac97StreamUnlock(pStream);
         return VINF_SUCCESS;
     }
@@ -2375,4 +2344,6 @@
         }
     }
+
+    ichac97StreamUnlock(pStream);
 
     LogFlowFuncLeaveRC(rc);
