[PATCH 01/10] dmusic: Move the common parts of DMObject to a generic implementation

Michael Stefaniuc mstefani at redhat.de
Thu Jun 12 04:10:24 CDT 2014


---
Some justification why I've done it this way and e.g. didn't follow the
way that strmbase is doing it:
- IDirectMusicObject is really badly named. It is *not* a base class for
  all dmusic and related COM objects. Instead it is a helper interface
  to enable automatic loading of dmusic COM objects with dmloader. While
  there are 10+ COM objects that support IDirectMusicObject there are a
  lot more dmusic COM objects that do not support this interface.

- So the dmusic COM object "has a" and not "is a" IDirectMusicObject.

- While dlls/dmloader/ would have been also a good place to hold the
  generic IDirectMusicObject implementation I decided against it. I
  intend (once my eyes stop bleeding) to cleanup all
  IPersistStream_Load() and IDirectMusicObject_ParseDescriptor() and
  will need a few helpers for that. There are a ton more IPersistStream
  only dmusic COM objects than those that have IDirectMusicObject too.
  I'll need to use for that some of the extensive debugging helpers that
  are duplicated all over the place; opportunity to clean those up en
  pasant. So dmobject.[ch] will end up holding generic dm* related code
  and not just loader stuff and dmusic as the name sake of the whole API
  is the better place for that.

bye
	michael


 dlls/dmusic/Makefile.in      |   1 +
 dlls/dmusic/collection.c     | 151 +++++++------------------------------------
 dlls/dmusic/dmobject.c       | 144 +++++++++++++++++++++++++++++++++++++++++
 dlls/dmusic/dmobject.h       |  44 +++++++++++++
 dlls/dmusic/dmusic_private.h |   7 --
 5 files changed, 214 insertions(+), 133 deletions(-)
 create mode 100644 dlls/dmusic/dmobject.c
 create mode 100644 dlls/dmusic/dmobject.h

diff --git a/dlls/dmusic/Makefile.in b/dlls/dmusic/Makefile.in
index 2d0a143..98cfaef 100644
--- a/dlls/dmusic/Makefile.in
+++ b/dlls/dmusic/Makefile.in
@@ -5,6 +5,7 @@ C_SRCS = \
 	buffer.c \
 	clock.c \
 	collection.c \
+	dmobject.c \
 	dmusic.c \
 	dmusic_main.c \
 	download.c \
diff --git a/dlls/dmusic/collection.c b/dlls/dmusic/collection.c
index 2c826f5..9c6f357 100644
--- a/dlls/dmusic/collection.c
+++ b/dlls/dmusic/collection.c
@@ -19,6 +19,7 @@
  */
 
 #include "dmusic_private.h"
+#include "dmobject.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dmusic);
 WINE_DECLARE_DEBUG_CHANNEL(dmfile);
@@ -28,8 +29,7 @@ WINE_DECLARE_DEBUG_CHANNEL(dmfile);
  */
 typedef struct IDirectMusicCollectionImpl {
     IDirectMusicCollection IDirectMusicCollection_iface;
-    IDirectMusicObject IDirectMusicObject_iface;
-    IPersistStream IPersistStream_iface;
+    struct dmobject dmobj;
     LONG ref;
     /* IDirectMusicCollectionImpl fields */
     IStream *pStm; /* stream from which we load collection and later instruments */
@@ -50,14 +50,14 @@ static inline IDirectMusicCollectionImpl *impl_from_IDirectMusicCollection(IDire
     return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, IDirectMusicCollection_iface);
 }
 
-static inline IDirectMusicCollectionImpl *impl_from_IDirectMusicObject(IDirectMusicObject *iface)
+static inline struct dmobject *impl_from_IDirectMusicObject(IDirectMusicObject *iface)
 {
-    return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, IDirectMusicObject_iface);
+    return CONTAINING_RECORD(iface, struct dmobject, IDirectMusicObject_iface);
 }
 
 static inline IDirectMusicCollectionImpl *impl_from_IPersistStream(IPersistStream *iface)
 {
-    return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, IPersistStream_iface);
+    return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, dmobj.IPersistStream_iface);
 }
 
 /* IDirectMusicCollectionImpl IUnknown part: */
@@ -72,9 +72,9 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_QueryInt
     if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicCollection))
         *ret_iface = iface;
     else if (IsEqualIID(riid, &IID_IDirectMusicObject))
-        *ret_iface = &This->IDirectMusicObject_iface;
+        *ret_iface = &This->dmobj.IDirectMusicObject_iface;
     else if (IsEqualIID(riid, &IID_IPersistStream))
-        *ret_iface = &This->IPersistStream_iface;
+        *ret_iface = &This->dmobj.IPersistStream_iface;
     else
     {
         WARN("(%p/%p)->(%s, %p): not found\n", iface, This, debugstr_dmguid(riid), ret_iface);
@@ -174,88 +174,6 @@ static const IDirectMusicCollectionVtbl DirectMusicCollection_Collection_Vtbl =
 };
 
 /* IDirectMusicCollectionImpl IDirectMusicObject part: */
-static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_QueryInterface(LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ret_iface)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface);
-    return IDirectMusicCollection_QueryInterface(&This->IDirectMusicCollection_iface, riid, ret_iface);
-}
-
-static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_AddRef(LPDIRECTMUSICOBJECT iface)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface);
-    return IDirectMusicCollection_AddRef(&This->IDirectMusicCollection_iface);
-}
-
-static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_Release(LPDIRECTMUSICOBJECT iface)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface);
-    return IDirectMusicCollection_Release(&This->IDirectMusicCollection_iface);
-}
-
-static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_GetDescriptor(LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface);
-
-    TRACE("(%p/%p)->(%p)\n", iface, This, pDesc);
-
-    if (!pDesc)
-        return E_POINTER;
-
-    memcpy (pDesc, This->pDesc, This->pDesc->dwSize);
-
-    return S_OK;
-}
-
-static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_SetDescriptor(LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc)
-{
-        IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface);
-        HRESULT ret = S_OK;
-
-
-	TRACE("(%p, %p)\n", iface, pDesc);
-
-	if (!pDesc)
-		return E_POINTER;
-
-	if (TRACE_ON(dmusic))
-	{
-		TRACE("Setting descriptor:\n");
-		dump_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)
-        {
-                pDesc->dwValidData &= ~DMUS_OBJ_CLASS;
-                ret = S_FALSE;
-        }
-	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 ret;
-}
-
 static HRESULT read_from_stream(IStream *stream, void *data, ULONG size)
 {
     ULONG read;
@@ -276,7 +194,7 @@ static HRESULT read_from_stream(IStream *stream, void *data, ULONG size)
 
 static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescriptor(LPDIRECTMUSICOBJECT iface, LPSTREAM stream, LPDMUS_OBJECTDESC desc)
 {
-    IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface);
+    struct dmobject *This = impl_from_IDirectMusicObject(iface);
     DMUS_PRIVATE_CHUNK chunk;
     DWORD StreamSize, StreamCount, ListSize[1], ListCount[1];
     LARGE_INTEGER liMove; /* used when skipping chunks */
@@ -286,7 +204,7 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescrip
 
     /* FIXME: should this be determined from stream? */
     desc->dwValidData |= DMUS_OBJ_CLASS;
-    desc->guidClass = This->pDesc->guidClass;
+    desc->guidClass = This->desc.guidClass;
 
     hr = read_from_stream(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD));
     if (FAILED(hr))
@@ -462,34 +380,16 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescrip
     return S_OK;
 }
 
-static const IDirectMusicObjectVtbl DirectMusicCollection_Object_Vtbl = {
-	IDirectMusicCollectionImpl_IDirectMusicObject_QueryInterface,
-	IDirectMusicCollectionImpl_IDirectMusicObject_AddRef,
-	IDirectMusicCollectionImpl_IDirectMusicObject_Release,
-	IDirectMusicCollectionImpl_IDirectMusicObject_GetDescriptor,
-	IDirectMusicCollectionImpl_IDirectMusicObject_SetDescriptor,
+static const IDirectMusicObjectVtbl dmobject_vtbl = {
+    dmobj_IDirectMusicObject_QueryInterface,
+    dmobj_IDirectMusicObject_AddRef,
+    dmobj_IDirectMusicObject_Release,
+    dmobj_IDirectMusicObject_GetDescriptor,
+    dmobj_IDirectMusicObject_SetDescriptor,
 	IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescriptor
 };
 
 /* IDirectMusicCollectionImpl IPersistStream part: */
-static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_QueryInterface(LPPERSISTSTREAM iface, REFIID riid, LPVOID *ret_iface)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface);
-    return IDirectMusicCollection_QueryInterface(&This->IDirectMusicCollection_iface, riid, ret_iface);
-}
-
-static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface);
-    return IDirectMusicCollection_AddRef(&This->IDirectMusicCollection_iface);
-}
-
-static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_Release (LPPERSISTSTREAM iface)
-{
-    IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface);
-    return IDirectMusicCollection_Release(&This->IDirectMusicCollection_iface);
-}
-
 static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_GetClassID(LPPERSISTSTREAM iface, CLSID* pClassID)
 {
     return E_NOTIMPL;
@@ -813,10 +713,10 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_GetSizeMax(LPPER
     return E_NOTIMPL;
 }
 
-static const IPersistStreamVtbl DirectMusicCollection_PersistStream_Vtbl = {
-	IDirectMusicCollectionImpl_IPersistStream_QueryInterface,
-	IDirectMusicCollectionImpl_IPersistStream_AddRef,
-	IDirectMusicCollectionImpl_IPersistStream_Release,
+static const IPersistStreamVtbl persiststream_vtbl = {
+    dmobj_IPersistStream_QueryInterface,
+    dmobj_IPersistStream_AddRef,
+    dmobj_IPersistStream_Release,
 	IDirectMusicCollectionImpl_IPersistStream_GetClassID,
 	IDirectMusicCollectionImpl_IPersistStream_IsDirty,
 	IDirectMusicCollectionImpl_IPersistStream_Load,
@@ -825,7 +725,6 @@ static const IPersistStreamVtbl DirectMusicCollection_PersistStream_Vtbl = {
 };
 
 
-/* for ClassFactory */
 HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl(LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter)
 {
 	IDirectMusicCollectionImpl* obj;
@@ -840,13 +739,13 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl(LPCGUID lpcGUID, LPVOID* p
                 return E_OUTOFMEMORY;
 
 	obj->IDirectMusicCollection_iface.lpVtbl = &DirectMusicCollection_Collection_Vtbl;
-	obj->IDirectMusicObject_iface.lpVtbl = &DirectMusicCollection_Object_Vtbl;
-	obj->IPersistStream_iface.lpVtbl = &DirectMusicCollection_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_DirectMusicCollection;
         obj->ref = 1;
+        dmobject_init(&obj->dmobj, &CLSID_DirectMusicCollection,
+                (IUnknown*)&obj->IDirectMusicCollection_iface);
+        obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl;
+        obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl;
+        obj->pDesc = &obj->dmobj.desc;
+
 	list_init (&obj->Instruments);
 
         DMUSIC_LockModule();
diff --git a/dlls/dmusic/dmobject.c b/dlls/dmusic/dmobject.c
new file mode 100644
index 0000000..f6c83a0
--- /dev/null
+++ b/dlls/dmusic/dmobject.c
@@ -0,0 +1,144 @@
+/*
+ * Base IDirectMusicObject Implementation
+ *
+ * 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);
+}
+
+
+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/dmusic/dmobject.h b/dlls/dmusic/dmobject.h
new file mode 100644
index 0000000..1a09a0b
--- /dev/null
+++ b/dlls/dmusic/dmobject.h
@@ -0,0 +1,44 @@
+/*
+ * Base IDirectMusicObject Implementation
+ *
+ * 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;
diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h
index 6a87bee..9ac05d6 100644
--- a/dlls/dmusic/dmusic_private.h
+++ b/dlls/dmusic/dmusic_private.h
@@ -269,13 +269,6 @@ 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 }
 
-- 
1.8.3.1



More information about the wine-patches mailing list