windows-nt/Source/XPSP1/NT/multimedia/directx/dmusic/dmscript/dmscript.h
2020-09-26 16:20:57 +08:00

151 lines
5.2 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;
};