TRACE("(%p) : AddRef from %ld\n", This, ref - 1);
+ DMBAND_LockModule();
+
return ref;
}
if (ref == 0) {
HeapFree(GetProcessHeap(), 0, This);
}
+
+ DMBAND_UnlockModule();
+
return ref;
}
TRACE("(%p) : AddRef from %ld\n", This, ref - 1);
+ DMBAND_LockModule();
+
return ref;
}
if (ref == 0) {
HeapFree(GetProcessHeap(), 0, This);
}
+
+ DMBAND_UnlockModule();
+
return ref;
}
WINE_DEFAULT_DEBUG_CHANNEL(dmband);
+LONG DMBAND_refCount = 0;
+
typedef struct {
- /* IUnknown fields */
IClassFactoryVtbl *lpVtbl;
- DWORD ref;
} IClassFactoryImpl;
/******************************************************************
*/
static HRESULT WINAPI BandCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %s, %p): stub\n",This, debugstr_dmguid(riid), ppobj);
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+
+ if (ppobj == NULL) return E_POINTER;
+
return E_NOINTERFACE;
}
static ULONG WINAPI BandCF_AddRef(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return InterlockedIncrement(&This->ref);
+ DMBAND_LockModule();
+
+ return 2; /* non-heap based object */
}
static ULONG WINAPI BandCF_Release(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- /* static class, won't be freed */
- return InterlockedDecrement(&This->ref);
+ DMBAND_UnlockModule();
+
+ return 1; /* non-heap based object */
}
static HRESULT WINAPI BandCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
+ TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
+
return DMUSIC_CreateDirectMusicBandImpl (riid, ppobj, pOuter);
}
static HRESULT WINAPI BandCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %d): stub\n", This, dolock);
+ TRACE("(%d)\n", dolock);
+
+ if (dolock)
+ DMBAND_LockModule();
+ else
+ DMBAND_UnlockModule();
+
return S_OK;
}
BandCF_LockServer
};
-static IClassFactoryImpl Band_CF = {&BandCF_Vtbl, 1 };
+static IClassFactoryImpl Band_CF = {&BandCF_Vtbl};
/******************************************************************
*/
static HRESULT WINAPI BandTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-
- FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+
+ if (ppobj == NULL) return E_POINTER;
+
return E_NOINTERFACE;
}
static ULONG WINAPI BandTrackCF_AddRef(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return InterlockedIncrement(&This->ref);
+ DMBAND_LockModule();
+
+ return 2; /* non-heap based object */
}
static ULONG WINAPI BandTrackCF_Release(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- /* static class, won't be freed */
- return InterlockedDecrement(&This->ref);
+ DMBAND_UnlockModule();
+
+ return 1; /* non-heap based object */
}
static HRESULT WINAPI BandTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
+ TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
+
return DMUSIC_CreateDirectMusicBandTrack (riid, ppobj, pOuter);
}
static HRESULT WINAPI BandTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %d): stub\n", This, dolock);
+ TRACE("(%d)\n", dolock);
+
+ if (dolock)
+ DMBAND_LockModule();
+ else
+ DMBAND_UnlockModule();
+
return S_OK;
}
BandTrackCF_LockServer
};
-static IClassFactoryImpl BandTrack_CF = {&BandTrackCF_Vtbl, 1 };
+static IClassFactoryImpl BandTrack_CF = {&BandTrackCF_Vtbl};
/******************************************************************
* DllMain
*
*/
HRESULT WINAPI DMBAND_DllCanUnloadNow(void) {
- FIXME("(void): stub\n");
- return S_FALSE;
+ return DMBAND_refCount != 0 ? S_FALSE : S_OK;
}
extern HRESULT WINAPI IDirectMusicBandTrack_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty);
extern HRESULT WINAPI IDirectMusicBandTrack_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize);
+/**********************************************************************
+ * Dll lifetime tracking declaration for dmband.dll
+ */
+extern LONG DMBAND_refCount;
+static inline void DMBAND_LockModule() { InterlockedIncrement( &DMBAND_refCount ); }
+static inline void DMBAND_UnlockModule() { InterlockedDecrement( &DMBAND_refCount ); }
/*****************************************************************************
* Misc.
WINE_DEFAULT_DEBUG_CHANNEL(dmsynth);
+LONG DMSYNTH_refCount = 0;
+
typedef struct {
- /* IUnknown fields */
IClassFactoryVtbl *lpVtbl;
- DWORD ref;
} IClassFactoryImpl;
/******************************************************************
* DirectMusicSynth ClassFactory
*/
static HRESULT WINAPI SynthCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+
+ if (ppobj == NULL) return E_POINTER;
+
return E_NOINTERFACE;
}
static ULONG WINAPI SynthCF_AddRef(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return InterlockedIncrement(&This->ref);
+ DMSYNTH_LockModule();
+
+ return 2; /* non-heap based object */
}
static ULONG WINAPI SynthCF_Release(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- /* static class, won't be freed */
- return InterlockedDecrement(&This->ref);
+ DMSYNTH_UnlockModule();
+
+ return 1; /* non-heap based object */
}
static HRESULT WINAPI SynthCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
+ TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
return DMUSIC_CreateDirectMusicSynthImpl (riid, ppobj, pOuter);
}
static HRESULT WINAPI SynthCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %d): stub\n", This, dolock);
+ TRACE("(%d)\n", dolock);
+
+ if (dolock)
+ DMSYNTH_LockModule();
+ else
+ DMSYNTH_UnlockModule();
+
return S_OK;
}
SynthCF_LockServer
};
-static IClassFactoryImpl Synth_CF = {&SynthCF_Vtbl, 1 };
+static IClassFactoryImpl Synth_CF = {&SynthCF_Vtbl};
/******************************************************************
* DirectMusicSynthSink ClassFactory
*/
static HRESULT WINAPI SynthSinkCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+
+ if (ppobj == NULL) return E_POINTER;
+
return E_NOINTERFACE;
}
static ULONG WINAPI SynthSinkCF_AddRef(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return InterlockedIncrement(&This->ref);
+ DMSYNTH_LockModule();
+
+ return 2; /* non-heap based object */
}
static ULONG WINAPI SynthSinkCF_Release(LPCLASSFACTORY iface) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- /* static class, won't be freed */
- return InterlockedDecrement(&This->ref);
+ DMSYNTH_UnlockModule();
+
+ return 1; /* non-heap based object */
}
static HRESULT WINAPI SynthSinkCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
+ TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
return DMUSIC_CreateDirectMusicSynthSinkImpl (riid, ppobj, pOuter);
}
static HRESULT WINAPI SynthSinkCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %d): stub\n", This, dolock);
+ TRACE("(%d)\n", dolock);
+
+ if (dolock)
+ DMSYNTH_LockModule();
+ else
+ DMSYNTH_UnlockModule();
+
return S_OK;
}
SynthSinkCF_LockServer
};
-static IClassFactoryImpl SynthSink_CF = {&SynthSinkCF_Vtbl, 1 };
+static IClassFactoryImpl SynthSink_CF = {&SynthSinkCF_Vtbl};
/******************************************************************
* DllMain
*
*/
HRESULT WINAPI DMSYNTH_DllCanUnloadNow(void) {
- FIXME("(void): stub\n");
- return S_FALSE;
+ return DMSYNTH_refCount != 0 ? S_FALSE : S_OK;
}
extern HRESULT WINAPI IDirectMusicSynthSinkImpl_SetDirectSound (LPDIRECTMUSICSYNTHSINK iface, LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer);
extern HRESULT WINAPI IDirectMusicSynthSinkImpl_GetDesiredBufferSize (LPDIRECTMUSICSYNTHSINK iface, LPDWORD pdwBufferSizeInSamples);
+/**********************************************************************
+ * Dll lifetime tracking declaration for dmsynth.dll
+ */
+extern LONG DMSYNTH_refCount;
+static inline void DMSYNTH_LockModule() { InterlockedIncrement( &DMSYNTH_refCount ); }
+static inline void DMSYNTH_UnlockModule() { InterlockedDecrement( &DMSYNTH_refCount ); }
/*****************************************************************************
* Misc.
TRACE("(%p)->(ref before=%lu)\n", This, refCount - 1);
+ DMSYNTH_LockModule();
+
return refCount;
}
if (!refCount) {
HeapFree(GetProcessHeap(), 0, This);
}
+
+ DMSYNTH_UnlockModule();
+
return refCount;
}
TRACE("(%p)->(ref before=%lu)\n", This, refCount - 1);
+ DMSYNTH_LockModule();
+
return refCount;
}
if (!refCount) {
HeapFree(GetProcessHeap(), 0, This);
}
+
+ DMSYNTH_UnlockModule();
+
return refCount;
}