From: Anton Baskanov Subject: [PATCH 05/10] amstream: Add stub IPin and IMemInputPin to AMAudioStream. Message-Id: <20180216164343.26917-5-baskanov@gmail.com> Date: Fri, 16 Feb 2018 23:43:38 +0700 Signed-off-by: Anton Baskanov --- dlls/amstream/mediastream.c | 138 +++++++++++++++++++++++++++++++++++++++++ dlls/amstream/tests/amstream.c | 6 ++ 2 files changed, 144 insertions(+) diff --git a/dlls/amstream/mediastream.c b/dlls/amstream/mediastream.c index 028434124a..e308f0f51b 100644 --- a/dlls/amstream/mediastream.c +++ b/dlls/amstream/mediastream.c @@ -644,13 +644,22 @@ out_object: return hr; } +struct AudioMediaStreamImpl; + typedef struct { + BaseInputPin pin; + struct AudioMediaStreamImpl *parent; +} AudioMediaStreamInputPin; + +typedef struct AudioMediaStreamImpl { IAMMediaStream IAMMediaStream_iface; IAudioMediaStream IAudioMediaStream_iface; LONG ref; IMultiMediaStream* parent; MSPID purpose_id; STREAM_TYPE stream_type; + AudioMediaStreamInputPin *input_pin; + CRITICAL_SECTION critical_section; } AudioMediaStreamImpl; static inline AudioMediaStreamImpl *impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream *iface) @@ -680,6 +689,18 @@ static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMedi *ret_iface = &This->IAudioMediaStream_iface; return S_OK; } + else if (IsEqualGUID(riid, &IID_IPin)) + { + IAMMediaStream_AddRef(iface); + *ret_iface = &This->input_pin->pin.pin.IPin_iface; + return S_OK; + } + else if (IsEqualGUID(riid, &IID_IMemInputPin)) + { + IAMMediaStream_AddRef(iface); + *ret_iface = &This->input_pin->pin.IMemInputPin_iface; + return S_OK; + } ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface); return E_NOINTERFACE; @@ -703,7 +724,11 @@ static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream * TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref); if (!ref) + { + BaseInputPin_Destroy((BaseInputPin *)This->input_pin); + DeleteCriticalSection(&This->critical_section); HeapFree(GetProcessHeap(), 0, This); + } return ref; } @@ -1002,10 +1027,104 @@ static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream AudioMediaStreamImpl_IAudioMediaStream_CreateSample }; +static inline AudioMediaStreamInputPin *impl_from_AudioMediaStreamInputPin_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, AudioMediaStreamInputPin, pin.pin.IPin_iface); +} + +/*** IUnknown methods ***/ +static HRESULT WINAPI AudioMediaStreamInputPin_IPin_QueryInterface(IPin *iface, REFIID riid, void **ret_iface) +{ + AudioMediaStreamInputPin *This = impl_from_AudioMediaStreamInputPin_IPin(iface); + + return IAMMediaStream_QueryInterface(&This->parent->IAMMediaStream_iface, riid, ret_iface); +} + +static ULONG WINAPI AudioMediaStreamInputPin_IPin_AddRef(IPin *iface) +{ + AudioMediaStreamInputPin *This = impl_from_AudioMediaStreamInputPin_IPin(iface); + + return IAMMediaStream_AddRef(&This->parent->IAMMediaStream_iface); +} + +static ULONG WINAPI AudioMediaStreamInputPin_IPin_Release(IPin *iface) +{ + AudioMediaStreamInputPin *This = impl_from_AudioMediaStreamInputPin_IPin(iface); + + return IAMMediaStream_Release(&This->parent->IAMMediaStream_iface); +} + +static const IPinVtbl AudioMediaStreamInputPin_IPin_Vtbl = +{ + AudioMediaStreamInputPin_IPin_QueryInterface, + AudioMediaStreamInputPin_IPin_AddRef, + AudioMediaStreamInputPin_IPin_Release, + BaseInputPinImpl_Connect, + BaseInputPinImpl_ReceiveConnection, + BasePinImpl_Disconnect, + BasePinImpl_ConnectedTo, + BasePinImpl_ConnectionMediaType, + BasePinImpl_QueryPinInfo, + BasePinImpl_QueryDirection, + BasePinImpl_QueryId, + BaseInputPinImpl_QueryAccept, + BasePinImpl_EnumMediaTypes, + BasePinImpl_QueryInternalConnections, + BaseInputPinImpl_EndOfStream, + BaseInputPinImpl_BeginFlush, + BaseInputPinImpl_EndFlush, + BaseInputPinImpl_NewSegment, +}; + +static HRESULT WINAPI AudioMediaStreamInputPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *media_type) +{ + AudioMediaStreamInputPin *This = impl_from_AudioMediaStreamInputPin_IPin(&base->IPin_iface); + + FIXME("(%p)->(%p) stub!\n", This, media_type); + + return E_NOTIMPL; +} + +static LONG WINAPI AudioMediaStreamInputPin_GetMediaTypeVersion(BasePin *base) +{ + return 0; +} + +static HRESULT WINAPI AudioMediaStreamInputPin_GetMediaType(BasePin *base, int index, AM_MEDIA_TYPE *media_type) +{ + AudioMediaStreamInputPin *This = impl_from_AudioMediaStreamInputPin_IPin(&base->IPin_iface); + + FIXME("(%p)->(%d,%p) stub!\n", This, index, media_type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AudioMediaStreamInputPin_Receive(BaseInputPin *base, IMediaSample *sample) +{ + AudioMediaStreamInputPin *This = impl_from_AudioMediaStreamInputPin_IPin(&base->pin.IPin_iface); + + FIXME("(%p)->(%p) stub!\n", This, sample); + + return E_NOTIMPL; +} + +static const BaseInputPinFuncTable AudioMediaStreamInputPin_FuncTable = +{ + { + AudioMediaStreamInputPin_CheckMediaType, + NULL, + AudioMediaStreamInputPin_GetMediaTypeVersion, + AudioMediaStreamInputPin_GetMediaType, + }, + AudioMediaStreamInputPin_Receive, +}; + HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id, STREAM_TYPE stream_type, IAMMediaStream **media_stream) { AudioMediaStreamImpl *object; + PIN_INFO pin_info; + HRESULT hr; TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream); @@ -1017,6 +1136,20 @@ HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_ object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAudioMediaStream_Vtbl; object->ref = 1; + InitializeCriticalSection(&object->critical_section); + + pin_info.pFilter = NULL; + pin_info.dir = PINDIR_INPUT; + pin_info.achName[0] = 'I'; + StringFromGUID2(purpose_id, pin_info.achName + 1, MAX_PIN_NAME - 1); + hr = BaseInputPin_Construct(&AudioMediaStreamInputPin_IPin_Vtbl, + sizeof(AudioMediaStreamInputPin), &pin_info, &AudioMediaStreamInputPin_FuncTable, + &object->critical_section, NULL, (IPin **)&object->input_pin); + if (FAILED(hr)) + goto out_object; + + object->input_pin->parent = object; + object->parent = parent; object->purpose_id = *purpose_id; object->stream_type = stream_type; @@ -1024,6 +1157,11 @@ HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_ *media_stream = &object->IAMMediaStream_iface; return S_OK; + +out_object: + HeapFree(GetProcessHeap(), 0, object); + + return hr; } typedef struct { diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index fba83c10e8..05957df425 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -374,6 +374,7 @@ static void test_media_streams(void) { IAMMediaStream* am_media_stream; IMultiMediaStream *multi_media_stream; + IPin *pin = NULL; IDirectDrawMediaStream* ddraw_stream = NULL; IAudioMediaStream* audio_media_stream = NULL; IAudioStreamSample *audio_sample = NULL; @@ -393,6 +394,11 @@ static void test_media_streams(void) IAMMediaStream_Release(am_media_stream); + hr = IMediaStream_QueryInterface(audio_stream, &IID_IPin, (void **)&pin); + ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); + + IPin_Release(pin); + hr = IMediaStream_QueryInterface(audio_stream, &IID_IDirectDrawMediaStream, (LPVOID*)&ddraw_stream); ok(hr == E_NOINTERFACE, "IMediaStream_QueryInterface returned: %x\n", hr); -- 2.14.1