amstream: Add IAMMediaStream interface to AudioMediaStream object.

This commit is contained in:
Christian Costa 2012-09-23 20:43:48 +02:00 committed by Alexandre Julliard
parent 6b73c61c63
commit e8c256b185
2 changed files with 202 additions and 5 deletions

View File

@ -455,6 +455,7 @@ HRESULT ddrawmediastream_create(IMultiMediaStream *parent, const MSPID *purpose_
} }
typedef struct { typedef struct {
IAMMediaStream IAMMediaStream_iface;
IAudioMediaStream IAudioMediaStream_iface; IAudioMediaStream IAudioMediaStream_iface;
LONG ref; LONG ref;
IMultiMediaStream* parent; IMultiMediaStream* parent;
@ -462,6 +463,194 @@ typedef struct {
STREAM_TYPE stream_type; STREAM_TYPE stream_type;
} AudioMediaStreamImpl; } AudioMediaStreamImpl;
static inline AudioMediaStreamImpl *impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream *iface)
{
return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAMMediaStream_iface);
}
/*** IUnknown methods ***/
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
REFIID riid, void **ret_iface)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IMediaStream) ||
IsEqualGUID(riid, &IID_IAMMediaStream))
{
IAMMediaStream_AddRef(iface);
*ret_iface = iface;
return S_OK;
}
else if (IsEqualGUID(riid, &IID_IAudioMediaStream))
{
IAMMediaStream_AddRef(iface);
*ret_iface = &This->IAudioMediaStream_iface;
return S_OK;
}
ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
return E_NOINTERFACE;
}
static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
return ref;
}
static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
if (!ref)
HeapFree(GetProcessHeap(), 0, This);
return ref;
}
/*** IMediaStream methods ***/
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
IMultiMediaStream** multi_media_stream)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p) stub!\n", This, iface, multi_media_stream);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
MSPID *purpose_id, STREAM_TYPE *type)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
if (purpose_id)
*purpose_id = This->purpose_id;
if (type)
*type = This->stream_type;
return S_OK;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
DWORD flags, IStreamSample **sample)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
return S_FALSE;
}
/*** IAMMediaStream methods ***/
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
REFMSPID purpose_id, const STREAM_TYPE stream_type)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
return S_FALSE;
}
static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
{
AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
return S_FALSE;
}
static const struct IAMMediaStreamVtbl AudioMediaStreamImpl_IAMMediaStream_Vtbl =
{
/*** IUnknown methods ***/
AudioMediaStreamImpl_IAMMediaStream_QueryInterface,
AudioMediaStreamImpl_IAMMediaStream_AddRef,
AudioMediaStreamImpl_IAMMediaStream_Release,
/*** IMediaStream methods ***/
AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
AudioMediaStreamImpl_IAMMediaStream_GetInformation,
AudioMediaStreamImpl_IAMMediaStream_SetSameFormat,
AudioMediaStreamImpl_IAMMediaStream_AllocateSample,
AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample,
AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream,
/*** IAMMediaStream methods ***/
AudioMediaStreamImpl_IAMMediaStream_Initialize,
AudioMediaStreamImpl_IAMMediaStream_SetState,
AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
AudioMediaStreamImpl_IAMMediaStream_JoinFilter,
AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph
};
static inline AudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface) static inline AudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
{ {
return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAudioMediaStream_iface); return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAudioMediaStream_iface);
@ -483,6 +672,13 @@ static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_QueryInterface(IAud
*ret_iface = iface; *ret_iface = iface;
return S_OK; return S_OK;
} }
else if (IsEqualGUID(riid, &IID_IAMMediaStream))
{
IAudioMediaStream_AddRef(iface);
*ret_iface = &This->IAMMediaStream_iface;
return S_OK;
}
*ret_iface = NULL; *ret_iface = NULL;
@ -615,7 +811,7 @@ static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSample(IAudio
return audiostreamsample_create(iface, audio_data, sample); return audiostreamsample_create(iface, audio_data, sample);
} }
static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_AudioMediaStream_Vtbl = static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream_Vtbl =
{ {
/*** IUnknown methods ***/ /*** IUnknown methods ***/
AudioMediaStreamImpl_IAudioMediaStream_QueryInterface, AudioMediaStreamImpl_IAudioMediaStream_QueryInterface,
@ -648,14 +844,15 @@ HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_AudioMediaStream_Vtbl; object->IAMMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAMMediaStream_Vtbl;
object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAudioMediaStream_Vtbl;
object->ref = 1; object->ref = 1;
object->parent = parent; object->parent = parent;
object->purpose_id = *purpose_id; object->purpose_id = *purpose_id;
object->stream_type = stream_type; object->stream_type = stream_type;
*media_stream = (IMediaStream*)&object->IAudioMediaStream_iface; *media_stream = (IMediaStream*)&object->IAMMediaStream_iface;
return S_OK; return S_OK;
} }

View File

@ -326,8 +326,8 @@ static void test_media_streams(void)
IAudioStreamSample *audio_sample = NULL; IAudioStreamSample *audio_sample = NULL;
hr = IMediaStream_QueryInterface(audio_stream, &IID_IAMMediaStream, (LPVOID*)&am_media_stream); hr = IMediaStream_QueryInterface(audio_stream, &IID_IAMMediaStream, (LPVOID*)&am_media_stream);
todo_wine ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr);
todo_wine ok((void*)am_media_stream == (void*)audio_stream, "Not same interface, got %p expected %p\n", am_media_stream, video_stream); ok((void*)am_media_stream == (void*)audio_stream, "Not same interface, got %p expected %p\n", am_media_stream, audio_stream);
if (hr == S_OK) if (hr == S_OK)
IAMMediaStream_Release(am_media_stream); IAMMediaStream_Release(am_media_stream);