|
|
// Copyright (c) 1998-1999 Microsoft Corporation
// DMSegObj.h : Declaration of the CSegment
#ifndef __DIRECTMUSICSONGOBJECT_H_
#define __DIRECTMUSICSONGOBJECT_H_
#include "dmusici.h"
#include "dmusicf.h"
#include "dmime.h"
#include "TrkList.h"
#include "dmgraph.h"
#include "dmsegobj.h"
#include "tlist.h"
#include "..\shared\dmusicp.h"
class CVirtualSegment : public AListItem { friend class CSong; friend class ComposingTrack; public: CVirtualSegment(); ~CVirtualSegment(); CVirtualSegment* GetNext() { return (CVirtualSegment*)AListItem::GetNext();} CTrack * GetTrackByParam( CTrack * pCTrack, REFGUID rguidType,DWORD dwGroupBits,DWORD dwIndex); private: CTrackList m_TrackList; // List of tracks that this segment uses.
CSegment * m_pSourceSegment; // Segment that is used as basis for this segment.
CSegment * m_pPlaySegment; // Resulting segment that will be played.
CGraph * m_pGraph; // Optional tool graph.
DWORD m_dwFlags; // Various control flags.
DWORD m_dwID; // Unique ID.
DWORD m_dwNextPlayID; // ID of next segment, to chain segments into a song.
DWORD m_dwNextPlayFlags; // DMUS_SEGF flags for playing next segment, when chaining a song.
DMUS_IO_SEGMENT_HEADER m_SegHeader; // Segment header, used to define the segment that it creates, or change the one it references.
MUSIC_TIME m_mtTime; // Start time of this segment.
DWORD m_dwTransitionCount;// How many transitions are defined.
DMUS_IO_TRANSITION_DEF *m_pTransitions; // Array of transitions from other segments.
WCHAR m_wszName[DMUS_MAX_NAME];// Name of generated segment.
};
class CVirtualSegmentList : public AList { public: void Clear(); void AddHead(CVirtualSegment* pVirtualSegment) { AList::AddHead((AListItem*)pVirtualSegment);} void Insert(CVirtualSegment* pVirtualSegment); CVirtualSegment* GetHead(){return (CVirtualSegment*)AList::GetHead();} CVirtualSegment* GetItem(LONG lIndex){return (CVirtualSegment*)AList::GetItem(lIndex);} CVirtualSegment* RemoveHead() { return (CVirtualSegment *)AList::RemoveHead();}; void Remove(CVirtualSegment* pVirtualSegment){AList::Remove((AListItem*)pVirtualSegment);} void AddTail(CVirtualSegment* pVirtualSegment){AList::AddTail((AListItem*)pVirtualSegment);} CVirtualSegment* GetTail(){ return (CVirtualSegment*)AList::GetTail();} };
class CSongSegment : public AListItem { public: CSongSegment(); ~CSongSegment(); CSongSegment* GetNext() { return (CSongSegment*)AListItem::GetNext();} CSegment * m_pSegment; DWORD m_dwLoadID; };
class CSongSegmentList : public AList { public: HRESULT AddSegment(CSegment *pSegment, DWORD dwLoadID); void Clear(); void AddHead(CSongSegment* pSongSegment) { AList::AddHead((AListItem*)pSongSegment);} void Insert(CSongSegment* pSongSegment); CSongSegment* GetHead(){return (CSongSegment*)AList::GetHead();} CSongSegment* GetItem(LONG lIndex){return (CSongSegment*)AList::GetItem(lIndex);} CSongSegment* RemoveHead() { return (CSongSegment *)AList::RemoveHead();}; void Remove(CSongSegment* pSongSegment){AList::Remove((AListItem*)pSongSegment);} void AddTail(CSongSegment* pSongSegment){AList::AddTail((AListItem*)pSongSegment);} CSongSegment* GetTail(){ return (CSongSegment*)AList::GetTail();} };
class CSong;
DEFINE_GUID(IID_CSong,0xb06c0c22, 0xd3c7, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
/////////////////////////////////////////////////////////////////////////////
// CSong
class CSong : public IDirectMusicSong, public IPersistStream, public IDirectMusicObject, public IDirectMusicObjectP { public: CSong(); ~CSong();
public: // IUnknown
STDMETHODIMP QueryInterface(const IID &iid, void **ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IDirectMusicSong
STDMETHODIMP Compose( ); STDMETHODIMP GetParam( REFGUID rguidType, DWORD dwGroupBits, DWORD dwIndex, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void* pParam) ; STDMETHODIMP GetSegment( WCHAR *wszName,IDirectMusicSegment **ppSegment) ; STDMETHODIMP EnumSegment( DWORD dwIndex,IDirectMusicSegment **ppSegment) ; STDMETHODIMP GetAudioPathConfig(IUnknown ** ppAudioPathConfig); STDMETHODIMP Download(IUnknown *pAudioPath); STDMETHODIMP Unload(IUnknown *pAudioPath);
// IPersist
STDMETHODIMP GetClassID( CLSID* pClsId );
// IPersistStream
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);
// IDirectMusicObjectP
STDMETHOD_(void, Zombie)();
public: HRESULT GetTransitionSegment(CSegment *pSource, CSegment *pDestination, DMUS_IO_TRANSITION_DEF *pTransDef); HRESULT GetPlaySegment( DWORD dwIndex,CSegment **ppSegment) ; private: void Clear(); HRESULT Instantiate() ; HRESULT LoadReferencedSegment(CSegment **ppSegment, CRiffParser *pParser); HRESULT LoadSegmentList(CRiffParser *pParser); HRESULT LoadGraphList(CRiffParser *pParser); HRESULT LoadVirtualSegmentList(CRiffParser *pParser); HRESULT LoadTrackRefList(CRiffParser *pParser, CVirtualSegment *pVirtualSegment); HRESULT LoadAudioPath(IStream *pStream);
void GetGraph(CGraph **ppGraph,DWORD dwGraphID); void GetSourceSegment(CSegment **ppSegment,DWORD dwSegmentID); BOOL GetSegmentTrack(IDirectMusicTrack **ppTrack,DWORD dwSegmentID,DWORD dwGroupBits,DWORD dwIndex,REFGUID guidClassID); CAudioPathConfig* m_pAudioPathConfig; // Optional audio path loaded from file.
CGraphList m_GraphList; // List of graphs for use by segments in the song.
CSongSegmentList m_SegmentList; // List of source segments.
CSegmentList m_PlayList; // List of composed segments.
CVirtualSegmentList m_VirtualSegmentList; // List of segment references. This is what is used to compose the finished song.
CRITICAL_SECTION m_CriticalSection; DWORD m_fPartialLoad; DWORD m_dwFlags; DWORD m_dwStartSegID; // ID of first segment, in play list, that should play.
long m_cRef; // 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. */ DWORD m_dwVersion; // Which version of the interfaces is the app requesting?
IUnknown * m_pUnkDispatch; // holds the controlling unknown of the scripting object that implements IDispatch
bool m_fZombie; };
struct CompositionComponent { CVirtualSegment* pVirtualSegment; // composing track came from here
CTrack* pComposingTrack; // used for composition
MUSIC_TIME mtTime; };
class ComposingTrack { public: ComposingTrack(); ~ComposingTrack(); DWORD GetTrackGroup() { return m_dwTrackGroup; } GUID GetTrackID() { return m_guidClassID; } DWORD GetPriority() { return m_dwPriority; } void SetPriority(DWORD dwPriority) { m_dwPriority = dwPriority; } void SetTrackGroup(DWORD dwTrackGroup) { m_dwTrackGroup = dwTrackGroup; } void SetTrackID(GUID& rguidClassID) { m_guidClassID = rguidClassID; } HRESULT AddTrack(CVirtualSegment* pVirtualSegment, CTrack* pTrack); HRESULT Compose(IDirectMusicSong* pSong); private: GUID m_guidClassID; // composing track's class id
DWORD m_dwTrackGroup; // track will be composed from these groups
DWORD m_dwPriority; // Track priority, to order the composition process.
TList<CompositionComponent> m_Components; // list of components making up the master
};
#endif //__DIRECTMUSICSONGOBJECT_H_
|