wine/dlls/dmsynth/dmsynth_main.c
2010-01-14 09:04:42 -06:00

372 lines
10 KiB
C

/* DirectMusicSynthesizer Main
*
* Copyright (C) 2003-2004 Rok Mandeljc
*
* 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
*/
#include "config.h"
#include "wine/port.h"
#include <stdio.h>
#include "dmsynth_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmsynth);
LONG DMSYNTH_refCount = 0;
typedef struct {
const IClassFactoryVtbl *lpVtbl;
} IClassFactoryImpl;
/******************************************************************
* DirectMusicSynth ClassFactory
*/
static HRESULT WINAPI SynthCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
FIXME("- no interface IID: %s\n", debugstr_guid(riid));
if (ppobj == NULL) return E_POINTER;
return E_NOINTERFACE;
}
static ULONG WINAPI SynthCF_AddRef(LPCLASSFACTORY iface) {
DMSYNTH_LockModule();
return 2; /* non-heap based object */
}
static ULONG WINAPI SynthCF_Release(LPCLASSFACTORY iface) {
DMSYNTH_UnlockModule();
return 1; /* non-heap based object */
}
static HRESULT WINAPI SynthCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *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) {
TRACE("(%d)\n", dolock);
if (dolock)
DMSYNTH_LockModule();
else
DMSYNTH_UnlockModule();
return S_OK;
}
static const IClassFactoryVtbl SynthCF_Vtbl = {
SynthCF_QueryInterface,
SynthCF_AddRef,
SynthCF_Release,
SynthCF_CreateInstance,
SynthCF_LockServer
};
static IClassFactoryImpl Synth_CF = {&SynthCF_Vtbl};
/******************************************************************
* DirectMusicSynthSink ClassFactory
*/
static HRESULT WINAPI SynthSinkCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
FIXME("- no interface IID: %s\n", debugstr_guid(riid));
if (ppobj == NULL) return E_POINTER;
return E_NOINTERFACE;
}
static ULONG WINAPI SynthSinkCF_AddRef(LPCLASSFACTORY iface) {
DMSYNTH_LockModule();
return 2; /* non-heap based object */
}
static ULONG WINAPI SynthSinkCF_Release(LPCLASSFACTORY iface) {
DMSYNTH_UnlockModule();
return 1; /* non-heap based object */
}
static HRESULT WINAPI SynthSinkCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *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) {
TRACE("(%d)\n", dolock);
if (dolock)
DMSYNTH_LockModule();
else
DMSYNTH_UnlockModule();
return S_OK;
}
static const IClassFactoryVtbl SynthSinkCF_Vtbl = {
SynthSinkCF_QueryInterface,
SynthSinkCF_AddRef,
SynthSinkCF_Release,
SynthSinkCF_CreateInstance,
SynthSinkCF_LockServer
};
static IClassFactoryImpl SynthSink_CF = {&SynthSinkCF_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 (DMSYNTH.@)
*
*
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
return DMSYNTH_refCount != 0 ? S_FALSE : S_OK;
}
/******************************************************************
* DllGetClassObject (DMSYNTH.@)
*
*
*/
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_DirectMusicSynth) && IsEqualIID (riid, &IID_IClassFactory)) {
*ppv = &Synth_CF;
IClassFactory_AddRef((IClassFactory*)*ppv);
return S_OK;
} else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSynth) && IsEqualIID (riid, &IID_IClassFactory)) {
*ppv = &SynthSink_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;
}
/******************************************************************
* Helper functions
*
*
*/
/* returns name of given GUID */
const char *debugstr_dmguid (const GUID *id) {
static const guid_info guids[] = {
/* CLSIDs */
GE(CLSID_AudioVBScript),
GE(CLSID_DirectMusic),
GE(CLSID_DirectMusicAudioPath),
GE(CLSID_DirectMusicAudioPathConfig),
GE(CLSID_DirectMusicAuditionTrack),
GE(CLSID_DirectMusicBand),
GE(CLSID_DirectMusicBandTrack),
GE(CLSID_DirectMusicChordMapTrack),
GE(CLSID_DirectMusicChordMap),
GE(CLSID_DirectMusicChordTrack),
GE(CLSID_DirectMusicCollection),
GE(CLSID_DirectMusicCommandTrack),
GE(CLSID_DirectMusicComposer),
GE(CLSID_DirectMusicContainer),
GE(CLSID_DirectMusicGraph),
GE(CLSID_DirectMusicLoader),
GE(CLSID_DirectMusicLyricsTrack),
GE(CLSID_DirectMusicMarkerTrack),
GE(CLSID_DirectMusicMelodyFormulationTrack),
GE(CLSID_DirectMusicMotifTrack),
GE(CLSID_DirectMusicMuteTrack),
GE(CLSID_DirectMusicParamControlTrack),
GE(CLSID_DirectMusicPatternTrack),
GE(CLSID_DirectMusicPerformance),
GE(CLSID_DirectMusicScript),
GE(CLSID_DirectMusicScriptAutoImpSegment),
GE(CLSID_DirectMusicScriptAutoImpPerformance),
GE(CLSID_DirectMusicScriptAutoImpSegmentState),
GE(CLSID_DirectMusicScriptAutoImpAudioPathConfig),
GE(CLSID_DirectMusicScriptAutoImpAudioPath),
GE(CLSID_DirectMusicScriptAutoImpSong),
GE(CLSID_DirectMusicScriptSourceCodeLoader),
GE(CLSID_DirectMusicScriptTrack),
GE(CLSID_DirectMusicSection),
GE(CLSID_DirectMusicSegment),
GE(CLSID_DirectMusicSegmentState),
GE(CLSID_DirectMusicSegmentTriggerTrack),
GE(CLSID_DirectMusicSegTriggerTrack),
GE(CLSID_DirectMusicSeqTrack),
GE(CLSID_DirectMusicSignPostTrack),
GE(CLSID_DirectMusicSong),
GE(CLSID_DirectMusicStyle),
GE(CLSID_DirectMusicStyleTrack),
GE(CLSID_DirectMusicSynth),
GE(CLSID_DirectMusicSynthSink),
GE(CLSID_DirectMusicSysExTrack),
GE(CLSID_DirectMusicTemplate),
GE(CLSID_DirectMusicTempoTrack),
GE(CLSID_DirectMusicTimeSigTrack),
GE(CLSID_DirectMusicWaveTrack),
GE(CLSID_DirectSoundWave),
/* IIDs */
GE(IID_IDirectMusic),
GE(IID_IDirectMusic2),
GE(IID_IDirectMusic8),
GE(IID_IDirectMusicAudioPath),
GE(IID_IDirectMusicBand),
GE(IID_IDirectMusicBuffer),
GE(IID_IDirectMusicChordMap),
GE(IID_IDirectMusicCollection),
GE(IID_IDirectMusicComposer),
GE(IID_IDirectMusicContainer),
GE(IID_IDirectMusicDownload),
GE(IID_IDirectMusicDownloadedInstrument),
GE(IID_IDirectMusicGetLoader),
GE(IID_IDirectMusicGraph),
GE(IID_IDirectMusicInstrument),
GE(IID_IDirectMusicLoader),
GE(IID_IDirectMusicLoader8),
GE(IID_IDirectMusicObject),
GE(IID_IDirectMusicPatternTrack),
GE(IID_IDirectMusicPerformance),
GE(IID_IDirectMusicPerformance2),
GE(IID_IDirectMusicPerformance8),
GE(IID_IDirectMusicPort),
GE(IID_IDirectMusicPortDownload),
GE(IID_IDirectMusicScript),
GE(IID_IDirectMusicSegment),
GE(IID_IDirectMusicSegment2),
GE(IID_IDirectMusicSegment8),
GE(IID_IDirectMusicSegmentState),
GE(IID_IDirectMusicSegmentState8),
GE(IID_IDirectMusicStyle),
GE(IID_IDirectMusicStyle8),
GE(IID_IDirectMusicSynth),
GE(IID_IDirectMusicSynth8),
GE(IID_IDirectMusicSynthSink),
GE(IID_IDirectMusicThru),
GE(IID_IDirectMusicTool),
GE(IID_IDirectMusicTool8),
GE(IID_IDirectMusicTrack),
GE(IID_IDirectMusicTrack8),
GE(IID_IUnknown),
GE(IID_IPersistStream),
GE(IID_IStream),
GE(IID_IClassFactory),
/* GUIDs */
GE(GUID_DirectMusicAllTypes),
GE(GUID_NOTIFICATION_CHORD),
GE(GUID_NOTIFICATION_COMMAND),
GE(GUID_NOTIFICATION_MEASUREANDBEAT),
GE(GUID_NOTIFICATION_PERFORMANCE),
GE(GUID_NOTIFICATION_RECOMPOSE),
GE(GUID_NOTIFICATION_SEGMENT),
GE(GUID_BandParam),
GE(GUID_ChordParam),
GE(GUID_CommandParam),
GE(GUID_CommandParam2),
GE(GUID_CommandParamNext),
GE(GUID_IDirectMusicBand),
GE(GUID_IDirectMusicChordMap),
GE(GUID_IDirectMusicStyle),
GE(GUID_MuteParam),
GE(GUID_Play_Marker),
GE(GUID_RhythmParam),
GE(GUID_TempoParam),
GE(GUID_TimeSignature),
GE(GUID_Valid_Start_Time),
GE(GUID_Clear_All_Bands),
GE(GUID_ConnectToDLSCollection),
GE(GUID_Disable_Auto_Download),
GE(GUID_DisableTempo),
GE(GUID_DisableTimeSig),
GE(GUID_Download),
GE(GUID_DownloadToAudioPath),
GE(GUID_Enable_Auto_Download),
GE(GUID_EnableTempo),
GE(GUID_EnableTimeSig),
GE(GUID_IgnoreBankSelectForGM),
GE(GUID_SeedVariations),
GE(GUID_StandardMIDIFile),
GE(GUID_Unload),
GE(GUID_UnloadFromAudioPath),
GE(GUID_Variations),
GE(GUID_PerfMasterTempo),
GE(GUID_PerfMasterVolume),
GE(GUID_PerfMasterGrooveLevel),
GE(GUID_PerfAutoDownload),
GE(GUID_DefaultGMCollection),
GE(GUID_Synth_Default),
GE(GUID_Buffer_Reverb),
GE(GUID_Buffer_EnvReverb),
GE(GUID_Buffer_Stereo),
GE(GUID_Buffer_3D_Dry),
GE(GUID_Buffer_Mono),
GE(GUID_DMUS_PROP_GM_Hardware),
GE(GUID_DMUS_PROP_GS_Capable),
GE(GUID_DMUS_PROP_GS_Hardware),
GE(GUID_DMUS_PROP_DLS1),
GE(GUID_DMUS_PROP_DLS2),
GE(GUID_DMUS_PROP_Effects),
GE(GUID_DMUS_PROP_INSTRUMENT2),
GE(GUID_DMUS_PROP_LegacyCaps),
GE(GUID_DMUS_PROP_MemorySize),
GE(GUID_DMUS_PROP_SampleMemorySize),
GE(GUID_DMUS_PROP_SamplePlaybackRate),
GE(GUID_DMUS_PROP_SetSynthSink),
GE(GUID_DMUS_PROP_SinkUsesDSound),
GE(GUID_DMUS_PROP_SynthSink_DSOUND),
GE(GUID_DMUS_PROP_SynthSink_WAVE),
GE(GUID_DMUS_PROP_Volume),
GE(GUID_DMUS_PROP_WavesReverb),
GE(GUID_DMUS_PROP_WriteLatency),
GE(GUID_DMUS_PROP_WritePeriod),
GE(GUID_DMUS_PROP_XG_Capable),
GE(GUID_DMUS_PROP_XG_Hardware)
};
unsigned int i;
if (!id) return "(null)";
for (i = 0; i < sizeof(guids)/sizeof(guids[0]); i++) {
if (IsEqualGUID(id, guids[i].guid))
return guids[i].name;
}
/* if we didn't find it, act like standard debugstr_guid */
return debugstr_guid(id);
}