From: R��mi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_asyncreader.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index fa56eac737e..6fb37264e3d 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -57,6 +57,7 @@ struct async_reader IWMReaderCallback *callback; void *context;
+ REFERENCE_TIME clock_start; LARGE_INTEGER clock_frequency;
HANDLE callback_thread; @@ -70,19 +71,17 @@ struct async_reader QWORD user_time; };
-static REFERENCE_TIME get_current_time(const struct async_reader *reader) +static REFERENCE_TIME async_reader_get_time(const struct async_reader *reader, bool absolute) { LARGE_INTEGER time; - QueryPerformanceCounter(&time); - return (time.QuadPart * 1000) / reader->clock_frequency.QuadPart * 10000; + return (time.QuadPart * 1000) / reader->clock_frequency.QuadPart * 10000 - (absolute ? 0 : reader->clock_start); }
static void callback_thread_run(struct async_reader *reader) { IWMReaderCallbackAdvanced *callback_advanced = reader->callback_advanced; IWMReaderCallback *callback = reader->callback; - REFERENCE_TIME start_time; struct wm_stream *stream; static const DWORD zero; QWORD pts, duration; @@ -91,8 +90,6 @@ static void callback_thread_run(struct async_reader *reader) HRESULT hr = S_OK; DWORD flags;
- start_time = get_current_time(reader); - while (reader->running && list_empty(&reader->async_ops)) { LeaveCriticalSection(&reader->callback_cs); @@ -121,13 +118,13 @@ static void callback_thread_run(struct async_reader *reader) { while (reader->running && list_empty(&reader->async_ops)) { - REFERENCE_TIME current_time = get_current_time(reader); + REFERENCE_TIME current_time = async_reader_get_time(reader, false);
- if (pts <= current_time - start_time) + if (pts <= current_time) break;
SleepConditionVariableCS(&reader->callback_cv, &reader->callback_cs, - (pts - (current_time - start_time)) / 10000); + (pts - current_time) / 10000); } }
@@ -207,7 +204,10 @@ static DWORD WINAPI async_reader_callback_thread(void *arg)
reader->context = info->context; if (SUCCEEDED(hr)) + { wm_reader_seek(&reader->reader, info->start, info->duration); + reader->clock_start = async_reader_get_time(reader, true); + } free(info);
LeaveCriticalSection(&reader->callback_cs); @@ -221,6 +221,9 @@ static DWORD WINAPI async_reader_callback_thread(void *arg) }
case ASYNC_OP_STOP: + if (SUCCEEDED(hr)) + reader->clock_start = 0; + LeaveCriticalSection(&reader->callback_cs); IWMReaderCallback_OnStatus(reader->callback, WMT_STOPPED, hr, WMT_TYPE_DWORD, (BYTE *)&zero, reader->context);