//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (c) 1998-1999 Microsoft Corporation // // File: styletrk.h // //-------------------------------------------------------------------------- // StyleTrack.h : Declaration of the CStyleTrack #ifndef __STYLETRACK_H_ #define __STYLETRACK_H_ #include "PtrnTrk.h" #include "dmusici.h" #include "dmstylep.h" struct StyleTrackInfo : public PatternTrackInfo { StyleTrackInfo(); StyleTrackInfo(const StyleTrackInfo* pInfo, MUSIC_TIME mtStart, MUSIC_TIME mtEnd) : PatternTrackInfo(pInfo, mtStart, mtEnd) { m_dwPatternTag = DMUS_PATTERN_STYLE; } ~StyleTrackInfo(); virtual HRESULT STDMETHODCALLTYPE Init( /*[in]*/ IDirectMusicSegment* pSegment ); virtual HRESULT STDMETHODCALLTYPE InitPlay( /*[in]*/ IDirectMusicTrack* pParentrack, /*[in]*/ IDirectMusicSegmentState* pSegmentState, /*[in]*/ IDirectMusicPerformance* pPerformance, /*[out]*/ void** ppStateData, /*[in]*/ DWORD dwTrackID, /*[in]*/ DWORD dwFlags ); HRESULT LoadStyleRefList( IAARIFFStream* pIRiffStream, MMCKINFO* pckParent ); HRESULT LoadStyleRef( IAARIFFStream* pIRiffStream, MMCKINFO* pckParent ); HRESULT LoadReference(IStream *pStream, IAARIFFStream *pIRiffStream, MMCKINFO& ckParent, IDMStyle** ppStyle); }; ///////////////////////////////////////////////////////////////////////////// // CStyleTrack class CStyleTrack : public IDirectMusicTrack8, public IStyleTrack, public IPersistStream { friend struct StyleTrackState; public: CStyleTrack(); CStyleTrack(const CStyleTrack& rTrack, MUSIC_TIME mtStart, MUSIC_TIME mtEnd); ~CStyleTrack(); // IUnknown // virtual STDMETHODIMP QueryInterface(const IID &iid, void **ppv); virtual STDMETHODIMP_(ULONG) AddRef(); virtual STDMETHODIMP_(ULONG) Release(); // IStyleTrack public: // IStyleTrack Methods HRESULT STDMETHODCALLTYPE Init( /*[in]*/ IDirectMusicSegment* pSegment ); HRESULT STDMETHODCALLTYPE InitPlay( /*[in]*/ IDirectMusicSegmentState* pSegmentState, /*[in]*/ IDirectMusicPerformance* pPerformance, /*[out]*/ void** ppStateData, /*[in]*/ DWORD dwTrackID, /*[in]*/ DWORD dwFlags ); HRESULT STDMETHODCALLTYPE EndPlay( /*[in]*/ void* pStateData ); HRESULT STDMETHODCALLTYPE Play( /*[in]*/ void* pStateData, /*[in]*/ MUSIC_TIME mtStart, /*[in]*/ MUSIC_TIME mtEnd, /*[in]*/ MUSIC_TIME mtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegState, DWORD dwVirtualID ); HRESULT STDMETHODCALLTYPE GetPriority( /*[out]*/ DWORD* pPriority ); HRESULT STDMETHODCALLTYPE GetParam( REFGUID pCommandGuid, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void *pData); HRESULT STDMETHODCALLTYPE SetParam( /* [in] */ REFGUID pCommandGuid, /* [in] */ MUSIC_TIME mtTime, /* [out] */ void __RPC_FAR *pData); HRESULT STDMETHODCALLTYPE AddNotificationType( /* [in] */ REFGUID pGuidNotify ); HRESULT STDMETHODCALLTYPE RemoveNotificationType( /* [in] */ REFGUID pGuidNotify ); HRESULT STDMETHODCALLTYPE Clone( MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack** ppTrack); HRESULT STDMETHODCALLTYPE IsParamSupported( /*[in]*/ REFGUID pGuid ); // IDirectMusicTrack8 Methods 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 methods HRESULT STDMETHODCALLTYPE GetClassID( LPCLSID pclsid ); // IPersistStream methods HRESULT STDMETHODCALLTYPE IsDirty(); HRESULT STDMETHODCALLTYPE Save( LPSTREAM pStream, BOOL fClearDirty ); HRESULT STDMETHODCALLTYPE GetSizeMax( ULARGE_INTEGER* /*pcbSize*/ ); HRESULT STDMETHODCALLTYPE Load( LPSTREAM pStream ); // IStyleTrack methods STDMETHOD(GetStyle)(IUnknown** ppStyle); STDMETHOD(SetTrack)(IUnknown* pStyle); // internal methods protected: // used by both GetParam and GetParamEx HRESULT STDMETHODCALLTYPE GetParam( REFGUID pCommandGuid, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void *pData, void* pStateData); HRESULT JoinInternal( IDirectMusicTrack* pNewTrack, MUSIC_TIME mtJoin, DWORD dwTrackGroup); // IStyleTrack data members protected: // attributes long m_cRef; CRITICAL_SECTION m_CriticalSection; // for load and playback BOOL m_fCSInitialized; PatternTrackInfo* m_pTrackInfo; BYTE m_bRequiresSave; }; struct StyleTrackState : public PatternTrackState { StyleTrackState(); ~StyleTrackState(); // methods HRESULT Play( /*[in]*/ MUSIC_TIME mtStart, /*[in]*/ MUSIC_TIME mtEnd, /*[in]*/ MUSIC_TIME mtOffset, REFERENCE_TIME rtOffset, IDirectMusicPerformance* pPerformance, DWORD dwFlags, BOOL fClockTime ); HRESULT GetNextPattern(DWORD dwFlags, MUSIC_TIME mtNow, MUSIC_TIME mtOffset, IDirectMusicPerformance* pPerformance, BOOL fSkipVariations = FALSE); MUSIC_TIME PartOffset(int nPartIndex); //CDirectMusicPattern* SelectPattern(bool fNewMode, TList& rPatternList); // attributes MUSIC_TIME m_mtSectionOffset; // Elapsed time in the section MUSIC_TIME m_mtSectionOffsetTemp; // temporary value for m_mtSectionOffset MUSIC_TIME m_mtNextCommandTime; // when the next command begins MUSIC_TIME m_mtNextCommandTemp; // temporary values for m_mtNextCommandTime MUSIC_TIME m_mtNextStyleTime; // when the next style begins DMUS_COMMAND_PARAM_2 m_CommandData; // data about the current command // DMUS_RHYTHM_PARAM* m_pChordRhythm; // data about the current chord's rhythm // short m_nLongestPattern; // length of longest pattern in a style // DMUS_COMMAND_PARAM_2* m_pCommands; // array of commands (for pattern selection) // DWORD* m_pRhythms; // array of rhythms (for pattern selection) MUSIC_TIME m_mtOverlap; // section overlap caused by controlling segment TList m_PlayedPatterns; // list of patterns already played that match current groove level }; #endif //__STYLETRACK_H_