Index: /trunk/src/VBox/Devices/Audio/DevHDACommon.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevHDACommon.h	(revision 76048)
+++ /trunk/src/VBox/Devices/Audio/DevHDACommon.h	(revision 76049)
@@ -96,5 +96,5 @@
  *       a higher Hz rate, as the device emulation otherwise will come into
  *       timing trouble, making the output (DMA reads) crackling. */
-#define HDA_TIMER_HZ_DEFAULT        200
+#define HDA_TIMER_HZ_DEFAULT        100
 
 /** Default position adjustment (in audio samples).
Index: /trunk/src/VBox/Devices/Audio/HDAStream.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/HDAStream.cpp	(revision 76048)
+++ /trunk/src/VBox/Devices/Audio/HDAStream.cpp	(revision 76049)
@@ -239,4 +239,22 @@
     AssertRCReturn(rc, rc);
 
+    /*
+     * Set the stream's timer Hz rate, based on the stream channel count.
+     * Currently this is just a rough guess and we might want to optimize this further.
+     *
+     * In any case, more channels per SDI/SDO means that we have to drive data more frequently.
+     */
+    if (pThis->uTimerHz == HDA_TIMER_HZ_DEFAULT) /* Make sure that we don't have any custom Hz rate set we want to enforce */
+    {
+        if (Props.cChannels >= 5)
+            pStream->State.uTimerHz = 300;
+        else if (Props.cChannels == 4)
+            pStream->State.uTimerHz = 150;
+        else
+            pStream->State.uTimerHz = 100;
+    }
+    else
+        pStream->State.uTimerHz = pThis->uTimerHz;
+
 #ifndef VBOX_WITH_AUDIO_HDA_51_SURROUND
     if (Props.cChannels > 2)
@@ -329,7 +347,7 @@
     {
         /* Make sure that the chosen Hz rate dividable by the stream's rate. */
-        if (pStream->State.Cfg.Props.uHz % pThis->uTimerHz != 0)
-            LogRel(("HDA: Device timer (%RU32) does not fit to stream #%RU8 timing (%RU32)\n",
-                    pThis->uTimerHz, pStream->u8SD, pStream->State.Cfg.Props.uHz));
+        if (pStream->State.Cfg.Props.uHz % pStream->State.uTimerHz != 0)
+            LogRel(("HDA: Stream timer Hz rate (%RU32) does not fit to stream #%RU8 timing (%RU32)\n",
+                    pStream->State.uTimerHz, pStream->u8SD, pStream->State.Cfg.Props.uHz));
 
         /* Figure out how many transfer fragments we're going to use for this stream. */
@@ -427,5 +445,5 @@
         /* Calculate the bytes we need to transfer to / from the stream's DMA per iteration.
          * This is bound to the device's Hz rate and thus to the (virtual) timing the device expects. */
-        pStream->State.cbTransferChunk = (pStream->State.Cfg.Props.uHz / pThis->uTimerHz) * pStream->State.Mapping.cbFrameSize;
+        pStream->State.cbTransferChunk = (pStream->State.Cfg.Props.uHz / pStream->State.uTimerHz) * pStream->State.Mapping.cbFrameSize;
         Assert(pStream->State.cbTransferChunk);
         Assert(pStream->State.cbTransferChunk % pStream->State.Mapping.cbFrameSize == 0);
@@ -435,5 +453,5 @@
             pStream->State.cbTransferChunk = pStream->State.cbTransferSize;
 
-        const uint64_t cTicksPerHz = TMTimerGetFreq(pStream->pTimer) / pThis->uTimerHz;
+        const uint64_t cTicksPerHz = TMTimerGetFreq(pStream->pTimer) / pStream->State.uTimerHz;
 
         /* Calculate the timer ticks per byte for this stream. */
@@ -447,5 +465,5 @@
         LogFunc(("[SD%RU8] Timer %uHz (%RU64 ticks per Hz), cTicksPerByte=%RU64, cbTransferChunk=%RU32, cTransferTicks=%RU64, " \
                  "cbTransferSize=%RU32\n",
-                 pStream->u8SD, pThis->uTimerHz, cTicksPerHz, pStream->State.cTicksPerByte,
+                 pStream->u8SD, pStream->State.uTimerHz, cTicksPerHz, pStream->State.cTicksPerByte,
                  pStream->State.cbTransferChunk, pStream->State.cTransferTicks, pStream->State.cbTransferSize));
 
Index: /trunk/src/VBox/Devices/Audio/HDAStream.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/HDAStream.h	(revision 76048)
+++ /trunk/src/VBox/Devices/Audio/HDAStream.h	(revision 76049)
@@ -150,5 +150,10 @@
      *  BDLE interrupt-on-completion (IOC) bits set. */
     uint8_t                 cTransferPendingInterrupts;
-    uint8_t                 Padding2[4];
+    uint8_t                 Padding2[2];
+    /** The stream's timer Hz rate.
+     *  This value can can be different from the device's default Hz rate,
+     *  depending on the rate the stream expects (e.g. for 5.1 speaker setups).
+     *  Set in hdaR3StreamInit(). */
+    uint16_t                uTimerHz;
     /** Number of audio data frames for the position adjustment.
      *  0 if no position adjustment is needed. */
