// Copyright (c) 1998-1999 Microsoft Corporation // SeqTrack.h : Declaration of the CSeqTrack #ifndef __SEQTRACK_H_ #define __SEQTRACK_H_ #include "dmusici.h" #include "dmusicf.h" #include "..\dmstyle\tlist.h" #include "PChMap.h" struct SeqStateData { DWORD dwPChannelsUsed; // number of PChannels // the following two arrays are allocated to the size of dwNumPChannels, which // must match the SeqTrack's m_dwPChannelsUsed. The arrays match one-for-one with // the parts inside the SeqTrack. TListItem** apCurrentSeq; // array of size dwNumPChannels TListItem** apCurrentCurve; // array of size dwNumPChannels DWORD dwValidate; MUSIC_TIME mtCurTimeSig; // time the current timesig started MUSIC_TIME mtNextTimeSig; // time for the next timesig DWORD dwMeasure; // starting measure # of the timesig DWORD dwlnBeat; // length of a beat DWORD dwlnMeasure; // length of a measure DWORD dwlnGrid; // length of a grid DWORD dwGroupBits; // the group bits of this track SeqStateData() { mtCurTimeSig = 0; mtNextTimeSig = 0; dwMeasure = 0; dwlnBeat = DMUS_PPQ; dwlnMeasure = DMUS_PPQ * 4; dwlnGrid = DMUS_PPQ / 4; apCurrentSeq = NULL; apCurrentCurve = NULL; } ~SeqStateData() { if( apCurrentSeq ) { delete [] apCurrentSeq; } if( apCurrentCurve ) { delete [] apCurrentCurve; } } }; // SEQ_PART represents all of the DMUS_PMSG's inside the SeqTrack for one PChannel struct SEQ_PART { SEQ_PART* pNext; DWORD dwPChannel; TList seqList; TList curveList; SEQ_PART() : pNext(NULL) {}; // always initialize pNext to NULL }; ///////////////////////////////////////////////////////////////////////////// // CSeqTrack class CSeqTrack : public IPersistStream, public IDirectMusicTrack8 { public: CSeqTrack(); CSeqTrack( const CSeqTrack& rTrack, MUSIC_TIME mtStart, MUSIC_TIME mtEnd); ~CSeqTrack(); public: // IUnknown STDMETHODIMP QueryInterface(const IID &iid, void **ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IDirectMusicTrack methods STDMETHODIMP IsParamSupported(REFGUID rguid); STDMETHODIMP Init(IDirectMusicSegment *pSegment); STDMETHODIMP InitPlay(IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance, void **ppStateData, DWORD dwTrackID, DWORD dwFlags); STDMETHODIMP EndPlay(void *pStateData); STDMETHODIMP Play(void *pStateData,MUSIC_TIME mtStart, MUSIC_TIME mtEnd,MUSIC_TIME mtOffset, DWORD dwFlags,IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt,DWORD dwVirtualID); STDMETHODIMP GetParam(REFGUID rguid,MUSIC_TIME mtTime,MUSIC_TIME* pmtNext,void *pData); STDMETHODIMP SetParam(REFGUID rguid,MUSIC_TIME mtTime,void *pData); STDMETHODIMP AddNotificationType(REFGUID rguidNotification); STDMETHODIMP RemoveNotificationType(REFGUID rguidNotification); STDMETHODIMP Clone(MUSIC_TIME mtStart,MUSIC_TIME mtEnd,IDirectMusicTrack** ppTrack); // IDirectMusicTrack8 STDMETHODIMP PlayEx(void* pStateData,REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd,REFERENCE_TIME rtOffset, DWORD dwFlags,IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt,DWORD dwVirtualID) ; STDMETHODIMP GetParamEx(REFGUID rguidType,REFERENCE_TIME rtTime, REFERENCE_TIME* prtNext,void* pParam,void * pStateData, DWORD dwFlags) ; STDMETHODIMP SetParamEx(REFGUID rguidType,REFERENCE_TIME rtTime,void* pParam, void * pStateData, DWORD dwFlags) ; STDMETHODIMP Compose(IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack) ; STDMETHODIMP Join(IDirectMusicTrack* pNewTrack, MUSIC_TIME mtJoin, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack) ; // 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 ); protected: HRESULT STDMETHODCALLTYPE Seek( IDirectMusicSegmentState*, IDirectMusicPerformance*, DWORD dwVirtualID, SeqStateData*, MUSIC_TIME mtTime, BOOL fGetPrevious, MUSIC_TIME mtOffset, REFERENCE_TIME rtOffset, BOOL fClockTime); void SendSeekItem( IDirectMusicPerformance*, IDirectMusicGraph*, IDirectMusicSegmentState*, SeqStateData* pSD, DWORD dwVirtualID, MUSIC_TIME mtTime, MUSIC_TIME mtOffset, REFERENCE_TIME rtOffset, TListItem*, TListItem*, BOOL fClockTime); HRESULT Play( void *pStateData, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID, BOOL fClockTime); void Construct(void); HRESULT LoadCurve( IStream* pIStream, long lSize ); HRESULT LoadSeq( IStream* pIStream, long lSize ); void UpdateTimeSig(IDirectMusicSegmentState*, SeqStateData* pSD, MUSIC_TIME mt); TListItem* FindPart( DWORD dwPChannel ); void DeleteSeqPartList(void); void SetUpStateCurrentPointers(SeqStateData* pStateData); // member variables private: TList m_SeqPartList; TListItem* m_pSeqPartCache; // used to time-optimize FindPart() DWORD m_dwPChannelsUsed; DWORD* m_aPChannels; long m_cRef; DWORD m_dwValidate; // used to validate state data CRITICAL_SECTION m_CrSec; BOOL m_fCSInitialized; CPChMap m_PChMap; }; #endif //__SEQTRACK_H_