Index: /trunk/src/VBox/Devices/Audio/DrvAudio.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvAudio.cpp	(revision 73574)
+++ /trunk/src/VBox/Devices/Audio/DrvAudio.cpp	(revision 73575)
@@ -1686,21 +1686,21 @@
     AssertPtr(pThis->pHostDrvAudio->pfnStreamGetReadable);
 
-    for (;;)
-    {
-        uint32_t cbReadable = pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStream->pvBackend);
-        if (!cbReadable) /* Nothing to read on the backend side? Bail out. */
-            break;
-
-        const uint32_t cbFree = AudioMixBufFreeBytes(&pStream->Host.MixBuf);
-        if (!cbFree) /* No space left in the host stream? */
-            break;
-
-        if (cbReadable > cbFree) /* Don't capture more than the host stream currently can hold. */
-            cbReadable = cbFree;
-
+    /* Note: Raw means *audio frames*, not bytes! */
+    uint32_t cfReadable = pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStream->pvBackend);
+    if (!cfReadable)
+        Log2Func(("[%s] No readable data available\n", pStream->szName));
+
+    const uint32_t cfFree = AudioMixBufFree(&pStream->Guest.MixBuf); /* Parent */
+    if (!cfFree)
+        Log2Func(("[%s] Buffer full\n", pStream->szName));
+
+    if (cfReadable > cfFree) /* More data readable than we can store at the moment? Limit. */
+        cfReadable = cfFree;
+
+    while (cfReadable)
+    {
         PPDMAUDIOFRAME paFrames;
         uint32_t cfWritable;
-        rc = AudioMixBufPeekMutable(&pStream->Host.MixBuf, AUDIOMIXBUF_B2F(&pStream->Host.MixBuf, cbReadable),
-                                    &paFrames, &cfWritable);
+        rc = AudioMixBufPeekMutable(&pStream->Host.MixBuf, cfReadable, &paFrames, &cfWritable);
         if (   RT_FAILURE(rc)
             || !cfWritable)
@@ -1716,18 +1716,15 @@
             int rc2 = drvAudioStreamControlInternalBackend(pThis, pStream, PDMAUDIOSTREAMCMD_DISABLE);
             AssertRC(rc2);
-        }
-        else if (cfCaptured)
-        {
-            Assert(cfCaptured <= cfWritable);
-            if (cfCaptured > cfWritable) /* Paranoia. */
-                cfCaptured = cfWritable;
-
-            cfCapturedTotal += cfCaptured;
-        }
-        else /* Nothing captured -- bail out. */
+
             break;
-
-        if (RT_FAILURE(rc))
-            break;
+        }
+
+        Assert(cfCaptured <= cfWritable);
+        if (cfCaptured > cfWritable) /* Paranoia. */
+            cfCaptured = cfWritable;
+
+        Assert(cfReadable >= cfCaptured);
+        cfReadable      -= cfCaptured;
+        cfCapturedTotal += cfCaptured;
     }
 
