Module: wine Branch: master Commit: 67b7d597c92798a9719ee0fe10d6bde5bf116536 URL: https://source.winehq.org/git/wine.git/?a=commit;h=67b7d597c92798a9719ee0fe1...
Author: Gijs Vermeulen gijsvrm@gmail.com Date: Wed Jul 29 12:30:35 2020 +0200
amstream: Implement IAudioStreamSample::GetMediaStream().
Signed-off-by: Gijs Vermeulen gijsvrm@gmail.com Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/amstream/audiostream.c | 12 ++++++++-- dlls/amstream/tests/amstream.c | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/dlls/amstream/audiostream.c b/dlls/amstream/audiostream.c index 85613f4f0e..0761050a65 100644 --- a/dlls/amstream/audiostream.c +++ b/dlls/amstream/audiostream.c @@ -213,9 +213,17 @@ static ULONG WINAPI IAudioStreamSampleImpl_Release(IAudioStreamSample *iface) /*** IStreamSample methods ***/ static HRESULT WINAPI IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample *iface, IMediaStream **media_stream) { - FIXME("(%p)->(%p): stub\n", iface, media_stream); + IAudioStreamSampleImpl *sample = impl_from_IAudioStreamSample(iface);
- return E_NOTIMPL; + TRACE("sample %p, media_stream %p.\n", iface, media_stream); + + if (!media_stream) + return E_POINTER; + + IAMMediaStream_AddRef(&sample->parent->IAMMediaStream_iface); + *media_stream = (IMediaStream *)&sample->parent->IAMMediaStream_iface; + + return S_OK; }
static HRESULT WINAPI IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample *iface, STREAM_TIME *start_time, diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 6631fd312a..d1c3992585 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -5629,6 +5629,57 @@ static void test_ddrawstream_getsetdirectdraw(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static void test_audiostreamsample_get_media_stream(void) +{ + IAMMultiMediaStream *mmstream = create_ammultimediastream(); + IAudioStreamSample *audio_sample; + IAudioMediaStream *audio_stream; + IMediaStream *stream, *stream2; + IAudioData *audio_data; + HRESULT hr; + ULONG ref; + + hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryAudio, 0, &stream); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMediaStream_QueryInterface(stream, &IID_IAudioMediaStream, (void **)&audio_stream); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = CoCreateInstance(&CLSID_AMAudioData, NULL, CLSCTX_INPROC_SERVER, &IID_IAudioData, (void **)&audio_data); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IAudioMediaStream_CreateSample(audio_stream, audio_data, 0, &audio_sample); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + /* Crashes on native. */ + if (0) + { + hr = IAudioStreamSample_GetMediaStream(audio_sample, NULL); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + } + + EXPECT_REF(stream, 4); + hr = IAudioStreamSample_GetMediaStream(audio_sample, &stream2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(stream2 == stream, "Expected stream %p, got %p.\n", stream, stream2); + EXPECT_REF(stream, 5); + + IMediaStream_Release(stream2); + + IAudioMediaStream_Release(audio_stream); + ref = IAudioStreamSample_Release(audio_sample); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IAudioData_Release(audio_data); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IAMMultiMediaStream_Release(mmstream); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IMediaStream_Release(stream); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(amstream) { const WCHAR *test_avi_path; @@ -5675,6 +5726,7 @@ START_TEST(amstream) test_audiostreamsample_update(); test_audiostreamsample_completion_status(); test_audiostreamsample_get_sample_times(); + test_audiostreamsample_get_media_stream();
test_ddrawstream_initialize(); test_ddrawstream_getsetdirectdraw();