Rémi Bernon : qasf: Start/stop the WM reader in asf_reader_init/cleanup_stream.
Alexandre Julliard
julliard at winehq.org
Sat Aug 13 14:20:31 CDT 2022
Module: wine
Branch: master
Commit: 8d369f42d7106a8623bbb446c7db9639b7027d23
URL: https://gitlab.winehq.org/wine/wine/-/commit/8d369f42d7106a8623bbb446c7db9639b7027d23
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Fri Aug 5 08:55:35 2022 +0200
qasf: Start/stop the WM reader in asf_reader_init/cleanup_stream.
---
dlls/qasf/asfreader.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/dlls/qasf/asfreader.c b/dlls/qasf/asfreader.c
index 935619bea4f..e127c91a92d 100644
--- a/dlls/qasf/asfreader.c
+++ b/dlls/qasf/asfreader.c
@@ -217,8 +217,30 @@ static HRESULT asf_reader_init_stream(struct strmbase_filter *iface)
WARN("Failed to commit stream %u allocator, hr %#lx\n", i, hr);
break;
}
+
+ if (FAILED(hr = IPin_NewSegment(stream->source.pin.peer, 0, 0, 1)))
+ {
+ WARN("Failed to start stream %u new segment, hr %#lx\n", i, hr);
+ break;
+ }
}
+ if (FAILED(hr))
+ return hr;
+
+ EnterCriticalSection(&filter->status_cs);
+ if (SUCCEEDED(hr = IWMReader_Start(filter->reader, 0, 0, 1, NULL)))
+ {
+ filter->status = -1;
+ while (filter->status != WMT_STARTED)
+ SleepConditionVariableCS(&filter->status_cv, &filter->status_cs, INFINITE);
+ hr = filter->result;
+ }
+ LeaveCriticalSection(&filter->status_cs);
+
+ if (FAILED(hr))
+ WARN("Failed to start WMReader %p, hr %#lx\n", filter->reader, hr);
+
return hr;
}
@@ -230,6 +252,19 @@ static HRESULT asf_reader_cleanup_stream(struct strmbase_filter *iface)
TRACE("iface %p\n", iface);
+ EnterCriticalSection(&filter->status_cs);
+ if (SUCCEEDED(hr = IWMReader_Stop(filter->reader)))
+ {
+ filter->status = -1;
+ while (filter->status != WMT_STOPPED)
+ SleepConditionVariableCS(&filter->status_cv, &filter->status_cs, INFINITE);
+ hr = filter->result;
+ }
+ LeaveCriticalSection(&filter->status_cs);
+
+ if (FAILED(hr))
+ WARN("Failed to stop WMReader %p, hr %#lx\n", filter->reader, hr);
+
for (i = 0; i < filter->stream_count; ++i)
{
struct asf_stream *stream = filter->streams + i;
@@ -506,6 +541,34 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA
WakeConditionVariable(&filter->status_cv);
break;
+ case WMT_END_OF_STREAMING:
+ for (i = 0; i < filter->stream_count; ++i)
+ {
+ struct asf_stream *stream = filter->streams + i;
+
+ if (!stream->source.pin.peer)
+ continue;
+
+ IPin_EndOfStream(stream->source.pin.peer);
+ }
+ break;
+
+ case WMT_STARTED:
+ EnterCriticalSection(&filter->status_cs);
+ filter->result = result;
+ filter->status = WMT_STARTED;
+ LeaveCriticalSection(&filter->status_cs);
+ WakeConditionVariable(&filter->status_cv);
+ break;
+
+ case WMT_STOPPED:
+ EnterCriticalSection(&filter->status_cs);
+ filter->result = result;
+ filter->status = WMT_STOPPED;
+ LeaveCriticalSection(&filter->status_cs);
+ WakeConditionVariable(&filter->status_cv);
+ break;
+
default:
WARN("Ignoring status %#x.\n", status);
break;
More information about the wine-cvs
mailing list