[PATCH 05/10] amstream: Add stub IPin and IMemInputPin to AMAudioStream.

Anton Baskanov baskanov at gmail.com
Fri Feb 16 10:43:38 CST 2018


Signed-off-by: Anton Baskanov <baskanov at gmail.com>
---
 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




More information about the wine-devel mailing list