Can someone who understands the code comment?
I don't, never looked at audio code before, but the above has two changes:
The condition has the '2 *' bit in it, and the body of the if has
wwo->dwPlayedTotal = wwo->dwWrittenTotal;
The TRACEs are noops, can be ignored.
So I suggest trying them out individually, to see which one causes the problem (or maybe they can not be separated). Experimentation will tell. :)
I tried each individually, and neither helped. Only the two changes together yielded a wine that properly terminated when I clicked on the "Exit" button in msvc4++'s installer.
- Dan
a more complete fix should be included could you try if it works fine ?
A+
Index: dlls/winmm/wineoss/audio.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/wineoss/audio.c,v retrieving revision 1.65 diff -u -r1.65 audio.c --- dlls/winmm/wineoss/audio.c 4 Nov 2002 22:39:19 -0000 1.65 +++ dlls/winmm/wineoss/audio.c 11 Dec 2002 20:21:45 -0000 @@ -1147,8 +1171,12 @@ TRACE("fragments=%d/%d, fragsize=%d, bytes=%d\n", dspspace.fragments, dspspace.fragstotal, dspspace.fragsize, dspspace.bytes);
- /* input queue empty and output buffer with less than one fragment to play */ - if (!wwo->lpPlayPtr && wwo->dwBufferSize < availInQ + wwo->dwFragmentSize) { + /* input queue empty and output buffer with less than one fragment to play + * actually some cards do not play the fragment before the last if this one is partially feed + * so we need to test for full the availability of 2 fragments + */ + if (!wwo->lpPlayPtr && wwo->dwBufferSize < availInQ + 2 * wwo->dwFragmentSize && + !wwo->bNeedPost) { TRACE("Run out of wavehdr:s...\n"); return INFINITE; } @@ -1216,8 +1244,8 @@ TRACE("flushing\n"); ioctl(wwo->ossdev->fd, SNDCTL_DSP_SYNC, 0); wwo->dwPlayedTotal = wwo->dwWrittenTotal; - } - else { + dwNextNotifyTime = wodPlayer_NotifyCompletions(wwo, FALSE); + } else { TRACE("recovering\n"); dwNextFeedTime = wodPlayer_FeedDSP(wwo); }