// Copyright (c) 1998-1999 Microsoft Corporation // DMGraph.h : Declaration of the CGraph #ifndef __DMGRAPH_H_ #define __DMGRAPH_H_ #include "alist.h" #include "dmusici.h" #include "dmusicf.h" class CRiffParser; class CToolRef : public AListItem { public: CToolRef() { m_fSupportsClone = FALSE; m_pTool = NULL; m_dwQueue = 0; m_dwMTArraySize = 0; m_dwPCArraySize = 0; m_pdwMediaTypes = NULL; m_pdwPChannels = NULL; m_guidClassID = GUID_NULL; }; // the memory for pdwTracks and pidType better have been allocated with // something compatible with delete!!! ~CToolRef() { if( m_pdwPChannels ) { delete [] m_pdwPChannels; } if( m_pdwMediaTypes ) { delete [] m_pdwMediaTypes; } if( m_pTool ) { m_pTool->Release(); } }; CToolRef* GetNext() { return (CToolRef*)AListItem::GetNext(); }; GUID m_guidClassID; // Class ID of tool. BOOL m_fSupportsClone; // Indicates this is a DX8 tool with support for cloning. IDirectMusicTool* m_pTool; DWORD m_dwQueue; // type of queue the tool wants messages to be DWORD m_dwMTArraySize; // size of the pdwMediaTypes array DWORD* m_pdwMediaTypes; // types of media the tool supports DWORD m_dwPCArraySize; // size of the pdwPChannels array DWORD* m_pdwPChannels; // array of PChannel id's - messages stamped with these id's are // sent to the tool }; class CGraph; //#undef INTERFACE //#define INTERFACE IGraphClone DECLARE_INTERFACE_(IGraphClone, IUnknown) { /* IUnknown */ STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; /* IGraphClone */ STDMETHOD(Clone) (THIS_ IDirectMusicGraph **ppGraph) PURE; }; DEFINE_GUID(IID_CGraph,0xb06c0c24, 0xd3c7, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); DEFINE_GUID(IID_IGraphClone,0xb06c0c27, 0xd3c7, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); ///////////////////////////////////////////////////////////////////////////// // CGraph class CGraph : public IDirectMusicGraph8, public IPersistStream, public IDirectMusicObject, public IGraphClone, public AList, public AListItem { public: CGraph(); ~CGraph(); CToolRef* GetHead(){return (CToolRef*)AList::GetHead();}; CToolRef* RemoveHead(){return (CToolRef*)AList::RemoveHead();}; CToolRef* GetItem(LONG lIndex){return (CToolRef*) AList::GetItem(lIndex);}; CGraph* GetNext() { return (CGraph*)AListItem::GetNext();} public: // IUnknown STDMETHODIMP QueryInterface(const IID &iid, void **ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IDirectMusicGraph STDMETHODIMP InsertTool(IDirectMusicTool *pTool,DWORD *pdwPChannels,DWORD cPChannels,LONG lIndex); STDMETHODIMP GetTool(DWORD dwPosition,IDirectMusicTool** ppTool); STDMETHODIMP RemoveTool(IDirectMusicTool* pTool); STDMETHODIMP StampPMsg(DMUS_PMSG* pPMsg); // IGraphClone STDMETHODIMP Clone(IDirectMusicGraph **ppGraph); // IPersist functions STDMETHODIMP GetClassID( CLSID* pClsId ); // IPersistStream functions STDMETHODIMP IsDirty(); STDMETHODIMP Load( IStream* pIStream ); STDMETHODIMP Save( IStream* pIStream, BOOL fClearDirty ); STDMETHODIMP GetSizeMax( ULARGE_INTEGER FAR* pcbSize ); // IDirectMusicObject STDMETHODIMP GetDescriptor(LPDMUS_OBJECTDESC pDesc); STDMETHODIMP SetDescriptor(LPDMUS_OBJECTDESC pDesc); STDMETHODIMP ParseDescriptor(LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc); HRESULT GetObjectInPath( DWORD dwPChannel,REFGUID guidObject, DWORD dwIndex,REFGUID iidInterface, void ** ppObject); HRESULT Load(CRiffParser *pParser); protected: HRESULT BuildToolList(CRiffParser *pParser); HRESULT LoadTool(CRiffParser *pParser); HRESULT CreateTool(DMUS_IO_TOOL_HEADER ioDMToolHdr, IStream *pStream, DWORD *pdwPChannels); HRESULT STDMETHODCALLTYPE Shutdown(); HRESULT InsertTool(IDirectMusicTool *pTool,DWORD *pdwPChannels, DWORD cPChannels,LONG lIndex, GUID *pguidClassID); inline BOOL CheckType( DWORD dwType, CToolRef* pToolRef ); protected: CRITICAL_SECTION m_CrSec; long m_cRef; // DWORD m_fPartialLoad; // IDirectMusicObject variables DWORD m_dwValidData; GUID m_guidObject; FILETIME m_ftDate; /* Last edited date of object. */ DMUS_VERSION m_vVersion; /* Version. */ WCHAR m_wszName[DMUS_MAX_NAME]; /* Name of object. */ WCHAR m_wszCategory[DMUS_MAX_CATEGORY]; /* Category for object */ WCHAR m_wszFileName[DMUS_MAX_FILENAME]; /* File path. */ public: DWORD m_dwLoadID; // Identifier, used when loaded as part of a song. }; class CGraphList : public AList { public: void Clear(); void AddHead(CGraph* pGraph) { AList::AddHead((AListItem*)pGraph);} void Insert(CGraph* pGraph); CGraph* GetHead(){return (CGraph*)AList::GetHead();} CGraph* GetItem(LONG lIndex){return (CGraph*)AList::GetItem(lIndex);} CGraph* RemoveHead() {return (CGraph *) AList::RemoveHead();} void Remove(CGraph* pGraph){AList::Remove((AListItem*)pGraph);} void AddTail(CGraph* pGraph){AList::AddTail((AListItem*)pGraph);} CGraph* GetTail(){ return (CGraph*)AList::GetTail();} }; #endif //__DMGRAPH_H_