Index: /trunk/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp	(revision 54909)
+++ /trunk/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp	(revision 54910)
@@ -89,5 +89,7 @@
     PDRVHOSTPULSEAUDIO     pDrv;
     /** DAC/ADC buffer. */
-    void                  *pPCMBuf;
+    void                  *pvPCMBuf;
+    /** Size (in bytes) of DAC/ADC buffer. */
+    uint32_t               cbPCMBuf;
     /** Pointer to opaque PulseAudio stream. */
     pa_stream             *pStream;
@@ -598,14 +600,24 @@
     if (RT_SUCCESS(rc))
     {
-        int cbBuf = RT_MIN(pThisStrmOut->BufAttr.tlength * 2, pThisStrmOut->BufAttr.maxlength);
-
-        pThisStrmOut->pPCMBuf = RTMemAllocZ(cbBuf);
-        if (pThisStrmOut->pPCMBuf)
-        {
-            if (pcSamples)
-                *pcSamples = cbBuf >> pHstStrmOut->Props.cShift;
+        uint32_t cbBuf  = RT_MIN(pThisStrmOut->BufAttr.tlength * 2,
+                                 pThisStrmOut->BufAttr.maxlength); /** @todo Make this configurable! */
+        if (cbBuf) 
+        {
+            pThisStrmOut->pvPCMBuf = RTMemAllocZ(cbBuf);
+            if (pThisStrmOut->pvPCMBuf)
+            {
+                pThisStrmOut->cbPCMBuf = cbBuf;
+
+                uint32_t cSamples = cbBuf >> pHstStrmOut->Props.cShift;
+                if (pcSamples)
+                    *pcSamples = cSamples;
+
+                LogFunc(("cbBuf=%RU32, cSamples=%RU32\n", cbBuf, cSamples));
+            }
+            else
+                rc = VERR_NO_MEMORY;
         }
         else
-            rc = VERR_NO_MEMORY;
+            rc = VERR_INVALID_PARAMETER;
     }
 
@@ -810,6 +822,5 @@
     uint32_t cbReadTotal = 0;
 
-    uint32_t cLive = drvAudioHstOutSamplesLive(pHstStrmOut,
-                                               NULL /* pcStreamsLive */);
+    uint32_t cLive = drvAudioHstOutSamplesLive(pHstStrmOut, NULL /* pcStreamsLive */);
     if (!cLive)
     {
@@ -841,11 +852,15 @@
         while (cbToRead)
         {
-            rc = audioMixBufReadCirc(&pHstStrmOut->MixBuf, pThisStrmOut->pPCMBuf, cbToRead, &cRead);
-            if (RT_FAILURE(rc))
+            rc = audioMixBufReadCirc(&pHstStrmOut->MixBuf, pThisStrmOut->pvPCMBuf, 
+                                     RT_MIN(cbToRead, pThisStrmOut->cbPCMBuf), &cRead);
+            if (   !cRead 
+                || RT_FAILURE(rc))
+            {
                 break;
+            }
 
             cbRead = AUDIOMIXBUF_S2B(&pHstStrmOut->MixBuf, cRead);
-            if (pa_stream_write(pThisStrmOut->pStream, pThisStrmOut->pPCMBuf, cbRead,
-                                NULL /* Cleanup callback */, 0, PA_SEEK_RELATIVE) < 0)
+            if (pa_stream_write(pThisStrmOut->pStream, pThisStrmOut->pvPCMBuf, cbRead, NULL /* Cleanup callback */, 
+                                0, PA_SEEK_RELATIVE) < 0)
             {
                 rc = drvHostPulseAudioError(pThisStrmOut->pDrv, "Failed to write to output stream");
@@ -854,6 +869,9 @@
 
             Assert(cbToRead >= cRead);
-            cbToRead -= cbRead;
+            cbToRead    -= cbRead;
             cbReadTotal += cbRead;
+
+            LogFlowFunc(("\tcRead=%RU32 (%zu bytes) cbReadTotal=%RU32, cbToRead=%RU32\n", 
+                         cRead, AUDIOMIXBUF_S2B(&pHstStrmOut->MixBuf, cRead), cbReadTotal, cbToRead));
         }
 
@@ -871,6 +889,5 @@
             *pcSamplesPlayed = cReadTotal;
 
-        LogFlowFunc(("cReadTotal=%RU32 (%RU32 bytes), rc=%Rrc\n",
-                     cReadTotal, cbReadTotal, rc));
+        LogFlowFunc(("cReadTotal=%RU32 (%RU32 bytes), rc=%Rrc\n", cReadTotal, cbReadTotal, rc));
     }
 
@@ -934,8 +951,10 @@
     }
 
-    if (pThisStrmOut->pPCMBuf)
-    {
-        RTMemFree(pThisStrmOut->pPCMBuf);
-        pThisStrmOut->pPCMBuf = NULL;
+    if (pThisStrmOut->pvPCMBuf)
+    {
+        RTMemFree(pThisStrmOut->pvPCMBuf);
+        pThisStrmOut->pvPCMBuf = NULL;
+
+        pThisStrmOut->cbPCMBuf = 0;
     }
 
