This patch is an addition to my previous patch based on the discussion on wine-devel. I changed a HeapFree()/HeapAlloc() to a HeapRealloc(). I changed *bytes to equal 0 anytime we write less bytes that we expected we could. I assign pointers to NULL after a HeapFree(). Jeremy Shaw. --- orig/dlls/winmm/winearts/audio.c +++ mod/dlls/winmm/winearts/audio.c @@ -288,7 +288,7 @@ if(wwo->sound_buffer) { HeapFree(GetProcessHeap(), 0, wwo->sound_buffer); - wwo->sound_buffer = 0; + wwo->sound_buffer = NULL; } wwo->buffer_size = 0; @@ -465,6 +465,7 @@ { CloseHandle(mr->msg_event); HeapFree(GetProcessHeap(),0,mr->messages); + mr->messages=NULL; DeleteCriticalSection(&mr->msg_crst); return 0; } @@ -718,8 +719,8 @@ { if(wwo->sound_buffer) { - HeapFree(GetProcessHeap(), 0, wwo->sound_buffer); - wwo->sound_buffer = 0; + HeapRealloc(GetProcessHeap(), 0, wwo->sound_buffer, toWrite); + wwo->buffer_size = toWrite; } } @@ -777,7 +778,11 @@ else wwo->dwPartialOffset += written; /* Remove the amount written */ - *bytes -= written; + if (written < toWrite) + *bytes = 0; + else + *bytes -= written; + wwo->dwWrittenTotal += written; /* update stats on this wave device */ return written; /* return the number of bytes written */