Index: /trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp	(revision 33879)
+++ /trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp	(revision 33880)
@@ -1183,5 +1183,5 @@
 static uint32_t hdaReadAudio(INTELHDLinkState *pState, int avail, bool *fStop)
 {
-    uint8_t tmpbuf[4096];
+    uint8_t tmpbuf[512];
     uint32_t temp;
     uint32_t u32Rest = 0;
@@ -1201,5 +1201,5 @@
     {
         int copied;
-        to_copy = audio_MIN(temp, 4096U);
+        to_copy = audio_MIN(temp, SDFIFOS(pState, 4) & ~((1<<4) - 1));
         copied = AUD_read (voice, tmpbuf, to_copy);
         Log (("hda: read_audio max=%x to_copy=%x copied=%x\n",
@@ -1219,5 +1219,5 @@
 static uint32_t hdaWriteAudio(INTELHDLinkState *pState, int avail, bool *fStop)
 {
-    uint8_t tmpbuf[4096];
+    uint8_t tmpbuf[512];
     uint32_t temp;
     uint32_t u32Rest;
@@ -1232,4 +1232,5 @@
         return written;
     }
+    temp = audio_MIN(SDFIFOS(pState, 4) & ~((1<<4) - 1), temp);
     while (temp)
     {
@@ -1240,5 +1241,4 @@
         Log (("hda: write_audio max=%x to_copy=%x copied=%x\n",
               avail, to_copy, copied));
-        Assert((copied));
         if (!copied)
         {
@@ -1271,4 +1271,5 @@
     uint32_t *pu32Lpib;
     uint32_t u32Lcbl;
+    uint32_t u32Fifos;
     switch (src)
     {
@@ -1307,4 +1308,5 @@
         return;
     /* Fetch the Buffer Descriptor Entry (BDE). */
+    *pu32Sts |= HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY);
     fetch_bd(pState, pBdle, u64BaseDMA);
     while( avail && !fStop)
@@ -1351,4 +1353,5 @@
         }
     }
+    *pu32Sts &= ~HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY);
 }
 
