http://bugs.winehq.org/show_bug.cgi?id=29531
--- Comment #4 from Jörg Höhle hoehle@users.sourceforge.net 2012-01-20 12:41:42 CST --- (In reply to comment #1)
There might be a problem with the timer code, but more likely we should be using a more reliable method to trigger our write() function periodically.
DSound uses timeSetEvent. I observed that timeSetEvent has very different, interesting semantics: it'll really maintain a constant rate even when system load increases. It's very far from "sleep 10ms after every event". It'll even call us 10 times in a row if the system was busy for 100ms! CreateTimerQueue shows callbacks at .015s, then .026, then .037 etc. timeSetEvent may go to .026, but then sleep less and hit .035s. Alas, timeSetEvent is from winmm, whereas mmdevapi is below that.
http://wiki.cockos.com/wiki/index.php/How_to_run_Reaper_in_Wine_on_Linux "Due to the way wine works there is a lot of overhead in using IPC (Inter Process Communication). Reaper uses ... Native Events." And they recommend to disable them -- and poll instead!
Yet I think we still have opportunities for optimization -- and first getting the code correct -- before switching the trigger. OTOH, why not now?