Index: /trunk/src/VBox/Devices/Audio/AudioMixer.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/AudioMixer.cpp	(revision 87269)
+++ /trunk/src/VBox/Devices/Audio/AudioMixer.cpp	(revision 87270)
@@ -847,4 +847,10 @@
         pSink->VolumeCombined.uLeft  = PDMAUDIO_VOLUME_MAX;
         pSink->VolumeCombined.uRight = PDMAUDIO_VOLUME_MAX;
+
+        const size_t cbScratchBuf = _1K; /** @todo Make this configurable? */
+
+        pSink->pabScratchBuf = (uint8_t *)RTMemAlloc(cbScratchBuf);
+        AssertPtrReturn(pSink->pabScratchBuf, VERR_NO_MEMORY);
+        pSink->cbScratchBuf  = cbScratchBuf;
     }
 
@@ -916,4 +922,14 @@
         RTStrFree(pSink->pszName);
         pSink->pszName = NULL;
+    }
+
+    if (pSink->pabScratchBuf)
+    {
+        Assert(pSink->cbScratchBuf);
+
+        RTMemFree(pSink->pabScratchBuf);
+        pSink->pabScratchBuf = NULL;
+
+        pSink->cbScratchBuf = 0;
     }
 
@@ -1675,4 +1691,8 @@
         return rc;
 
+    /* Sanity. */
+    AssertPtr(pSink->pabScratchBuf);
+    Assert(pSink->cbScratchBuf);
+
     /* Update each mixing sink stream's status. */
     PAUDMIXSTREAM pMixStream;
@@ -1689,18 +1709,18 @@
     uint32_t cbToWriteToStreams = AudioMixBufUsedBytes(&pSink->MixBuf);
 
-    uint8_t arrChunkBuf[_1K]; /** @todo Hm ... some zero copy / shared buffers would be nice! */
     while (cbToWriteToStreams)
     {
         uint32_t cfChunk;
-        rc  = AudioMixBufAcquireReadBlock(&pSink->MixBuf, arrChunkBuf, RT_MIN(cbToWriteToStreams, sizeof(arrChunkBuf)), &cfChunk);
+        rc  = AudioMixBufAcquireReadBlock(&pSink->MixBuf, pSink->pabScratchBuf, RT_MIN(cbToWriteToStreams, pSink->cbScratchBuf),
+                                          &cfChunk);
         if (RT_FAILURE(rc))
             break;
 
         const uint32_t cbChunk = DrvAudioHlpFramesToBytes(cfChunk, &pSink->PCMProps);
-        Assert(cbChunk <= sizeof(arrChunkBuf));
+        Assert(cbChunk <= pSink->cbScratchBuf);
 
         /* Multiplex the current chunk in a synchronized fashion to all connected streams. */
         uint32_t cbChunkWrittenMin = 0;
-        rc = audioMixerSinkMultiplexSync(pSink, AUDMIXOP_COPY, arrChunkBuf, cbChunk, &cbChunkWrittenMin);
+        rc = audioMixerSinkMultiplexSync(pSink, AUDMIXOP_COPY, pSink->pabScratchBuf, cbChunk, &cbChunkWrittenMin);
         if (RT_SUCCESS(rc))
         {
Index: /trunk/src/VBox/Devices/Audio/AudioMixer.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/AudioMixer.h	(revision 87269)
+++ /trunk/src/VBox/Devices/Audio/AudioMixer.h	(revision 87270)
@@ -194,4 +194,8 @@
      * a parent buffer for all streams this sink owns. */
     PDMAUDIOMIXBUF          MixBuf;
+    /** Scratch buffer for multiplexing / mixing. Might be NULL if not needed. */
+    uint8_t                *pabScratchBuf;
+    /** Size (in bytes) of pabScratchBuf. Might be 0 if not needed. */
+    size_t                  cbScratchBuf;
     /** Union for input/output specifics. */
     union
