Module: wine Branch: master Commit: 0f8553b5d4411b324f8116547d1202620f618531 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f8553b5d4411b324f8116547d...
Author: Christian Costa titan.costa@gmail.com Date: Tue Apr 3 17:51:07 2012 +0200
amstream: Add CLSID_AMAudioData implementation.
---
dlls/amstream/Makefile.in | 1 + dlls/amstream/amstream_classes.idl | 7 ++ dlls/amstream/amstream_private.h | 2 + dlls/amstream/audiodata.c | 157 ++++++++++++++++++++++++++++++++++++ dlls/amstream/main.c | 1 + dlls/amstream/tests/amstream.c | 2 +- 6 files changed, 169 insertions(+), 1 deletions(-)
diff --git a/dlls/amstream/Makefile.in b/dlls/amstream/Makefile.in index 3353a38..35cfae1 100644 --- a/dlls/amstream/Makefile.in +++ b/dlls/amstream/Makefile.in @@ -3,6 +3,7 @@ IMPORTS = strmiids strmbase uuid ole32 advapi32
C_SRCS = \ amstream.c \ + audiodata.c \ main.c \ mediastream.c \ mediastreamfilter.c diff --git a/dlls/amstream/amstream_classes.idl b/dlls/amstream/amstream_classes.idl index 701275d..064ce00 100644 --- a/dlls/amstream/amstream_classes.idl +++ b/dlls/amstream/amstream_classes.idl @@ -38,3 +38,10 @@ coclass AMDirectDrawStream { interface IAMMultiMediaStream; } uuid(49c47ce5-9ba4-11d0-8212-00c04fc32c45) ] coclass AMMultiMediaStream { interface IAMMultiMediaStream; } + +[ + helpstring("AuStream Class"), + threading(both), + uuid(f2468580-af8a-11d0-8212-00c04fc32c45) +] +coclass AMAudioData { interface IAudioData; } diff --git a/dlls/amstream/amstream_private.h b/dlls/amstream/amstream_private.h index 69fd23f..e40c409 100644 --- a/dlls/amstream/amstream_private.h +++ b/dlls/amstream/amstream_private.h @@ -30,8 +30,10 @@ #include "winuser.h" #include "dshow.h" #include "mmstream.h" +#include "austream.h"
HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; +HRESULT AMAudioData_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; HRESULT mediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId, STREAM_TYPE StreamType, IMediaStream **ppMediaStream) DECLSPEC_HIDDEN; diff --git a/dlls/amstream/audiodata.c b/dlls/amstream/audiodata.c new file mode 100644 index 0000000..7d3c38a --- /dev/null +++ b/dlls/amstream/audiodata.c @@ -0,0 +1,157 @@ +/* + * Implementation of IAudioData Interface + * + * Copyright 2012 Christian Costa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/debug.h" + +#define COBJMACROS + +#include "winbase.h" +#include "amstream_private.h" + +#include "amstream.h" + +WINE_DEFAULT_DEBUG_CHANNEL(amstream); + +typedef struct { + IAudioData IAudioData_iface; + LONG ref; +} AMAudioDataImpl; + +static inline AMAudioDataImpl *impl_from_IAudioData(IAudioData *iface) +{ + return CONTAINING_RECORD(iface, AMAudioDataImpl, IAudioData_iface); +} + +/*** IUnknown methods ***/ +static HRESULT WINAPI IAudioDataImpl_QueryInterface(IAudioData *iface, REFIID riid, void **ret_iface) +{ + TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface); + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IMemoryData) || + IsEqualGUID(riid, &IID_IAudioData)) + { + IUnknown_AddRef(iface); + *ret_iface = iface; + return S_OK; + } + + ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface); + return E_NOINTERFACE; +} + +static ULONG WINAPI IAudioDataImpl_AddRef(IAudioData* iface) +{ + AMAudioDataImpl *This = impl_from_IAudioData(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(): new ref = %u\n", iface, This->ref); + + return ref; +} + +static ULONG WINAPI IAudioDataImpl_Release(IAudioData* iface) +{ + AMAudioDataImpl *This = impl_from_IAudioData(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(): new ref = %u\n", iface, This->ref); + + if (!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +/*** IMemoryData methods ***/ +static HRESULT WINAPI IAudioDataImpl_SetBuffer(IAudioData* iface, DWORD size, BYTE *data, DWORD flags) +{ + FIXME("(%p)->(%u,%p,%x): stub\n", iface, size, data, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAudioDataImpl_GetInfo(IAudioData* iface, DWORD *length, BYTE **data, DWORD *actual_data) +{ + FIXME("(%p)->(%p,%p,%p): stub\n", iface, length, data, actual_data); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAudioDataImpl_SetActual(IAudioData* iface, DWORD data_valid) +{ + FIXME("(%p)->(%u): stub\n", iface, data_valid); + + return E_NOTIMPL; +} + +/*** IAudioData methods ***/ +static HRESULT WINAPI IAudioDataImpl_GetFormat(IAudioData* iface, WAVEFORMATEX *wave_format_current) +{ + FIXME("(%p)->(%p): stub\n", iface, wave_format_current); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAudioDataImpl_SetFormat(IAudioData* iface, const WAVEFORMATEX *wave_format) +{ + FIXME("(%p)->(%p): stub\n", iface, wave_format); + + return E_NOTIMPL; +} + +static const struct IAudioDataVtbl AudioData_Vtbl = +{ + /*** IUnknown methods ***/ + IAudioDataImpl_QueryInterface, + IAudioDataImpl_AddRef, + IAudioDataImpl_Release, + /*** IMemoryData methods ***/ + IAudioDataImpl_SetBuffer, + IAudioDataImpl_GetInfo, + IAudioDataImpl_SetActual, + /*** IAudioData methods ***/ + IAudioDataImpl_GetFormat, + IAudioDataImpl_SetFormat +}; + +HRESULT AMAudioData_create(IUnknown *pUnkOuter, LPVOID *ppObj) +{ + AMAudioDataImpl *object; + + TRACE("(%p,%p)\n", pUnkOuter, ppObj); + + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AMAudioDataImpl)); + if (!object) + { + ERR("Out of memory\n"); + return E_OUTOFMEMORY; + } + + object->IAudioData_iface.lpVtbl = &AudioData_Vtbl; + object->ref = 1; + + *ppObj = &object->IAudioData_iface; + + return S_OK; +} diff --git a/dlls/amstream/main.c b/dlls/amstream/main.c index 9f23974..79142e5 100644 --- a/dlls/amstream/main.c +++ b/dlls/amstream/main.c @@ -75,6 +75,7 @@ static const struct object_creation_info object_creation[] = { { &CLSID_AMMultiMediaStream, AM_create }, { &CLSID_AMDirectDrawStream, AM_create }, + { &CLSID_AMAudioData, AMAudioData_create }, { &CLSID_MediaStreamFilter, MediaStreamFilter_create } };
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 39add30..87bbcc7 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -334,7 +334,7 @@ static void test_media_streams(void) { IAudioData* audio_data = NULL; hr = CoCreateInstance(&CLSID_AMAudioData, NULL, CLSCTX_INPROC_SERVER, &IID_IAudioData, (void **)&audio_data); - todo_wine ok(hr == S_OK, "CoCreateInstance returned: %x\n", hr); + ok(hr == S_OK, "CoCreateInstance returned: %x\n", hr);
hr = IAudioMediaStream_CreateSample(audio_media_stream, NULL, 0, &audio_sample); todo_wine ok(hr == E_POINTER, "IAudioMediaStream_CreateSample returned: %x\n", hr);