From: Shaun Ren sren@codeweavers.com
--- dlls/sapi/stream.c | 22 ++++++++++++++++++---- dlls/sapi/tests/stream.c | 12 ++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/dlls/sapi/stream.c b/dlls/sapi/stream.c index ae0e8c048c9..f0b4e2cd595 100644 --- a/dlls/sapi/stream.c +++ b/dlls/sapi/stream.c @@ -43,6 +43,7 @@ struct spstream IStream *base_stream; GUID format; WAVEFORMATEX *wfx; + BOOL closed; };
static inline struct spstream *impl_from_ISpStream(ISpStream *iface) @@ -198,7 +199,7 @@ static HRESULT WINAPI spstream_SetBaseStream(ISpStream *iface, IStream *stream, if (!stream || !format) return E_INVALIDARG;
- if (This->base_stream) + if (This->base_stream || This->closed) return SPERR_ALREADY_INITIALIZED;
This->format = *format; @@ -225,7 +226,9 @@ static HRESULT WINAPI spstream_GetBaseStream(ISpStream *iface, IStream **stream) if (!stream) return E_INVALIDARG;
- if (!This->base_stream) + if (This->closed) + return SPERR_STREAM_CLOSED; + else if (!This->base_stream) return SPERR_UNINITIALIZED;
*stream = This->base_stream; @@ -246,9 +249,19 @@ static HRESULT WINAPI spstream_BindToFile(ISpStream *iface, LPCWSTR filename, SP
static HRESULT WINAPI spstream_Close(ISpStream *iface) { - FIXME("(%p): stub.\n", iface); + struct spstream *This = impl_from_ISpStream(iface);
- return E_NOTIMPL; + TRACE("(%p).\n", iface); + + if (This->closed) + return SPERR_STREAM_CLOSED; + else if (!This->base_stream) + return SPERR_UNINITIALIZED; + + IStream_Release(This->base_stream); + This->base_stream = NULL; + This->closed = TRUE; + return S_OK; }
const static ISpStreamVtbl spstream_vtbl = @@ -286,6 +299,7 @@ HRESULT speech_stream_create(IUnknown *outer, REFIID iid, void **obj) This->base_stream = NULL; This->format = GUID_NULL; This->wfx = NULL; + This->closed = FALSE;
hr = ISpStream_QueryInterface(&This->ISpStream_iface, iid, obj);
diff --git a/dlls/sapi/tests/stream.c b/dlls/sapi/tests/stream.c index 1cdff241e0b..e07bbdb50c6 100644 --- a/dlls/sapi/tests/stream.c +++ b/dlls/sapi/tests/stream.c @@ -141,6 +141,18 @@ static void test_spstream(void) ok(hr == S_OK, "got %#lx.\n", hr); ok(base_stream2 == base_stream, "got %p.\n", base_stream2);
+ hr = ISpStream_Close(stream); + ok(hr == S_OK, "got %#lx.\n", hr); + + hr = ISpStream_SetBaseStream(stream, base_stream, &fmtid, wfx); + ok(hr == SPERR_ALREADY_INITIALIZED, "got %#lx.\n", hr); + + hr = ISpStream_GetBaseStream(stream, &base_stream2); + ok(hr == SPERR_STREAM_CLOSED, "got %#lx.\n", hr); + + hr = ISpStream_Close(stream); + ok(hr == SPERR_STREAM_CLOSED, "got %#lx.\n", hr); + ISpStream_Release(stream); IStream_Release(base_stream); ISpMMSysAudio_Release(mmaudio);