151 lines
5.3 KiB
C++
151 lines
5.3 KiB
C++
// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Declaration of CDirectMusicScript.
|
|
//
|
|
|
|
// CDirectMusicScript is the script object. A script object is loaded from a script file
|
|
// using the loader's GetObject method. A script file contains source code in VBScript
|
|
// or another activeX scripting language. Once loaded, the script object can be used
|
|
// to set and get the value of variables and to call routines inside the script. The
|
|
// script routines can in turn call DirectMusic's automation model (or any other
|
|
// IDispatch-based API's).
|
|
//
|
|
// This allows programmers to separate the application's core C++ code from the
|
|
// API calls that to manipulate the musical score. The application core loads
|
|
// scripts and calls routines at the appropriate times. Sound designers implement
|
|
// those routines using any activeX scripting language. The resulting scripts can
|
|
// be modified and auditioned without changing any code in the core application and
|
|
// without recompiling.
|
|
|
|
#pragma once
|
|
#include "scriptthread.h"
|
|
#include "containerdisp.h"
|
|
#include "dmusicf.h"
|
|
#include "..\shared\dmusicp.h"
|
|
#include "trackshared.h"
|
|
|
|
class CGlobalDispatch;
|
|
|
|
class CDirectMusicScript
|
|
: public IDirectMusicScript,
|
|
public IDirectMusicScriptPrivate,
|
|
public IPersistStream,
|
|
public IDirectMusicObject,
|
|
public IDirectMusicObjectP,
|
|
public IDispatch
|
|
{
|
|
friend class CGlobalDispatch;
|
|
|
|
public:
|
|
static HRESULT CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv);
|
|
|
|
// IUnknown
|
|
STDMETHOD(QueryInterface)(const IID &iid, void **ppv);
|
|
STDMETHOD_(ULONG, AddRef)();
|
|
STDMETHOD_(ULONG, Release)();
|
|
|
|
// IPersistStream functions (only Load is implemented)
|
|
STDMETHOD(GetClassID)(CLSID* pClassID) {return E_NOTIMPL;}
|
|
STDMETHOD(IsDirty)() {return S_FALSE;}
|
|
STDMETHOD(Load)(IStream* pStream);
|
|
STDMETHOD(Save)(IStream* pStream, BOOL fClearDirty) {return E_NOTIMPL;}
|
|
STDMETHOD(GetSizeMax)(ULARGE_INTEGER* pcbSize) {return E_NOTIMPL;}
|
|
|
|
// IDirectMusicObject
|
|
STDMETHOD(GetDescriptor)(LPDMUS_OBJECTDESC pDesc);
|
|
STDMETHOD(SetDescriptor)(LPDMUS_OBJECTDESC pDesc);
|
|
STDMETHOD(ParseDescriptor)(LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc);
|
|
|
|
// IDirectMusicObjectP
|
|
STDMETHOD_(void, Zombie)();
|
|
|
|
// IDirectMusicScript
|
|
STDMETHOD(Init)(IDirectMusicPerformance *pPerformance, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(CallRoutine)(WCHAR *pwszRoutineName, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(SetVariableVariant)(WCHAR *pwszVariableName, VARIANT varValue, BOOL fSetRef, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(GetVariableVariant)(WCHAR *pwszVariableName, VARIANT *pvarValue, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(SetVariableNumber)(WCHAR *pwszVariableName, LONG lValue, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(GetVariableNumber)(WCHAR *pwszVariableName, LONG *plValue, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(SetVariableObject)(WCHAR *pwszVariableName, IUnknown *punkValue, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(GetVariableObject)(WCHAR *pwszVariableName, REFIID riid, LPVOID FAR *ppv, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
STDMETHOD(EnumRoutine)(DWORD dwIndex, WCHAR *pwszName);
|
|
STDMETHOD(EnumVariable)(DWORD dwIndex, WCHAR *pwszName);
|
|
|
|
// IDirectMusicScriptPrivate
|
|
STDMETHOD(ScriptTrackCallRoutine)(
|
|
WCHAR *pwszRoutineName,
|
|
IDirectMusicSegmentState *pSegSt,
|
|
DWORD dwVirtualTrackID,
|
|
bool fErrorPMsgsEnabled,
|
|
__int64 i64IntendedStartTime,
|
|
DWORD dwIntendedStartTimeFlags);
|
|
|
|
// IDispatch
|
|
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo);
|
|
STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);
|
|
STDMETHOD(GetIDsOfNames)(
|
|
REFIID riid,
|
|
LPOLESTR __RPC_FAR *rgszNames,
|
|
UINT cNames,
|
|
LCID lcid,
|
|
DISPID __RPC_FAR *rgDispId);
|
|
STDMETHOD(Invoke)(
|
|
DISPID dispIdMember,
|
|
REFIID riid,
|
|
LCID lcid,
|
|
WORD wFlags,
|
|
DISPPARAMS __RPC_FAR *pDispParams,
|
|
VARIANT __RPC_FAR *pVarResult,
|
|
EXCEPINFO __RPC_FAR *pExcepInfo,
|
|
UINT __RPC_FAR *puArgErr);
|
|
|
|
// Methods that allow CActiveScriptManager access to private script interfaces
|
|
IDispatch *GetGlobalDispatch();
|
|
IDirectMusicPerformance8 *GetPerformance() { assert(m_pPerformance8); return m_pPerformance8; }
|
|
IDirectMusicLoader8P *GetLoader8P() { return m_pLoader8P; }
|
|
IDirectMusicComposer8 *GetComposer() { return m_pComposer8; }
|
|
const WCHAR *GetFilename() { return m_info.wstrFilename; }
|
|
|
|
private:
|
|
// Methods
|
|
|
|
CDirectMusicScript();
|
|
void ReleaseObjects();
|
|
|
|
// Data
|
|
|
|
CRITICAL_SECTION m_CriticalSection;
|
|
bool m_fCriticalSectionInitialized;
|
|
|
|
long m_cRef;
|
|
bool m_fZombie;
|
|
|
|
IDirectMusicPerformance8 *m_pPerformance8;
|
|
IDirectMusicLoader8P *m_pLoader8P; // NULL if loader doesn't support private interface. Use AddRefP/ReleaseP.
|
|
IDispatch *m_pDispPerformance;
|
|
IDirectMusicComposer8 *m_pComposer8;
|
|
|
|
// Standard object info
|
|
struct HeaderInfo
|
|
{
|
|
// Descriptor info
|
|
SmartRef::RiffIter::ObjectInfo oinfo;
|
|
SmartRef::WString wstrFilename;
|
|
bool fLoaded;
|
|
} m_info;
|
|
|
|
// Properties of the script
|
|
DMUS_IO_SCRIPT_HEADER m_iohead;
|
|
SmartRef::WString m_wstrLanguage;
|
|
DMUS_VERSION m_vDirectMusicVersion;
|
|
|
|
// Active Scripting
|
|
bool m_fUseOleAut;
|
|
ScriptManager *m_pScriptManager; // Reference-counted
|
|
|
|
CContainerDispatch *m_pContainerDispatch;
|
|
CGlobalDispatch *m_pGlobalDispatch;
|
|
bool m_fInitError;
|
|
DMUS_SCRIPT_ERRORINFO m_InitErrorInfo;
|
|
};
|