Module: wine Branch: master Commit: abe8c127d9789a99274ea1a5e83e650f3e8fed26 URL: http://source.winehq.org/git/wine.git/?a=commit;h=abe8c127d9789a99274ea1a5e8...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Sat Aug 4 10:41:59 2007 +0200
dsound: Make timer more robust.
---
dlls/dsound/dsound.c | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c index d154119..cc693cb 100644 --- a/dlls/dsound/dsound.c +++ b/dlls/dsound/dsound.c @@ -1514,10 +1514,26 @@ HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGUID lpcG
hr = DSOUND_PrimaryCreate(device); if (hr == DS_OK) { + UINT triggertime = DS_TIME_DEL, res = DS_TIME_RES, id; + TIMECAPS time; + DSOUND_renderer[device->drvdesc.dnDevNode] = device; - timeBeginPeriod(DS_TIME_RES); - DSOUND_renderer[device->drvdesc.dnDevNode]->timerID = timeSetEvent(DS_TIME_DEL, DS_TIME_RES, DSOUND_timer, - (DWORD_PTR)DSOUND_renderer[device->drvdesc.dnDevNode], TIME_PERIODIC | TIME_CALLBACK_FUNCTION | TIME_KILL_SYNCHRONOUS); + timeGetDevCaps(&time, sizeof(TIMECAPS)); + TRACE("Minimum timer resolution: %u, max timer: %u\n", time.wPeriodMin, time.wPeriodMax); + if (triggertime < time.wPeriodMin) + triggertime = time.wPeriodMin; + if (res < time.wPeriodMin) + res = time.wPeriodMin; + if (timeBeginPeriod(res) == TIMERR_NOCANDO) + WARN("Could not set minimum resolution, don't expect sound\n"); + id = timeSetEvent(triggertime, res, DSOUND_timer, (DWORD_PTR)device, TIME_PERIODIC | TIME_KILL_SYNCHRONOUS); + if (!id) + { + WARN("Timer not created! Retrying without TIME_KILL_SYNCHRONOUS\n"); + id = timeSetEvent(triggertime, res, DSOUND_timer, (DWORD_PTR)device, TIME_PERIODIC); + if (!id) ERR("Could not create timer, sound playback will not occur\n"); + } + DSOUND_renderer[device->drvdesc.dnDevNode]->timerID = id; } else { WARN("DSOUND_PrimaryCreate failed\n"); }