diff --git a/dlls/dmusic/Makefile.in b/dlls/dmusic/Makefile.in index 8a19601773d..d90503f3fed 100644 --- a/dlls/dmusic/Makefile.in +++ b/dlls/dmusic/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = dmusic.dll -IMPORTS = user32 kernel32 +IMPORTS = dsound winmm user32 kernel32 EXTRALIBS = $(LIBUUID) LDDLLFLAGS = @LDDLLFLAGS@ diff --git a/dlls/dmusic/dmusic.c b/dlls/dmusic/dmusic.c index a774df33029..6cf1d59b44d 100644 --- a/dlls/dmusic/dmusic.c +++ b/dlls/dmusic/dmusic.c @@ -100,8 +100,10 @@ HRESULT WINAPI IDirectMusicImpl_CreateMusicBuffer (LPDIRECTMUSIC iface, LPDMUS_B HRESULT WINAPI IDirectMusicImpl_CreatePort (LPDIRECTMUSIC iface, REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT* ppPort, LPUNKNOWN pUnkOuter) { - FIXME("stub\n"); - return DS_OK; + ICOM_THIS(IDirectMusicImpl,iface); + FIXME("(%p, %s, %p, %p, %p): stub\n", This, debugstr_guid(rclsidPort), pPortParams, ppPort, pUnkOuter); + return E_OUTOFMEMORY; + } HRESULT WINAPI IDirectMusicImpl_EnumMasterClock (LPDIRECTMUSIC iface, DWORD dwIndex, LPDMUS_CLOCKINFO lpClockInfo) @@ -157,6 +159,34 @@ ICOM_VTABLE(IDirectMusic) DirectMusic_Vtbl = IDirectMusicImpl_SetDirectSound }; + +/* for ClassFactory */ +HRESULT WINAPI DMUSIC_CreateDirectMusic (LPCGUID lpcGUID, LPDIRECTMUSIC *ppDM, LPUNKNOWN pUnkOuter) +{ + IDirectMusicImpl *dmusic; + + TRACE("(%p,%p,%p)\n",lpcGUID, ppDM, pUnkOuter); + + if (IsEqualGUID(lpcGUID, &IID_IDirectMusic)) + { + dmusic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicImpl)); + if (NULL == dmusic) + { + *ppDM = (LPDIRECTMUSIC)NULL; + return E_OUTOFMEMORY; + } + + dmusic->lpVtbl = &DirectMusic_Vtbl; + dmusic->ref = 0; + *ppDM = (LPDIRECTMUSIC)dmusic; + return S_OK; + } + + WARN("No interface found\n"); + return E_NOINTERFACE; +} + + /* IDirectMusic8 IUnknown parts follow: */ HRESULT WINAPI IDirectMusic8Impl_QueryInterface (LPDIRECTMUSIC8 iface, REFIID riid, LPVOID *ppobj) { @@ -191,32 +221,6 @@ ULONG WINAPI IDirectMusic8Impl_Release (LPDIRECTMUSIC8 iface) return ref; } -/* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusic (LPCGUID lpcGUID, LPDIRECTMUSIC *ppDM, LPUNKNOWN pUnkOuter) -{ - IDirectMusicImpl *dmusic; - - TRACE("(%p,%p,%p)\n",lpcGUID, ppDM, pUnkOuter); - - - dmusic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicImpl)); - if (NULL == dmusic) - { - *ppDM = (LPDIRECTMUSIC)NULL; - return E_OUTOFMEMORY; - } - - dmusic->lpVtbl = &DirectMusic_Vtbl; - dmusic->ref = 1; - - *ppDM = (LPDIRECTMUSIC)dmusic; - return S_OK; - - WARN("No interface found\n"); - return E_NOINTERFACE; -} - - /* IDirectMusic8 Interface follow: */ HRESULT WINAPI IDirectMusic8Impl_EnumPort (LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps) { @@ -232,8 +236,9 @@ HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer (LPDIRECTMUSIC8 iface, LPDMUS HRESULT WINAPI IDirectMusic8Impl_CreatePort (LPDIRECTMUSIC8 iface, REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT* ppPort, LPUNKNOWN pUnkOuter) { - FIXME("stub\n"); - return DS_OK; + ICOM_THIS(IDirectMusic8Impl,iface); + FIXME("(%p, %s, %p, %p, %p): stub\n", This, debugstr_guid(rclsidPort), pPortParams, ppPort, pUnkOuter); + return S_OK; } HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock (LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_CLOCKINFO lpClockInfo) diff --git a/dlls/dmusic/dmusic_main.c b/dlls/dmusic/dmusic_main.c index 07508b248ee..ab1227aace9 100644 --- a/dlls/dmusic/dmusic_main.c +++ b/dlls/dmusic/dmusic_main.c @@ -28,8 +28,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmusic); * */ -extern HRESULT WINAPI DMUSIC_CreateDirectMusic (LPCGUID lpcGUID, LPDIRECTMUSIC *ppDM, LPUNKNOWN pUnkOuter); - typedef struct { /* IUnknown fields */ @@ -67,6 +65,10 @@ static HRESULT WINAPI DMCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter { return DMUSIC_CreateDirectMusic (riid, (LPDIRECTMUSIC*)ppobj, pOuter); } + if (IsEqualGUID (&IID_IDirectMusicPerformance, riid)) + { + return DMUSIC_CreateDirectMusicPerformance (riid, (LPDIRECTMUSICPERFORMANCE*)ppobj, pOuter); + } WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj); return E_NOINTERFACE; @@ -100,12 +102,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) if (fdwReason == DLL_PROCESS_ATTACH) { /* FIXME: Initialisation */ - FIXME("stub\n"); } else if (fdwReason == DLL_PROCESS_DETACH) { /* FIXME: Cleanup */ - FIXME("stub\n"); } return TRUE; diff --git a/dlls/dmusic/dmusic_performance.c b/dlls/dmusic/dmusic_performance.c index 76575a469d8..d83d54db922 100644 --- a/dlls/dmusic/dmusic_performance.c +++ b/dlls/dmusic/dmusic_performance.c @@ -65,8 +65,36 @@ ULONG WINAPI IDirectMusicPerformanceImpl_Release (LPDIRECTMUSICPERFORMANCE iface /* IDirectMusicPerformance Interface follow: */ HRESULT WINAPI IDirectMusicPerformanceImpl_Init (LPDIRECTMUSICPERFORMANCE iface, IDirectMusic** ppDirectMusic, LPDIRECTSOUND pDirectSound, HWND hWnd) { - FIXME("stub\n"); - return DS_OK; + ICOM_THIS(IDirectMusicPerformanceImpl,iface); + FIXME("(iface = %p, dmusic = %p (*dmusic = %p), dsound = %p, hwnd = %p): semi-stub\n", This, ppDirectMusic, *ppDirectMusic, pDirectSound, hWnd); + + /* app creates it's own dmusic object and gives it to performance */ + if (*ppDirectMusic) + { + TRACE("App provides DirectMusic\n"); + /* FIXME: is this correct? */ + memcpy(This->dmusic, *ppDirectMusic, sizeof(*ppDirectMusic)); + IDirectMusic_AddRef(This->dmusic); + /* app is supposed to be in charge of everything else */ + return S_OK; + } + /* app allows the performance to initialise itfself and needs a pointer to object*/ + if (!*ppDirectMusic) + { + TRACE("DirectMusic to be created; needed\n"); + if (!This->dmusic) + DMUSIC_CreateDirectMusic(&IID_IDirectMusic, &This->dmusic, NULL); + *ppDirectMusic = This->dmusic; + if (*ppDirectMusic) + IDirectMusic_AddRef(*ppDirectMusic); + } + /* app allows the performance to initialise itself and does not need a pointer to object*/ + if (!ppDirectMusic) + { + TRACE("DirectMusic to be created; not needed\n"); + } + + return S_OK; } HRESULT WINAPI IDirectMusicPerformanceImpl_PlaySegment (LPDIRECTMUSICPERFORMANCE iface, IDirectMusicSegment* pSegment, DWORD dwFlags, __int64 i64StartTime, IDirectMusicSegmentState** ppSegmentState) @@ -275,8 +303,9 @@ HRESULT WINAPI IDirectMusicPerformanceImpl_AdjustTime (LPDIRECTMUSICPERFORMANCE HRESULT WINAPI IDirectMusicPerformanceImpl_CloseDown (LPDIRECTMUSICPERFORMANCE iface) { - FIXME("stub\n"); - return DS_OK; + ICOM_THIS(IDirectMusicPerformanceImpl,iface); + FIXME("(%p): semi-stub\n", This); + return S_OK; } HRESULT WINAPI IDirectMusicPerformanceImpl_GetResolvedTime (LPDIRECTMUSICPERFORMANCE iface, REFERENCE_TIME rtTime, REFERENCE_TIME* prtResolved, DWORD dwTimeResolveFlags) @@ -358,6 +387,30 @@ ICOM_VTABLE(IDirectMusicPerformance) DirectMusicPerformance_Vtbl = IDirectMusicPerformanceImpl_RhythmToTime }; +HRESULT WINAPI DMUSIC_CreateDirectMusicPerformance (LPCGUID lpcGUID, LPDIRECTMUSICPERFORMANCE *ppDMPerf, LPUNKNOWN pUnkOuter) +{ + IDirectMusicPerformanceImpl *pPerf; + + TRACE("(%p,%p,%p)\n",lpcGUID, ppDMPerf, pUnkOuter); + + if (IsEqualGUID(lpcGUID, &IID_IDirectMusicPerformance)) + { + pPerf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicPerformanceImpl)); + if (NULL == pPerf) + { + *ppDMPerf = (LPDIRECTMUSICPERFORMANCE)NULL; + return E_OUTOFMEMORY; + } + + pPerf->lpVtbl = &DirectMusicPerformance_Vtbl; + pPerf->ref = 1; + *ppDMPerf = (LPDIRECTMUSICPERFORMANCE)pPerf; + return S_OK; + } + + WARN("No interface found\n"); + return E_NOINTERFACE; +} /* IDirectMusicPerformance8 IUnknown parts follow: */ HRESULT WINAPI IDirectMusicPerformance8Impl_QueryInterface (LPDIRECTMUSICPERFORMANCE8 iface, REFIID riid, LPVOID *ppobj) diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h index 4be1a4cc028..be0a36b1c0e 100644 --- a/dlls/dmusic/dmusic_private.h +++ b/dlls/dmusic/dmusic_private.h @@ -150,6 +150,9 @@ extern HRESULT WINAPI IDirectMusicImpl_Activate (LPDIRECTMUSIC iface, BOOL fEnab extern HRESULT WINAPI IDirectMusicImpl_GetDefaultPort (LPDIRECTMUSIC iface, LPGUID pguidPort); extern HRESULT WINAPI IDirectMusicImpl_SetDirectSound (LPDIRECTMUSIC iface, LPDIRECTSOUND pDirectSound, HWND hWnd); +/* ClassFactory */ +extern HRESULT WINAPI DMUSIC_CreateDirectMusic (LPCGUID lpcGUID, LPDIRECTMUSIC *ppDM, LPUNKNOWN pUnkOuter); + /***************************************************************************** * IDirectMusic8Impl implementation structure */ @@ -890,6 +893,8 @@ struct IDirectMusicPerformanceImpl DWORD ref; /* IDirectMusicPerformanceImpl fields */ + IDirectMusic *dmusic; + IDirectSound *dsound; }; /* IUnknown: */ @@ -939,6 +944,9 @@ extern HRESULT WINAPI IDirectMusicPerformanceImpl_MusicToMIDI (LPDIRECTMUSICPERF extern HRESULT WINAPI IDirectMusicPerformanceImpl_TimeToRhythm (LPDIRECTMUSICPERFORMANCE iface, MUSIC_TIME mtTime, DMUS_TIMESIGNATURE* pTimeSig, WORD* pwMeasure, BYTE* pbBeat, BYTE* pbGrid, short* pnOffset); extern HRESULT WINAPI IDirectMusicPerformanceImpl_RhythmToTime (LPDIRECTMUSICPERFORMANCE iface, WORD wMeasure, BYTE bBeat, BYTE bGrid, short nOffset, DMUS_TIMESIGNATURE* pTimeSig, MUSIC_TIME* pmtTime); +/* ClassFactory */ +extern HRESULT WINAPI DMUSIC_CreateDirectMusicPerformance (LPCGUID lpcGUID, LPDIRECTMUSICPERFORMANCE *ppDMPerf, LPUNKNOWN pUnkOuter); + /***************************************************************************** * IDirectMusicPerformance8Impl implementation structure */