[PATCH 2/3] dmusic: Pass creation parameters to DMUSIC_CreateDirectMusicBufferImpl then allocate data buffer and set format accordingly.
Christian Costa
titan.costa at gmail.com
Sat Apr 21 07:19:44 CDT 2012
---
dlls/dmusic/buffer.c | 40 +++++++++++++++++++++++++++-------------
dlls/dmusic/dmusic.c | 2 +-
dlls/dmusic/dmusic_private.h | 22 ++++++++++++++--------
3 files changed, 42 insertions(+), 22 deletions(-)
diff --git a/dlls/dmusic/buffer.c b/dlls/dmusic/buffer.c
index c8c7ca1..0fe80a0 100644
--- a/dlls/dmusic/buffer.c
+++ b/dlls/dmusic/buffer.c
@@ -53,6 +53,7 @@ static ULONG WINAPI IDirectMusicBufferImpl_Release (LPDIRECTMUSICBUFFER iface) {
TRACE("(%p)->(ref before=%u)\n", This, refCount + 1);
if (!refCount) {
+ HeapFree(GetProcessHeap(), 0, This->data);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -159,17 +160,30 @@ static const IDirectMusicBufferVtbl DirectMusicBuffer_Vtbl = {
IDirectMusicBufferImpl_SetUsedBytes
};
-/* for ClassFactory */
-HRESULT WINAPI DMUSIC_CreateDirectMusicBufferImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) {
- IDirectMusicBufferImpl* dmbuff;
-
- dmbuff = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicBufferImpl));
- if (NULL == dmbuff) {
- *ppobj = NULL;
- return E_OUTOFMEMORY;
- }
- dmbuff->lpVtbl = &DirectMusicBuffer_Vtbl;
- dmbuff->ref = 0; /* will be inited by QueryInterface */
-
- return IDirectMusicBufferImpl_QueryInterface ((LPDIRECTMUSICBUFFER)dmbuff, lpcGUID, ppobj);
+HRESULT WINAPI DMUSIC_CreateDirectMusicBufferImpl(LPDMUS_BUFFERDESC desc, LPVOID* ret_iface)
+{
+ IDirectMusicBufferImpl* dmbuffer;
+
+ TRACE("(%p, %p)\n", desc, ret_iface);
+
+ dmbuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicBufferImpl));
+ if (!dmbuffer) {
+ *ret_iface = NULL;
+ return E_OUTOFMEMORY;
+ }
+
+ dmbuffer->lpVtbl = &DirectMusicBuffer_Vtbl;
+ dmbuffer->ref = 0; /* Will be inited by QueryInterface */
+
+ memcpy(&dmbuffer->format, &desc->guidBufferFormat, sizeof(GUID));
+ dmbuffer->size = (desc->cbBuffer + 3) & ~3; /* Buffer size must be multiple of 4 bytes */
+
+ dmbuffer->data = HeapAlloc(GetProcessHeap(), 0, sizeof(dmbuffer->size));
+ if (!dmbuffer->data) {
+ HeapFree(GetProcessHeap(), 0, dmbuffer);
+ *ret_iface = NULL;
+ return E_OUTOFMEMORY;
+ }
+
+ return IDirectMusicBufferImpl_QueryInterface((LPDIRECTMUSICBUFFER)dmbuffer, &IID_IDirectMusicBuffer, ret_iface);
}
diff --git a/dlls/dmusic/dmusic.c b/dlls/dmusic/dmusic.c
index 2d01a34..e04885e 100644
--- a/dlls/dmusic/dmusic.c
+++ b/dlls/dmusic/dmusic.c
@@ -167,7 +167,7 @@ static HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer (LPDIRECTMUSIC8 iface,
if (!pBufferDesc || !ppBuffer)
return E_POINTER;
- return DMUSIC_CreateDirectMusicBufferImpl(&IID_IDirectMusicBuffer, (LPVOID)ppBuffer, NULL);
+ return DMUSIC_CreateDirectMusicBufferImpl(pBufferDesc, (LPVOID)ppBuffer);
}
static HRESULT WINAPI IDirectMusic8Impl_CreatePort(LPDIRECTMUSIC8 iface, REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT* ppPort, LPUNKNOWN pUnkOuter)
diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h
index 97f5994..4d883b5 100644
--- a/dlls/dmusic/dmusic_private.h
+++ b/dlls/dmusic/dmusic_private.h
@@ -75,13 +75,16 @@ typedef struct DMUSIC_PRIVATE_CHANNEL_GROUP_ {
/*****************************************************************************
* ClassFactory
*/
+
+/* CLSID */
extern HRESULT WINAPI DMUSIC_CreateDirectMusicImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI DMUSIC_CreateDirectMusicBufferImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl(LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
+
+/* Internal */
+extern HRESULT WINAPI DMUSIC_CreateDirectMusicBufferImpl(LPDMUS_BUFFERDESC desc, LPVOID* ret_iface) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicDownloadedInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicDownloadImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateReferenceClockImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
-
-extern HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
/*****************************************************************************
@@ -104,11 +107,14 @@ struct IDirectMusic8Impl {
* IDirectMusicBufferImpl implementation structure
*/
struct IDirectMusicBufferImpl {
- /* IUnknown fields */
- const IDirectMusicBufferVtbl *lpVtbl;
- LONG ref;
-
- /* IDirectMusicBufferImpl fields */
+ /* IUnknown fields */
+ const IDirectMusicBufferVtbl *lpVtbl;
+ LONG ref;
+
+ /* IDirectMusicBufferImpl fields */
+ GUID format;
+ DWORD size;
+ LPBYTE data;
};
/*****************************************************************************
More information about the wine-patches
mailing list