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

180 lines
5.8 KiB
C++

// 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<DMUS_IO_SEQ_ITEM>** apCurrentSeq; // array of size dwNumPChannels
TListItem<DMUS_IO_CURVE_ITEM>** 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<DMUS_IO_SEQ_ITEM> seqList;
TList<DMUS_IO_CURVE_ITEM> 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<DMUS_IO_SEQ_ITEM>*,
TListItem<DMUS_IO_CURVE_ITEM>*,
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<SEQ_PART>* FindPart( DWORD dwPChannel );
void DeleteSeqPartList(void);
void SetUpStateCurrentPointers(SeqStateData* pStateData);
// member variables
private:
TList<SEQ_PART> m_SeqPartList;
TListItem<SEQ_PART>* 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_