|
|
// 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; };
|