From: R��mi Bernon rbernon@codeweavers.com
--- dlls/qasf/asfreader.c | 65 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-)
diff --git a/dlls/qasf/asfreader.c b/dlls/qasf/asfreader.c index 86f3c42454d..cbb63e4a226 100644 --- a/dlls/qasf/asfreader.c +++ b/dlls/qasf/asfreader.c @@ -227,18 +227,41 @@ static HRESULT asf_reader_init_stream(struct strmbase_filter *iface) WARN("Failed to commit stream %u allocator, hr %#lx\n", i, hr); return hr; } + + hr = IPin_NewSegment(stream->source.pin.peer, 0, 0, 1); + if (FAILED(hr)) + { + WARN("Failed to start stream %u new segment, hr %#lx\n", i, hr); + return hr; + } }
- return S_OK; + filter->status = -1; + if (FAILED(hr = IWMReader_Start(filter->reader, 0, 0, 1, NULL))) + { + WARN("Failed to start WMReader %p, hr %#lx\n", filter->reader, hr); + filter->status = WMT_ERROR; + } + + return hr; }
static HRESULT asf_reader_cleanup_stream(struct strmbase_filter *iface) { struct asf_reader *filter = impl_from_strmbase_filter(iface); + HRESULT hr; int i;
TRACE("iface %p\n", iface);
+ filter->status = -1; + if (FAILED(hr = IWMReader_Stop(filter->reader))) + { + WARN("Failed to stop WMReader %p, hr %#lx\n", filter->reader, hr); + filter->status = WMT_ERROR; + return hr; + } + for (i = 0; i < filter->stream_count; ++i) { struct asf_stream *stream = filter->streams + i; @@ -512,6 +535,46 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA LeaveCriticalSection(&filter->filter.filter_cs); break;
+ case WMT_END_OF_STREAMING: + EnterCriticalSection(&filter->filter.filter_cs); + 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); + } + LeaveCriticalSection(&filter->filter.filter_cs); + break; + + case WMT_STARTED: + if (FAILED(hr)) + { + ERR("Failed to start WMReader, hr %#lx.\n", hr); + break; + } + + EnterCriticalSection(&filter->filter.filter_cs); + filter->status = WMT_STARTED; + LeaveCriticalSection(&filter->filter.filter_cs); + WakeConditionVariable(&filter->status_cv); + break; + + case WMT_STOPPED: + if (FAILED(hr)) + { + ERR("Failed to stop WMReader, hr %#lx.\n", hr); + break; + } + + EnterCriticalSection(&filter->filter.filter_cs); + filter->status = WMT_STOPPED; + LeaveCriticalSection(&filter->filter.filter_cs); + WakeConditionVariable(&filter->status_cv); + break; + default: WARN("Ignoring status %#x.\n", status); break;