http://bugs.winehq.org/show_bug.cgi?id=33045
--- Comment #5 from Andrew Eikum aeikum@codeweavers.com 2013-03-05 07:56:05 CST --- (In reply to comment #3)
Is the number of bytes not a multiple of nBlockAlign?
That's it! Following an intuition, I added -1 to the one line in our winmm/wave tests "make sure fragment length is a multiple of block size" and got a deadlock resembling yours.
Yep, that's exactly it. Bunch of Heroes uses headers with 0x7FFF byte buffers, which isn't a multiple of 4.
- Investigate what native does with trailing bytes in case of underrun.
- Throw away?
- Do they prevent buffer notification, awaiting more bytes from the next header to complete a frame? That is a hairy situation!
- Do they count in GetPosition?
Alas, this mostly requires audible tests, not testbot.
Looks to me like they get thrown away. I wrote a test with two headers, one header is one byte short and the other is one byte long. After the first header plays, waveOutGetPosition(TIME_SAMPLES) reports one sample short. After the second header, it still reports exactly one sample short. Using TIME_BYTES similarly reports (dwBufferSize - dwBufferSize % nBlockAlign).