Index: /trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp	(revision 73549)
+++ /trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp	(revision 73550)
@@ -154,4 +154,8 @@
             /** Flag indicating whether playback was just (re)started. */
             bool                        fFirstTransfer;
+            /** Flag indicating whether this stream is in draining mode, e.g. no new
+             *  data is being written to it but DirectSound still needs to be able to
+             *  play its remaining (buffered) data. */
+            bool                        fDrain;
             /** How much (in bytes) the last transfer from the internal buffer
              *  to the DirectSound buffer was. */
@@ -851,16 +855,14 @@
     if (!pStreamDS->Dbg.tsLastTransferredMs)
         pStreamDS->Dbg.tsLastTransferredMs = RTTimeMilliTS();
-    Log3Func(("tsLastTransferredMs=%RU64ms, cbAvail=%RU32, cbFree=%RU32 -> cbToTransfer=%RU32\n",
-              RTTimeMilliTS() - pStreamDS->Dbg.tsLastTransferredMs, cbAvail, cbFree, cbToTransfer));
+    Log3Func(("tsLastTransferredMs=%RU64ms, cbAvail=%RU32, cbFree=%RU32 -> cbToTransfer=%RU32 (fDrain=%RTbool)\n",
+              RTTimeMilliTS() - pStreamDS->Dbg.tsLastTransferredMs, cbAvail, cbFree, cbToTransfer, pStreamDS->Out.fDrain));
     pStreamDS->Dbg.tsLastTransferredMs = RTTimeMilliTS();
 #endif
 
-#if 0
-    if (cbToTransfer > cbAvail) /* Paranoia. */
-        cbToTransfer = cbAvail;
-
-    if (cbToTransfer > cbFree)
-        cbToTransfer = cbFree;
-#endif
+    /* Only transfer anything if we have enough data for a DirectSound stream's period *and* are not
+     * in draining mode (already). */
+    if (   !pStreamDS->Out.fDrain
+        && cbToTransfer < DrvAudioHlpFramesToBytes(pStreamDS->Cfg.Backend.cfPeriod, &pStreamDS->Cfg.Props))
+        return VINF_SUCCESS;
 
     while (cbToTransfer)
@@ -1760,4 +1762,5 @@
     pStreamDS->Out.cbTransferred = 0;
     pStreamDS->Out.fFirstTransfer = true;
+    pStreamDS->Out.fDrain = false;
     pStreamDS->Out.cbLastTransferred = 0;
     pStreamDS->Out.tsLastTransferred = 0;
@@ -1811,4 +1814,5 @@
         {
             /* Make sure we transferred everything. */
+            pStreamDS->Out.fDrain = true;
             rc = dsoundPlayTransfer(pThis);
             if (   RT_SUCCESS(rc)
