From 834a92cc8be784453e37958e2608ef91480db196 Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Wed, 10 Jun 2015 01:04:56 +0200 Subject: [PATCH] dswave: Use the generic DirectMusicObject implementation for DSWave. --- dlls/dswave/Makefile.in | 1 + dlls/dswave/dmobject.c | 185 +++++++++++++++++++++++++++++++++++ dlls/dswave/dmobject.h | 55 +++++++++++ dlls/dswave/dswave.c | 151 +++++++--------------------- dlls/dswave/dswave_private.h | 9 -- dlls/dswave/tests/dswave.c | 6 +- 6 files changed, 277 insertions(+), 130 deletions(-) create mode 100644 dlls/dswave/dmobject.c create mode 100644 dlls/dswave/dmobject.h diff --git a/dlls/dswave/Makefile.in b/dlls/dswave/Makefile.in index 20ad4d06c78..9a08518397b 100644 --- a/dlls/dswave/Makefile.in +++ b/dlls/dswave/Makefile.in @@ -2,6 +2,7 @@ MODULE = dswave.dll IMPORTS = dxguid uuid ole32 advapi32 C_SRCS = \ + dmobject.c \ dswave.c \ dswave_main.c diff --git a/dlls/dswave/dmobject.c b/dlls/dswave/dmobject.c new file mode 100644 index 00000000000..cabb6f74db9 --- /dev/null +++ b/dlls/dswave/dmobject.c @@ -0,0 +1,185 @@ +/* + * Base IDirectMusicObject Implementation + * Keep in sync with the master in dlls/dmusic/dmobject.c + * + * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2014 Michael Stefaniuc + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS +#include "objbase.h" +#include "dmusici.h" +#include "dmobject.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dmobj); + +/* Generic IDirectMusicObject methods */ +static inline struct dmobject *impl_from_IDirectMusicObject(IDirectMusicObject *iface) +{ + return CONTAINING_RECORD(iface, struct dmobject, IDirectMusicObject_iface); +} + +HRESULT WINAPI dmobj_IDirectMusicObject_QueryInterface(IDirectMusicObject *iface, REFIID riid, + void **ret_iface) +{ + struct dmobject *This = impl_from_IDirectMusicObject(iface); + return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); +} + +ULONG WINAPI dmobj_IDirectMusicObject_AddRef(IDirectMusicObject *iface) +{ + struct dmobject *This = impl_from_IDirectMusicObject(iface); + return IUnknown_AddRef(This->outer_unk); +} + +ULONG WINAPI dmobj_IDirectMusicObject_Release(IDirectMusicObject *iface) +{ + struct dmobject *This = impl_from_IDirectMusicObject(iface); + return IUnknown_Release(This->outer_unk); +} + +HRESULT WINAPI dmobj_IDirectMusicObject_GetDescriptor(IDirectMusicObject *iface, + DMUS_OBJECTDESC *desc) +{ + struct dmobject *This = impl_from_IDirectMusicObject(iface); + + TRACE("(%p/%p)->(%p)\n", iface, This, desc); + + if (!desc) + return E_POINTER; + + memcpy(desc, &This->desc, This->desc.dwSize); + + return S_OK; +} + +HRESULT WINAPI dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject *iface, + DMUS_OBJECTDESC *desc) +{ + struct dmobject *This = impl_from_IDirectMusicObject(iface); + HRESULT ret = S_OK; + + TRACE("(%p, %p)\n", iface, desc); + + if (!desc) + return E_POINTER; + + /* Immutable property */ + if (desc->dwValidData & DMUS_OBJ_CLASS) + { + desc->dwValidData &= ~DMUS_OBJ_CLASS; + ret = S_FALSE; + } + /* Set only valid fields */ + if (desc->dwValidData & DMUS_OBJ_OBJECT) + This->desc.guidObject = desc->guidObject; + if (desc->dwValidData & DMUS_OBJ_NAME) + lstrcpynW(This->desc.wszName, desc->wszName, DMUS_MAX_NAME); + if (desc->dwValidData & DMUS_OBJ_CATEGORY) + lstrcpynW(This->desc.wszCategory, desc->wszCategory, DMUS_MAX_CATEGORY); + if (desc->dwValidData & DMUS_OBJ_FILENAME) + lstrcpynW(This->desc.wszFileName, desc->wszFileName, DMUS_MAX_FILENAME); + if (desc->dwValidData & DMUS_OBJ_VERSION) + This->desc.vVersion = desc->vVersion; + if (desc->dwValidData & DMUS_OBJ_DATE) + This->desc.ftDate = desc->ftDate; + if (desc->dwValidData & DMUS_OBJ_MEMORY) { + This->desc.llMemLength = desc->llMemLength; + memcpy(This->desc.pbMemData, desc->pbMemData, desc->llMemLength); + } + if (desc->dwValidData & DMUS_OBJ_STREAM) + IStream_Clone(desc->pStream, &This->desc.pStream); + + This->desc.dwValidData |= desc->dwValidData; + + return ret; +} + +/* Generic IPersistStream methods */ +static inline struct dmobject *impl_from_IPersistStream(IPersistStream *iface) +{ + return CONTAINING_RECORD(iface, struct dmobject, IPersistStream_iface); +} + +HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, + void **ret_iface) +{ + struct dmobject *This = impl_from_IPersistStream(iface); + return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); +} + +ULONG WINAPI dmobj_IPersistStream_AddRef(IPersistStream *iface) +{ + struct dmobject *This = impl_from_IPersistStream(iface); + return IUnknown_AddRef(This->outer_unk); +} + +ULONG WINAPI dmobj_IPersistStream_Release(IPersistStream *iface) +{ + struct dmobject *This = impl_from_IPersistStream(iface); + return IUnknown_Release(This->outer_unk); +} + +HRESULT WINAPI dmobj_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class) +{ + struct dmobject *This = impl_from_IPersistStream(iface); + + TRACE("(%p, %p)\n", This, class); + + if (!class) + return E_POINTER; + + *class = This->desc.guidClass; + + return S_OK; +} + +/* IPersistStream methods not implemented in native */ +HRESULT WINAPI unimpl_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class) +{ + TRACE("(%p, %p): method not implemented\n", iface, class); + return E_NOTIMPL; +} + +HRESULT WINAPI unimpl_IPersistStream_IsDirty(IPersistStream *iface) +{ + TRACE("(%p): method not implemented, always returning S_FALSE\n", iface); + return S_FALSE; +} + +HRESULT WINAPI unimpl_IPersistStream_Save(IPersistStream *iface, IStream *stream, + BOOL clear_dirty) +{ + TRACE("(%p, %p, %d): method not implemented\n", iface, stream, clear_dirty); + return E_NOTIMPL; +} + +HRESULT WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size) +{ + TRACE("(%p, %p): method not implemented\n", iface, size); + return E_NOTIMPL; +} + + +void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk) +{ + dmobj->outer_unk = outer_unk; + dmobj->desc.dwSize = sizeof(dmobj->desc); + dmobj->desc.dwValidData = DMUS_OBJ_CLASS; + dmobj->desc.guidClass = *class; +} diff --git a/dlls/dswave/dmobject.h b/dlls/dswave/dmobject.h new file mode 100644 index 00000000000..ad6bf6d14c6 --- /dev/null +++ b/dlls/dswave/dmobject.h @@ -0,0 +1,55 @@ +/* + * Base IDirectMusicObject Implementation + * Keep in sync with the master in dlls/dmusic/dmobject.h + * + * Copyright (C) 2014 Michael Stefaniuc + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +struct dmobject { + IDirectMusicObject IDirectMusicObject_iface; + IPersistStream IPersistStream_iface; + IUnknown *outer_unk; + DMUS_OBJECTDESC desc; +}; + +void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk) DECLSPEC_HIDDEN; + +/* Generic IDirectMusicObject methods */ +HRESULT WINAPI dmobj_IDirectMusicObject_QueryInterface(IDirectMusicObject *iface, REFIID riid, + void **ret_iface) DECLSPEC_HIDDEN; +ULONG WINAPI dmobj_IDirectMusicObject_AddRef(IDirectMusicObject *iface) DECLSPEC_HIDDEN; +ULONG WINAPI dmobj_IDirectMusicObject_Release(IDirectMusicObject *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI dmobj_IDirectMusicObject_GetDescriptor(IDirectMusicObject *iface, + DMUS_OBJECTDESC *desc) DECLSPEC_HIDDEN; +HRESULT WINAPI dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject *iface, + DMUS_OBJECTDESC *desc) DECLSPEC_HIDDEN; + +/* Generic IPersistStream methods */ +HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, + void **ret_iface) DECLSPEC_HIDDEN; +ULONG WINAPI dmobj_IPersistStream_AddRef(IPersistStream *iface) DECLSPEC_HIDDEN; +ULONG WINAPI dmobj_IPersistStream_Release(IPersistStream *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI dmobj_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class) DECLSPEC_HIDDEN; + +/* IPersistStream methods not implemented in native */ +HRESULT WINAPI unimpl_IPersistStream_GetClassID(IPersistStream *iface, + CLSID *class) DECLSPEC_HIDDEN; +HRESULT WINAPI unimpl_IPersistStream_IsDirty(IPersistStream *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI unimpl_IPersistStream_Save(IPersistStream *iface, IStream *stream, + BOOL clear_dirty) DECLSPEC_HIDDEN; +HRESULT WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, + ULARGE_INTEGER *size) DECLSPEC_HIDDEN; diff --git a/dlls/dswave/dswave.c b/dlls/dswave/dswave.c index ad83ca08b2b..f1ddf730390 100644 --- a/dlls/dswave/dswave.c +++ b/dlls/dswave/dswave.c @@ -18,6 +18,7 @@ */ #include "dswave_private.h" +#include "dmobject.h" WINE_DEFAULT_DEBUG_CHANNEL(dswave); WINE_DECLARE_DEBUG_CHANNEL(dmfile); @@ -31,8 +32,7 @@ static const GUID IID_IDirectMusicWavePRIVATE = {0x69e934e4,0x97f1,0x4f1d,{0x88, */ typedef struct IDirectMusicWaveImpl { IUnknown IUnknown_iface; - const IDirectMusicObjectVtbl *ObjectVtbl; - const IPersistStreamVtbl *PersistStreamVtbl; + struct dmobject dmobj; LONG ref; LPDMUS_OBJECTDESC pDesc; } IDirectMusicWaveImpl; @@ -54,9 +54,9 @@ static HRESULT WINAPI IUnknownImpl_QueryInterface(IUnknown *iface, REFIID riid, if (IsEqualIID(riid, &IID_IUnknown)) *ret_iface = iface; else if (IsEqualIID(riid, &IID_IDirectMusicObject)) - *ret_iface = &This->ObjectVtbl; + *ret_iface = &This->dmobj.IDirectMusicObject_iface; else if (IsEqualIID(riid, &IID_IPersistStream)) - *ret_iface = &This->PersistStreamVtbl; + *ret_iface = &This->dmobj.IPersistStream_iface; else if (IsEqualIID(riid, &IID_IDirectMusicWavePRIVATE)) { FIXME("(%p, %s, %p): Unsupported private interface\n", This, debugstr_guid(riid), ret_iface); return E_NOINTERFACE; @@ -87,7 +87,6 @@ static ULONG WINAPI IUnknownImpl_Release(IUnknown *iface) TRACE("(%p) ref=%d\n", This, ref); if (!ref) { - HeapFree(GetProcessHeap(), 0, This->pDesc); HeapFree(GetProcessHeap(), 0, This); DSWAVE_UnlockModule(); } @@ -102,64 +101,9 @@ static const IUnknownVtbl unknown_vtbl = { }; /* IDirectMusicWaveImpl IDirectMusicObject part: */ -static HRESULT WINAPI IDirectMusicWaveImpl_IDirectMusicObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, ObjectVtbl, iface); - return IUnknown_QueryInterface(&This->IUnknown_iface, riid, ppobj); -} - -static ULONG WINAPI IDirectMusicWaveImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, ObjectVtbl, iface); - return IUnknown_AddRef(&This->IUnknown_iface); -} - -static ULONG WINAPI IDirectMusicWaveImpl_IDirectMusicObject_Release (LPDIRECTMUSICOBJECT iface) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, ObjectVtbl, iface); - return IUnknown_Release(&This->IUnknown_iface); -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IDirectMusicObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, ObjectVtbl, iface); - TRACE("(%p, %p)\n", This, pDesc); - /* I think we shouldn't return pointer here since then values can be changed; it'd be a mess */ - memcpy (pDesc, This->pDesc, This->pDesc->dwSize); - return S_OK; -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IDirectMusicObject_SetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, ObjectVtbl, iface); - TRACE("(%p, %p, %s): setting descriptor:\n", This, pDesc, debugstr_DMUS_OBJECTDESC(pDesc)); - - /* According to MSDN, we should copy only given values, not whole struct */ - if (pDesc->dwValidData & DMUS_OBJ_OBJECT) - This->pDesc->guidObject = pDesc->guidObject; - if (pDesc->dwValidData & DMUS_OBJ_CLASS) - This->pDesc->guidClass = pDesc->guidClass; - if (pDesc->dwValidData & DMUS_OBJ_NAME) - lstrcpynW (This->pDesc->wszName, pDesc->wszName, DMUS_MAX_NAME); - if (pDesc->dwValidData & DMUS_OBJ_CATEGORY) - lstrcpynW (This->pDesc->wszCategory, pDesc->wszCategory, DMUS_MAX_CATEGORY); - if (pDesc->dwValidData & DMUS_OBJ_FILENAME) - lstrcpynW (This->pDesc->wszFileName, pDesc->wszFileName, DMUS_MAX_FILENAME); - if (pDesc->dwValidData & DMUS_OBJ_VERSION) - This->pDesc->vVersion = pDesc->vVersion; - if (pDesc->dwValidData & DMUS_OBJ_DATE) - This->pDesc->ftDate = pDesc->ftDate; - if (pDesc->dwValidData & DMUS_OBJ_MEMORY) { - This->pDesc->llMemLength = pDesc->llMemLength; - memcpy (This->pDesc->pbMemData, pDesc->pbMemData, pDesc->llMemLength); - } - if (pDesc->dwValidData & DMUS_OBJ_STREAM) { - /* according to MSDN, we copy the stream */ - IStream_Clone (pDesc->pStream, &This->pDesc->pStream); - } - - /* add new flags */ - This->pDesc->dwValidData |= pDesc->dwValidData; - - return S_OK; -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IDirectMusicObject_ParseDescriptor (LPDIRECTMUSICOBJECT iface, LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc) { +static HRESULT WINAPI IDirectMusicObjectImpl_ParseDescriptor(IDirectMusicObject *iface, + IStream *pStream, DMUS_OBJECTDESC *pDesc) +{ DMUS_PRIVATE_CHUNK Chunk; DWORD StreamSize, StreamCount, ListSize[1], ListCount[1]; LARGE_INTEGER liMove; /* used when skipping chunks */ @@ -306,42 +250,24 @@ static HRESULT WINAPI IDirectMusicWaveImpl_IDirectMusicObject_ParseDescriptor (L return S_OK; } -static const IDirectMusicObjectVtbl DirectMusicWave_Object_Vtbl = { - IDirectMusicWaveImpl_IDirectMusicObject_QueryInterface, - IDirectMusicWaveImpl_IDirectMusicObject_AddRef, - IDirectMusicWaveImpl_IDirectMusicObject_Release, - IDirectMusicWaveImpl_IDirectMusicObject_GetDescriptor, - IDirectMusicWaveImpl_IDirectMusicObject_SetDescriptor, - IDirectMusicWaveImpl_IDirectMusicObject_ParseDescriptor +static const IDirectMusicObjectVtbl dmobject_vtbl = { + dmobj_IDirectMusicObject_QueryInterface, + dmobj_IDirectMusicObject_AddRef, + dmobj_IDirectMusicObject_Release, + dmobj_IDirectMusicObject_GetDescriptor, + dmobj_IDirectMusicObject_SetDescriptor, + IDirectMusicObjectImpl_ParseDescriptor }; /* IDirectMusicWaveImpl IPersistStream part: */ -static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, PersistStreamVtbl, iface); - return IUnknown_QueryInterface(&This->IUnknown_iface, riid, ppobj); +static inline IDirectMusicWaveImpl *impl_from_IPersistStream(IPersistStream *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicWaveImpl, dmobj.IPersistStream_iface); } -static ULONG WINAPI IDirectMusicWaveImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, PersistStreamVtbl, iface); - return IUnknown_AddRef(&This->IUnknown_iface); -} - -static ULONG WINAPI IDirectMusicWaveImpl_IPersistStream_Release (LPPERSISTSTREAM iface) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, PersistStreamVtbl, iface); - return IUnknown_Release(&This->IUnknown_iface); -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) { - return E_NOTIMPL; -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_IsDirty (LPPERSISTSTREAM iface) { - return E_NOTIMPL; -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) { - ICOM_THIS_MULTI(IDirectMusicWaveImpl, PersistStreamVtbl, iface); - +static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pStm) +{ + IDirectMusicWaveImpl *This = impl_from_IPersistStream(iface); DMUS_PRIVATE_CHUNK Chunk; DWORD StreamSize, StreamCount, ListSize[1], ListCount[1]; LARGE_INTEGER liMove; /* used when skipping chunks */ @@ -486,26 +412,17 @@ static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_Load (LPPERSISTSTREAM return S_OK; } -static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) { - return E_NOTIMPL; -} - -static HRESULT WINAPI IDirectMusicWaveImpl_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) { - return E_NOTIMPL; -} - -static const IPersistStreamVtbl DirectMusicWave_PersistStream_Vtbl = { - IDirectMusicWaveImpl_IPersistStream_QueryInterface, - IDirectMusicWaveImpl_IPersistStream_AddRef, - IDirectMusicWaveImpl_IPersistStream_Release, - IDirectMusicWaveImpl_IPersistStream_GetClassID, - IDirectMusicWaveImpl_IPersistStream_IsDirty, - IDirectMusicWaveImpl_IPersistStream_Load, - IDirectMusicWaveImpl_IPersistStream_Save, - IDirectMusicWaveImpl_IPersistStream_GetSizeMax +static const IPersistStreamVtbl persiststream_vtbl = { + dmobj_IPersistStream_QueryInterface, + dmobj_IPersistStream_AddRef, + dmobj_IPersistStream_Release, + dmobj_IPersistStream_GetClassID, + unimpl_IPersistStream_IsDirty, + IPersistStreamImpl_Load, + unimpl_IPersistStream_Save, + unimpl_IPersistStream_GetSizeMax }; - /* for ClassFactory */ HRESULT WINAPI create_dswave(REFIID lpcGUID, void **ppobj) { @@ -518,13 +435,11 @@ HRESULT WINAPI create_dswave(REFIID lpcGUID, void **ppobj) return E_OUTOFMEMORY; } obj->IUnknown_iface.lpVtbl = &unknown_vtbl; - obj->ObjectVtbl = &DirectMusicWave_Object_Vtbl; - obj->PersistStreamVtbl = &DirectMusicWave_PersistStream_Vtbl; - obj->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC)); - DM_STRUCT_INIT(obj->pDesc); - obj->pDesc->dwValidData |= DMUS_OBJ_CLASS; - obj->pDesc->guidClass = CLSID_DirectMusicSegment; /* shown by tests */ obj->ref = 1; + dmobject_init(&obj->dmobj, &CLSID_DirectSoundWave, &obj->IUnknown_iface); + obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl; + obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; + obj->pDesc = &obj->dmobj.desc; DSWAVE_LockModule(); hr = IUnknown_QueryInterface(&obj->IUnknown_iface, lpcGUID, ppobj); diff --git a/dlls/dswave/dswave_private.h b/dlls/dswave/dswave_private.h index febdcfc7987..8dea3a9a5d2 100644 --- a/dlls/dswave/dswave_private.h +++ b/dlls/dswave/dswave_private.h @@ -72,18 +72,9 @@ typedef struct { const char* name; } guid_info; -/* used for initialising structs (primarily for DMUS_OBJECTDESC) */ -#define DM_STRUCT_INIT(x) \ - do { \ - memset((x), 0, sizeof(*(x))); \ - (x)->dwSize = sizeof(*x); \ - } while (0) - #define FE(x) { x, #x } #define GE(x) { &x, #x } -#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) - /* FOURCC to string conversion for debug messages */ extern const char *debugstr_fourcc (DWORD fourcc) DECLSPEC_HIDDEN; /* returns name of given GUID */ diff --git a/dlls/dswave/tests/dswave.c b/dlls/dswave/tests/dswave.c index c2fc08f06a4..ee0c0fd41c9 100644 --- a/dlls/dswave/tests/dswave.c +++ b/dlls/dswave/tests/dswave.c @@ -113,13 +113,13 @@ static void test_dswave(void) hr = IDirectMusicObject_QueryInterface(dmo, &IID_IPersistStream, (void**)&ps); ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); hr = IPersistStream_GetClassID(ps, &class); - todo_wine ok(hr == S_OK, "IPersistStream_GetClassID failed: %08x\n", hr); - todo_wine ok(IsEqualGUID(&class, &CLSID_DirectSoundWave), + ok(hr == S_OK, "IPersistStream_GetClassID failed: %08x\n", hr); + ok(IsEqualGUID(&class, &CLSID_DirectSoundWave), "Expected class CLSID_DirectSoundWave got %s\n", wine_dbgstr_guid(&class)); /* Unimplemented IPersistStream methods */ hr = IPersistStream_IsDirty(ps); - todo_wine ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr); + ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr); hr = IPersistStream_GetSizeMax(ps, &size); ok(hr == E_NOTIMPL, "IPersistStream_GetSizeMax failed: %08x\n", hr); hr = IPersistStream_Save(ps, NULL, TRUE);