|  | /* DirectMusicInteractiveEngine Main | 
|  | * | 
|  | * Copyright (C) 2003-2004 Rok Mandeljc | 
|  | * Copyright (C) 2003-2004 Raphael Junqueira | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of the GNU General Public License as published by | 
|  | * the Free Software Foundation; either version 2 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 Library General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 
|  | */ | 
|  |  | 
|  | #include "dmime_private.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(dmime); | 
|  |  | 
|  | LONG DMIME_refCount = 0; | 
|  |  | 
|  | typedef struct { | 
|  | const IClassFactoryVtbl *lpVtbl; | 
|  | } IClassFactoryImpl; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicPerformance ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI PerformanceCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI PerformanceCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI PerformanceCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI PerformanceCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicPerformanceImpl (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI PerformanceCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl PerformanceCF_Vtbl = { | 
|  | PerformanceCF_QueryInterface, | 
|  | PerformanceCF_AddRef, | 
|  | PerformanceCF_Release, | 
|  | PerformanceCF_CreateInstance, | 
|  | PerformanceCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl Performance_CF = {&PerformanceCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicSegment ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI SegmentCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SegmentCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SegmentCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SegmentCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicSegmentImpl (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SegmentCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl SegmentCF_Vtbl = { | 
|  | SegmentCF_QueryInterface, | 
|  | SegmentCF_AddRef, | 
|  | SegmentCF_Release, | 
|  | SegmentCF_CreateInstance, | 
|  | SegmentCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl Segment_CF = {&SegmentCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicSegmentState ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI SegmentStateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SegmentStateCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based objects */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SegmentStateCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SegmentStateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicSegmentStateImpl (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SegmentStateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl SegmentStateCF_Vtbl = { | 
|  | SegmentStateCF_QueryInterface, | 
|  | SegmentStateCF_AddRef, | 
|  | SegmentStateCF_Release, | 
|  | SegmentStateCF_CreateInstance, | 
|  | SegmentStateCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl SegmentState_CF = {&SegmentStateCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicGraph ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI GraphCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI GraphCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI GraphCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI GraphCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicGraphImpl (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI GraphCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl GraphCF_Vtbl = { | 
|  | GraphCF_QueryInterface, | 
|  | GraphCF_AddRef, | 
|  | GraphCF_Release, | 
|  | GraphCF_CreateInstance, | 
|  | GraphCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl Graph_CF = {&GraphCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicTempoTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI TempoTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI TempoTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI TempoTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI TempoTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicTempoTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI TempoTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl TempoTrackCF_Vtbl = { | 
|  | TempoTrackCF_QueryInterface, | 
|  | TempoTrackCF_AddRef, | 
|  | TempoTrackCF_Release, | 
|  | TempoTrackCF_CreateInstance, | 
|  | TempoTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl TempoTrack_CF = {&TempoTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicSeqTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI SeqTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SeqTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SeqTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SeqTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicSeqTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SeqTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl SeqTrackCF_Vtbl = { | 
|  | SeqTrackCF_QueryInterface, | 
|  | SeqTrackCF_AddRef, | 
|  | SeqTrackCF_Release, | 
|  | SeqTrackCF_CreateInstance, | 
|  | SeqTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl SeqTrack_CF = {&SeqTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicSysExTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI SysExTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SysExTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SysExTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SysExTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  | return DMUSIC_CreateDirectMusicSysExTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SysExTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl SysExTrackCF_Vtbl = { | 
|  | SysExTrackCF_QueryInterface, | 
|  | SysExTrackCF_AddRef, | 
|  | SysExTrackCF_Release, | 
|  | SysExTrackCF_CreateInstance, | 
|  | SysExTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl SysExTrack_CF = {&SysExTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicTimeSigTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI TimeSigTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI TimeSigTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI TimeSigTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI TimeSigTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicTimeSigTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI TimeSigTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl TimeSigTrackCF_Vtbl = { | 
|  | TimeSigTrackCF_QueryInterface, | 
|  | TimeSigTrackCF_AddRef, | 
|  | TimeSigTrackCF_Release, | 
|  | TimeSigTrackCF_CreateInstance, | 
|  | TimeSigTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl TimeSigTrack_CF = {&TimeSigTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicParamControlTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI ParamControlTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI ParamControlTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI ParamControlTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI ParamControlTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicParamControlTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI ParamControlTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl ParamControlTrackCF_Vtbl = { | 
|  | ParamControlTrackCF_QueryInterface, | 
|  | ParamControlTrackCF_AddRef, | 
|  | ParamControlTrackCF_Release, | 
|  | ParamControlTrackCF_CreateInstance, | 
|  | ParamControlTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl ParamControlTrack_CF = {&ParamControlTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicMarkerTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI MarkerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI MarkerTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI MarkerTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MarkerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicMarkerTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MarkerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl MarkerTrackCF_Vtbl = { | 
|  | MarkerTrackCF_QueryInterface, | 
|  | MarkerTrackCF_AddRef, | 
|  | MarkerTrackCF_Release, | 
|  | MarkerTrackCF_CreateInstance, | 
|  | MarkerTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl MarkerTrack_CF = {&MarkerTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicLyricsTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI LyricsTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI LyricsTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI LyricsTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI LyricsTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicLyricsTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI LyricsTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl LyricsTrackCF_Vtbl = { | 
|  | LyricsTrackCF_QueryInterface, | 
|  | LyricsTrackCF_AddRef, | 
|  | LyricsTrackCF_Release, | 
|  | LyricsTrackCF_CreateInstance, | 
|  | LyricsTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl LyricsTrack_CF = {&LyricsTrackCF_Vtbl}; | 
|  |  | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicSegTriggerTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI SegTriggerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SegTriggerTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI SegTriggerTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SegTriggerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicSegTriggerTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI SegTriggerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl SegTriggerTrackCF_Vtbl = { | 
|  | SegTriggerTrackCF_QueryInterface, | 
|  | SegTriggerTrackCF_AddRef, | 
|  | SegTriggerTrackCF_Release, | 
|  | SegTriggerTrackCF_CreateInstance, | 
|  | SegTriggerTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl SegTriggerTrack_CF = {&SegTriggerTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicAudioPath ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI AudioPathCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI AudioPathCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI AudioPathCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI AudioPathCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicAudioPathImpl (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI AudioPathCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl AudioPathCF_Vtbl = { | 
|  | AudioPathCF_QueryInterface, | 
|  | AudioPathCF_AddRef, | 
|  | AudioPathCF_Release, | 
|  | AudioPathCF_CreateInstance, | 
|  | AudioPathCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl AudioPath_CF = {&AudioPathCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DirectMusicWaveTrack ClassFactory | 
|  | */ | 
|  | static HRESULT WINAPI WaveTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { | 
|  | FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); | 
|  |  | 
|  | if (ppobj == NULL) return E_POINTER; | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI WaveTrackCF_AddRef(LPCLASSFACTORY iface) { | 
|  | DMIME_LockModule(); | 
|  |  | 
|  | return 2; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI WaveTrackCF_Release(LPCLASSFACTORY iface) { | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return 1; /* non-heap based object */ | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI WaveTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { | 
|  | TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); | 
|  |  | 
|  | return DMUSIC_CreateDirectMusicWaveTrack (riid, ppobj, pOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI WaveTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { | 
|  | TRACE("(%d)\n", dolock); | 
|  |  | 
|  | if (dolock) | 
|  | DMIME_LockModule(); | 
|  | else | 
|  | DMIME_UnlockModule(); | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static const IClassFactoryVtbl WaveTrackCF_Vtbl = { | 
|  | WaveTrackCF_QueryInterface, | 
|  | WaveTrackCF_AddRef, | 
|  | WaveTrackCF_Release, | 
|  | WaveTrackCF_CreateInstance, | 
|  | WaveTrackCF_LockServer | 
|  | }; | 
|  |  | 
|  | static IClassFactoryImpl WaveTrack_CF = {&WaveTrackCF_Vtbl}; | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DllMain | 
|  | * | 
|  | * | 
|  | */ | 
|  | BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { | 
|  | if (fdwReason == DLL_PROCESS_ATTACH) { | 
|  | DisableThreadLibraryCalls(hinstDLL); | 
|  | /* FIXME: Initialisation */ | 
|  | } | 
|  | else if (fdwReason == DLL_PROCESS_DETACH) { | 
|  | /* FIXME: Cleanup */ | 
|  | } | 
|  |  | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DllCanUnloadNow (DMIME.1) | 
|  | * | 
|  | * | 
|  | */ | 
|  | HRESULT WINAPI DllCanUnloadNow(void) | 
|  | { | 
|  | return DMIME_refCount != 0 ? S_FALSE : S_OK; | 
|  | } | 
|  |  | 
|  |  | 
|  | /****************************************************************** | 
|  | *		DllGetClassObject (DMIME.@) | 
|  | * | 
|  | * | 
|  | */ | 
|  | HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) | 
|  | { | 
|  | TRACE("(%s, %s, %p)\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv); | 
|  | if (IsEqualCLSID (rclsid, &CLSID_DirectMusicPerformance) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &Performance_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegment) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &Segment_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegmentState) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &SegmentState_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicGraph) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &Graph_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTempoTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &TempoTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSeqTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &SeqTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSysExTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &SysExTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTimeSigTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &TimeSigTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicParamControlTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &ParamControlTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicMarkerTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &MarkerTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicLyricsTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &LyricsTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegTriggerTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &SegTriggerTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicAudioPath) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &AudioPath_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicWaveTrack) && IsEqualIID (riid, &IID_IClassFactory)) { | 
|  | *ppv = (LPVOID) &WaveTrack_CF; | 
|  | IClassFactory_AddRef((IClassFactory*)*ppv); | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | WARN("(%s, %s, %p): no interface found.\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv); | 
|  | return CLASS_E_CLASSNOTAVAILABLE; | 
|  | } |