From: R��mi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_asyncreader.c | 67 ++++++++++++++++------------- 1 file changed, 37 insertions(+), 30 deletions(-)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 6fb37264e3d..6a310c35b79 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -78,6 +78,41 @@ static REFERENCE_TIME async_reader_get_time(const struct async_reader *reader, b return (time.QuadPart * 1000) / reader->clock_frequency.QuadPart * 10000 - (absolute ? 0 : reader->clock_start); }
+static bool async_reader_needs_wait(struct async_reader *reader, QWORD pts, DWORD *timeout) +{ + if (!reader->user_clock) + { + REFERENCE_TIME current_time = async_reader_get_time(reader, false); + *timeout = (pts - current_time) / 10000; + return pts > current_time; + } + + *timeout = INFINITE; + return pts > reader->user_time; +} + +static bool async_reader_wait_pts(struct async_reader *reader, QWORD pts) +{ + IWMReaderCallbackAdvanced *callback_advanced = reader->callback_advanced; + DWORD timeout; + bool ret; + + TRACE("reader %p, pts %I64d.\n", reader, pts); + + if (callback_advanced && reader->user_clock && pts > reader->user_time) + { + QWORD user_time = reader->user_time; + LeaveCriticalSection(&reader->callback_cs); + IWMReaderCallbackAdvanced_OnTime(callback_advanced, user_time, reader->context); + EnterCriticalSection(&reader->callback_cs); + } + + while ((ret = reader->running && list_empty(&reader->async_ops)) && async_reader_needs_wait(reader, pts, &timeout)) + SleepConditionVariableCS(&reader->callback_cv, &reader->callback_cs, timeout); + + return ret; +} + static void callback_thread_run(struct async_reader *reader) { IWMReaderCallbackAdvanced *callback_advanced = reader->callback_advanced; @@ -98,38 +133,10 @@ static void callback_thread_run(struct async_reader *reader) if (hr != S_OK) break;
- stream = wm_reader_get_stream_by_stream_number(&reader->reader, stream_number); - - if (reader->user_clock) + if (async_reader_wait_pts(reader, pts)) { - QWORD user_time = reader->user_time; + stream = wm_reader_get_stream_by_stream_number(&reader->reader, stream_number);
- if (pts > user_time && callback_advanced) - { - LeaveCriticalSection(&reader->callback_cs); - IWMReaderCallbackAdvanced_OnTime(callback_advanced, user_time, reader->context); - EnterCriticalSection(&reader->callback_cs); - } - - while (pts > reader->user_time && reader->running && list_empty(&reader->async_ops)) - SleepConditionVariableCS(&reader->callback_cv, &reader->callback_cs, INFINITE); - } - else - { - while (reader->running && list_empty(&reader->async_ops)) - { - REFERENCE_TIME current_time = async_reader_get_time(reader, false); - - if (pts <= current_time) - break; - - SleepConditionVariableCS(&reader->callback_cv, &reader->callback_cs, - (pts - current_time) / 10000); - } - } - - if (reader->running && list_empty(&reader->async_ops)) - { LeaveCriticalSection(&reader->callback_cs); if (stream->read_compressed) hr = IWMReaderCallbackAdvanced_OnStreamSample(callback_advanced,