Index: /trunk/src/VBox/Devices/Audio/DrvAudio.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvAudio.cpp	(revision 87874)
+++ /trunk/src/VBox/Devices/Audio/DrvAudio.cpp	(revision 87875)
@@ -1352,8 +1352,8 @@
     uint32_t cfPlayedTotal = 0;
 
-    uint8_t auBuf[256]; /** @todo Get rid of this here. */
-
     uint32_t cfLeft  = cfToPlay;
-    uint32_t cbChunk = sizeof(auBuf);
+
+    uint8_t  *pvChunk = (uint8_t *)pThis->pvScratchBuf;
+    uint32_t  cbChunk = pThis->cbScratchBuf;
 
     while (cfLeft)
@@ -1361,5 +1361,5 @@
         uint32_t cfRead = 0;
         rc = AudioMixBufAcquireReadBlock(&pStream->Host.MixBuf,
-                                         auBuf, RT_MIN(cbChunk, AUDIOMIXBUF_F2B(&pStream->Host.MixBuf, cfLeft)),
+                                         pvChunk, RT_MIN(cbChunk, AUDIOMIXBUF_F2B(&pStream->Host.MixBuf, cfLeft)),
                                          &cfRead);
         if (RT_FAILURE(rc))
@@ -1372,10 +1372,10 @@
         uint32_t cbPlayed = 0;
         rc = pThis->pHostDrvAudio->pfnStreamPlay(pThis->pHostDrvAudio, pStream->pvBackend,
-                                                 auBuf, cbRead, &cbPlayed);
+                                                 pvChunk, cbRead, &cbPlayed);
         if (   RT_SUCCESS(rc)
             && cbPlayed)
         {
             if (pThis->Out.Cfg.Dbg.fEnabled)
-                DrvAudioHlpFileWrite(pStream->Out.Dbg.pFilePlayNonInterleaved, auBuf, cbPlayed, 0 /* fFlags */);
+                DrvAudioHlpFileWrite(pStream->Out.Dbg.pFilePlayNonInterleaved, pvChunk, cbPlayed, 0 /* fFlags */);
 
             if (cbRead != cbPlayed)
@@ -1438,5 +1438,6 @@
     uint32_t cfPlayedTotal = 0;
 
-    PDMAUDIOFRAME aFrameBuf[_4K]; /** @todo Get rid of this here. */
+    PPDMAUDIOFRAME paFrames = (PPDMAUDIOFRAME)pThis->pvScratchBuf;
+    const size_t    cFrames =                 pThis->cbScratchBuf / sizeof(PDMAUDIOFRAME);
 
     uint32_t cfLeft = cfToPlay;
@@ -1444,6 +1445,6 @@
     {
         uint32_t cfRead = 0;
-        rc = AudioMixBufPeek(&pStream->Host.MixBuf, cfLeft, aFrameBuf,
-                             RT_MIN(cfLeft, RT_ELEMENTS(aFrameBuf)), &cfRead);
+        rc = AudioMixBufPeek(&pStream->Host.MixBuf, cfLeft, paFrames,
+                             RT_MIN(cfLeft, cFrames), &cfRead);
 
         if (RT_SUCCESS(rc))
@@ -1455,7 +1456,7 @@
                 /* Note: As the stream layout is RPDMAUDIOSTREAMLAYOUT_RAW, operate on audio frames
                  *       rather on bytes. */
-                Assert(cfRead <= RT_ELEMENTS(aFrameBuf));
+                Assert(cfRead <= cFrames);
                 rc = pThis->pHostDrvAudio->pfnStreamPlay(pThis->pHostDrvAudio, pStream->pvBackend,
-                                                         aFrameBuf, cfRead, &cfPlayed);
+                                                         paFrames, cfRead, &cfPlayed);
                 if (   RT_FAILURE(rc)
                     || !cfPlayed)
@@ -1724,7 +1725,4 @@
     AssertPtr(pThis->pHostDrvAudio->pfnStreamGetReadable);
 
-    uint8_t  auBuf[_1K]; /** @todo Get rid of this. */
-    uint32_t cbBuf = sizeof(auBuf);
-
     uint32_t cbReadable = pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStream->pvBackend);
     if (!cbReadable)
@@ -1742,5 +1740,5 @@
         uint32_t cbCaptured;
         rc = pThis->pHostDrvAudio->pfnStreamCapture(pThis->pHostDrvAudio, pStream->pvBackend,
-                                                    auBuf, RT_MIN(cbReadable, cbBuf), &cbCaptured);
+                                                    pThis->pvScratchBuf, RT_MIN(cbReadable, pThis->cbScratchBuf), &cbCaptured);
         if (RT_FAILURE(rc))
         {
@@ -1751,7 +1749,7 @@
         }
 
-        Assert(cbCaptured <= cbBuf);
-        if (cbCaptured > cbBuf) /* Paranoia. */
-            cbCaptured = cbBuf;
+        Assert(cbCaptured <= pThis->cbScratchBuf);
+        if (cbCaptured > pThis->cbScratchBuf) /* Paranoia. */
+            cbCaptured = pThis->cbScratchBuf;
 
         if (!cbCaptured) /* Nothing captured? Take a shortcut. */
@@ -1761,5 +1759,5 @@
          * (first) processing (if needed), so always write the incoming data at offset 0. */
         uint32_t cfHstWritten = 0;
-        rc = AudioMixBufWriteAt(&pStream->Host.MixBuf, 0 /* offFrames */, auBuf, cbCaptured, &cfHstWritten);
+        rc = AudioMixBufWriteAt(&pStream->Host.MixBuf, 0 /* offFrames */, pThis->pvScratchBuf, cbCaptured, &cfHstWritten);
         if (   RT_FAILURE(rc)
             || !cfHstWritten)
@@ -1771,5 +1769,5 @@
 
         if (pThis->In.Cfg.Dbg.fEnabled)
-            DrvAudioHlpFileWrite(pStream->In.Dbg.pFileCaptureNonInterleaved, auBuf, cbCaptured, 0 /* fFlags */);
+            DrvAudioHlpFileWrite(pStream->In.Dbg.pFileCaptureNonInterleaved, pThis->pvScratchBuf, cbCaptured, 0 /* fFlags */);
 
         uint32_t cfHstMixed = 0;
@@ -2381,4 +2379,9 @@
     int rc = RTCritSectInit(&pThis->CritSect);
     AssertRCReturn(rc, rc);
+
+    const size_t cbScratchBuf = _4K; /** @todo Make this configurable? */
+    pThis->pvScratchBuf = RTMemAlloc(cbScratchBuf);
+    AssertPtrReturn(pThis->pvScratchBuf, VERR_NO_MEMORY);
+    pThis->cbScratchBuf = cbScratchBuf;
 
     /*
@@ -3732,4 +3735,12 @@
         drvAudioCallbackDestroy(pCB);
 #endif
+
+    if (pThis->pvScratchBuf)
+    {
+        Assert(pThis->cbScratchBuf);
+
+        RTMemFree(pThis->pvScratchBuf);
+        pThis->pvScratchBuf = NULL;
+    }
 
     if (RTCritSectIsInitialized(&pThis->CritSect))
Index: /trunk/src/VBox/Devices/Audio/DrvAudio.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvAudio.h	(revision 87874)
+++ /trunk/src/VBox/Devices/Audio/DrvAudio.h	(revision 87875)
@@ -143,4 +143,8 @@
     /** Audio configuration settings retrieved from the backend. */
     PDMAUDIOBACKENDCFG      BackendCfg;
+    /** Commonly used scratch buffer. */
+    void                   *pvScratchBuf;
+    /** Size (in bytes) of commonly used scratch buffer. */
+    size_t                  cbScratchBuf;
 #ifdef VBOX_WITH_STATISTICS
     /** Statistics for the statistics manager (STAM). */
