From: R��mi Bernon <rbernon(a)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; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/803