180 lines
5.8 KiB
C++
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_
|