Index: trunk/src/VBox/Devices/Audio/DevHda.cpp
===================================================================
--- trunk/src/VBox/Devices/Audio/DevHda.cpp	(revision 89884)
+++ trunk/src/VBox/Devices/Audio/DevHda.cpp	(revision 89885)
@@ -4528,5 +4528,4 @@
                                   "BufSizeInMs"
                                   "|BufSizeOutMs"
-                                  "|InitialDelayMs"
                                   "|DebugEnabled"
                                   "|DebugPathOut",
@@ -4552,18 +4551,4 @@
         return PDMDEV_SET_ERROR(pDevIns, VERR_OUT_OF_RANGE,
                                 N_("HDA configuration error: 'BufSizeOutMs' is out of bound, max 2000 ms"));
-
-    /** @devcfgm{hda,InitialDelayMs,uint16_t,0,256,12,ms}
-     * How long to delay when a stream starts before engaging the asynchronous I/O
-     * thread from the DMA timer callback.  Because it's used from the DMA timer
-     * callback, it will implicitly be rounded up to the next timer period.
-     * This is for adding a little host scheduling leeway into the playback. */
-    /** @todo InitialDelayMs is rather pointless, DrvAudio does pre-buffering in
-     * both directions now. (bird, 2021-06-08) */
-    rc = pHlp->pfnCFGMQueryU16Def(pCfg, "InitialDelayMs", &pThis->msInitialDelay, 12);
-    if (RT_FAILURE(rc))
-         return PDMDEV_SET_ERROR(pDevIns, rc, N_("HDA configuration error: failed to read 'InitialDelayMs' as uint16_t"));
-    if (pThis->msInitialDelay > 256)
-        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
-                                   N_("HDA configuration error: Out of range: 0 <= InitialDelayMs < 256: %u"), pThis->msInitialDelay);
 
     rc = pHlp->pfnCFGMQueryBoolDef(pCfg, "DebugEnabled", &pThisCC->Dbg.fEnabled, false);
Index: trunk/src/VBox/Devices/Audio/DevHda.h
===================================================================
--- trunk/src/VBox/Devices/Audio/DevHda.h	(revision 89884)
+++ trunk/src/VBox/Devices/Audio/DevHda.h	(revision 89885)
@@ -143,8 +143,4 @@
     /** Current IRQ level. */
     uint8_t                 u8IRQL;
-    uint8_t                 abPadding[4 + 2];
-    /** Number of milliseconds to delay kicking off the AIO when a stream starts.
-     * @sa InitialDelayMs config value.  */
-    uint16_t                msInitialDelay;
     /** Config: Internal input DMA buffer size override, specified in milliseconds.
      * Zero means default size according to buffer and stream config.
Index: trunk/src/VBox/Devices/Audio/DevHdaStream.cpp
===================================================================
--- trunk/src/VBox/Devices/Audio/DevHdaStream.cpp	(revision 89884)
+++ trunk/src/VBox/Devices/Audio/DevHdaStream.cpp	(revision 89885)
@@ -683,6 +683,5 @@
        work the AIO thread. */
     pStreamShared->State.fInputPreBuffered = false;
-    pStreamShared->State.cbInputPreBuffer  = PDMAudioPropsMilliToBytes(&pCfg->Props, pThis->msInitialDelay);
-    pStreamShared->State.cbInputPreBuffer  = RT_MIN(cbMaxPeriod * 2, pStreamShared->State.cbInputPreBuffer);
+    pStreamShared->State.cbInputPreBuffer  = cbMaxPeriod * 2;
 
     /*
@@ -750,5 +749,5 @@
      *       channels we don't support / need to save space.
      */
-    uint32_t cbCircBuf = PDMAudioPropsMilliToBytes(&pCfg->Props, pThis->msInitialDelay + RT_MS_1SEC * 6 / uTransferHz);
+    uint32_t cbCircBuf = PDMAudioPropsMilliToBytes(&pCfg->Props, RT_MS_1SEC * 6 / uTransferHz);
     LogRel2(("HDA: Stream #%RU8 default ring buffer size is %RU32 bytes / %RU64 ms\n",
              uSD, cbCircBuf, PDMAudioPropsBytesToMilli(&pCfg->Props, cbCircBuf)));
@@ -861,5 +860,4 @@
     pStreamShared->State.tsLastTransferNs = 0;
     pStreamShared->State.tsLastReadNs     = 0;
-    pStreamShared->State.tsAioDelayEnd    = UINT64_MAX;
     pStreamShared->State.tsStart          = 0;
 
@@ -1007,8 +1005,7 @@
     pStreamShared->State.tsLastReadNs  = RTTimeNanoTS();
     pStreamShared->State.tsStart       = tsNow;
-    pStreamShared->State.tsAioDelayEnd = tsNow + PDMDevHlpTimerFromMilli(pDevIns, pStreamShared->hTimer, pThis->msInitialDelay);
-    Log3Func(("#%u: tsStart=%RU64 tsAioDelayEnd=%RU64 tsLastReadNs=%RU64\n", pStreamShared->u8SD,
-              pStreamShared->State.tsStart, pStreamShared->State.tsAioDelayEnd, pStreamShared->State.tsLastReadNs));
-
+    Log3Func(("#%u: tsStart=%RU64 tsLastReadNs=%RU64\n",
+              pStreamShared->u8SD, pStreamShared->State.tsStart, pStreamShared->State.tsLastReadNs));
+    RT_NOREF(pDevIns, pThis);
 }
 
@@ -1019,5 +1016,5 @@
 {
     Log3Func(("#%u\n", pStreamShared->u8SD));
-    pStreamShared->State.tsAioDelayEnd = UINT64_MAX;
+    RT_NOREF(pStreamShared);
 }
 
@@ -1372,5 +1369,4 @@
 }
 #endif /* IN_RING3 || VBOX_HDA_WITH_ON_REG_ACCESS_DMA */
-
 
 #ifdef IN_RING3
@@ -2236,34 +2232,7 @@
         /*
          * Should we push data to down thru the mixer to and to the host drivers?
-         *
-         * We initially delay this by pThis->msInitialDelay, but after than we'll
-         * kick the AIO thread every time we've put more data in the buffer (which is
-         * every time) as the host audio device needs to get data in a timely manner.
-         *
-         * (We used to try only wake up the AIO thread according to pThis->uIoTimer
-         * and host wall clock, but that meant we would miss a wakup after the DMA
-         * timer was called a little late or if TM entered into catch-up mode.)
          */
-        bool fKickAioThread;
-        if (!pStreamShared->State.tsAioDelayEnd)
-            fKickAioThread = pStreamShared->State.offWrite > offWriteBefore
-                          || hdaR3StreamGetFree(pStreamR3) < pStreamShared->State.cbAvgTransfer * 2;
-        else if (PDMDevHlpTimerGet(pDevIns, pStreamShared->hTimer) >= pStreamShared->State.tsAioDelayEnd)
-        {
-            Log3Func(("Initial delay done: Passed tsAioDelayEnd.\n"));
-            pStreamShared->State.tsAioDelayEnd = 0;
-            fKickAioThread = true;
-        }
-        else if (hdaR3StreamGetFree(pStreamR3) < pStreamShared->State.cbAvgTransfer * 2)
-        {
-            Log3Func(("Initial delay done: Passed running short on buffer.\n"));
-            pStreamShared->State.tsAioDelayEnd = 0;
-            fKickAioThread = true;
-        }
-        else
-        {
-            Log3Func(("Initial delay pending...\n"));
-            fKickAioThread = false;
-        }
+        bool fKickAioThread = pStreamShared->State.offWrite > offWriteBefore
+                           || hdaR3StreamGetFree(pStreamR3) < pStreamShared->State.cbAvgTransfer * 2;
 
         Log3Func(("msDelta=%RU64 (vs %u) cbStreamFree=%#x (vs %#x) => fKickAioThread=%RTbool\n",
Index: trunk/src/VBox/Devices/Audio/DevHdaStream.h
===================================================================
--- trunk/src/VBox/Devices/Audio/DevHdaStream.h	(revision 89884)
+++ trunk/src/VBox/Devices/Audio/DevHdaStream.h	(revision 89885)
@@ -116,7 +116,4 @@
     uint64_t                tsLastReadNs;
 
-    /** This is set to the timer clock time when the msInitialDelay period is over.
-     * Once reached, this is set to zero to avoid unnecessary time queries. */
-    uint64_t                tsAioDelayEnd;
     /** The start time for the playback (on the timer clock). */
     uint64_t                tsStart;
@@ -154,7 +151,4 @@
     /** Current loop number within the current scheduling step.  */
     uint32_t                idxScheduleLoop;
-
-    /** Aligning the next members on 16 bytes. */
-    uint64_t                u64Padding;
 
     /** Buffer descriptors and additional timer scheduling state.
@@ -252,8 +246,6 @@
     TMTIMERHANDLE               hTimer;
 
-#if 0
     /** Pad the structure size to a 64 byte alignment. */
     uint64_t                    au64Padding1[2];
-#endif
 } HDASTREAM;
 AssertCompileMemberAlignment(HDASTREAM, State.aBdl, 16);
