From: R��mi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_asyncreader.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index a14beb37951..fa56eac737e 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -22,6 +22,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
+struct async_start_info +{ + QWORD start; + QWORD duration; + void *context; +}; + struct async_op { enum async_op_type @@ -196,7 +203,13 @@ static DWORD WINAPI async_reader_callback_thread(void *arg) { case ASYNC_OP_START: { - reader->context = op->data; + struct async_start_info *info = op->data; + + reader->context = info->context; + if (SUCCEEDED(hr)) + wm_reader_seek(&reader->reader, info->start, info->duration); + free(info); + LeaveCriticalSection(&reader->callback_cs); IWMReaderCallback_OnStatus(reader->callback, WMT_STARTED, hr, WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); @@ -432,6 +445,7 @@ static HRESULT WINAPI WMReader_Start(IWMReader *iface, QWORD start, QWORD duration, float rate, void *context) { struct async_reader *reader = impl_from_IWMReader(iface); + struct async_start_info *info; HRESULT hr;
TRACE("reader %p, start %s, duration %s, rate %.8e, context %p.\n", @@ -440,18 +454,23 @@ static HRESULT WINAPI WMReader_Start(IWMReader *iface, if (rate != 1.0f) FIXME("Ignoring rate %.8e.\n", rate);
+ if (!(info = calloc(1, sizeof(*info)))) + return E_OUTOFMEMORY; + info->start = start; + info->duration = duration; + info->context = context; + EnterCriticalSection(&reader->reader.cs);
if (!reader->callback_thread) hr = NS_E_INVALID_REQUEST; else - { - wm_reader_seek(&reader->reader, start, duration); - hr = async_reader_queue_op(reader, ASYNC_OP_START, context); - } + hr = async_reader_queue_op(reader, ASYNC_OP_START, info);
LeaveCriticalSection(&reader->reader.cs);
+ if (FAILED(hr)) + free(info); return hr; }