213 lines
10 KiB
C
213 lines
10 KiB
C
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
||
|
// DMSegObj.h : Declaration of the CSegment
|
||
|
|
||
|
#ifndef __DIRECTMUSICSEGMENTOBJECT_H_
|
||
|
#define __DIRECTMUSICSEGMENTOBJECT_H_
|
||
|
|
||
|
#include "dmusici.h"
|
||
|
#include "dmusicf.h"
|
||
|
#include "dmime.h"
|
||
|
|
||
|
#include "TrkList.h"
|
||
|
#include "ntfylist.h"
|
||
|
#include "dmsstobj.h"
|
||
|
#include "..\shared\dmusicp.h"
|
||
|
|
||
|
#define COMPOSE_TRANSITION1 (DMUS_TRACKCONFIG_TRANS1_FROMSEGSTART | DMUS_TRACKCONFIG_TRANS1_FROMSEGCURRENT | DMUS_TRACKCONFIG_TRANS1_TOSEGSTART)
|
||
|
|
||
|
class CSegment;
|
||
|
|
||
|
DEFINE_GUID(IID_CSegment,0xb06c0c21, 0xd3c7, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSegment
|
||
|
class CSegment :
|
||
|
public IDirectMusicSegment8,
|
||
|
public IDirectMusicSegment8P,
|
||
|
public IPersistStream,
|
||
|
public IDirectMusicObject,
|
||
|
public AListItem,
|
||
|
public IDirectMusicObjectP
|
||
|
{
|
||
|
friend class CPerformance;
|
||
|
friend class CSegState;
|
||
|
friend class CSong;
|
||
|
public:
|
||
|
CSegment();
|
||
|
CSegment(DMUS_IO_SEGMENT_HEADER *pHeader, CSegment *pSource);
|
||
|
~CSegment();
|
||
|
CSegment* GetNext() { return (CSegment*)AListItem::GetNext();}
|
||
|
|
||
|
public:
|
||
|
// IUnknown
|
||
|
STDMETHODIMP QueryInterface(const IID &iid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) AddRef();
|
||
|
STDMETHODIMP_(ULONG) Release();
|
||
|
// IDirectMusicSegment
|
||
|
STDMETHODIMP GetLength(MUSIC_TIME *pmtLength);
|
||
|
STDMETHODIMP SetLength(MUSIC_TIME pmtLength);
|
||
|
STDMETHODIMP GetRepeats(DWORD *pdwRepeats);
|
||
|
STDMETHODIMP SetRepeats(DWORD dwRepeats);
|
||
|
STDMETHODIMP GetDefaultResolution(DWORD *pdwResolution);
|
||
|
STDMETHODIMP SetDefaultResolution(DWORD dwResolution);
|
||
|
STDMETHODIMP GetTrack(REFCLSID rType,DWORD dwGroupBits,DWORD dwIndex,IDirectMusicTrack **ppTrack);
|
||
|
STDMETHODIMP GetTrackGroup(IDirectMusicTrack* pTrack,DWORD* pdwGroupBits);
|
||
|
STDMETHODIMP InsertTrack(IDirectMusicTrack *pTrack,DWORD dwGroupBits);
|
||
|
STDMETHODIMP RemoveTrack(IDirectMusicTrack *pTrack);
|
||
|
STDMETHODIMP InitPlay(IDirectMusicSegmentState **ppSegState,IDirectMusicPerformance *pPerformance,DWORD dwFlags);
|
||
|
STDMETHODIMP GetGraph(IDirectMusicGraph** ppGraph);
|
||
|
STDMETHODIMP SetGraph(IDirectMusicGraph* pGraph);
|
||
|
STDMETHODIMP AddNotificationType(REFGUID rguidNotification);
|
||
|
STDMETHODIMP RemoveNotificationType(REFGUID rguidNotification);
|
||
|
STDMETHODIMP GetParam(REFGUID rguidDataType,DWORD dwGroupBits,
|
||
|
DWORD dwIndex,MUSIC_TIME mtTime,
|
||
|
MUSIC_TIME* pmtNext,void* pData);
|
||
|
STDMETHODIMP SetParam(REFGUID rguidDataType,DWORD dwGroupBits,
|
||
|
DWORD dwIndex,MUSIC_TIME mtTime,void* pData);
|
||
|
STDMETHODIMP Clone(MUSIC_TIME mtStart,MUSIC_TIME mtEnd,IDirectMusicSegment** ppSegment);
|
||
|
STDMETHODIMP GetStartPoint(MUSIC_TIME* pmtStart);
|
||
|
STDMETHODIMP SetStartPoint(MUSIC_TIME mtStart);
|
||
|
STDMETHODIMP GetLoopPoints(MUSIC_TIME* pmtStart,MUSIC_TIME* pmtEnd);
|
||
|
STDMETHODIMP SetLoopPoints(MUSIC_TIME mtStart,MUSIC_TIME mtEnd);
|
||
|
STDMETHODIMP SetPChannelsUsed(DWORD dwNumPChannels,DWORD* paPChannels);
|
||
|
// IDirectMusicSegment8
|
||
|
STDMETHODIMP SetTrackConfig(REFGUID rguidTrackClassID,DWORD dwGroup, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) ;
|
||
|
STDMETHODIMP GetAudioPathConfig(IUnknown ** ppIAudioPathConfig);
|
||
|
STDMETHODIMP Compose(MUSIC_TIME mtTime,
|
||
|
IDirectMusicSegment* pFromSegment,
|
||
|
IDirectMusicSegment* pToSegment,
|
||
|
IDirectMusicSegment** ppComposedSegment);
|
||
|
STDMETHODIMP Download(IUnknown *pAudioPath);
|
||
|
STDMETHODIMP Unload(IUnknown *pAudioPath);
|
||
|
// IDirectMusicSegment8P
|
||
|
STDMETHODIMP GetObjectInPath(DWORD dwPChannel, /* PChannel to search. */
|
||
|
DWORD dwStage, /* Which stage in the path. */
|
||
|
DWORD dwBuffer,
|
||
|
REFGUID guidObject, /* ClassID of object. */
|
||
|
DWORD dwIndex, /* Which object of that class. */
|
||
|
REFGUID iidInterface,/* Requested COM interface. */
|
||
|
void ** ppObject) ; /* Pointer to interface. */
|
||
|
STDMETHODIMP GetHeaderChunk(
|
||
|
DWORD *pdwSize, /* Size of passed header chunk. Also, returns size written. */
|
||
|
DMUS_IO_SEGMENT_HEADER *pHeader); /* Header chunk to fill. */
|
||
|
STDMETHODIMP SetHeaderChunk(
|
||
|
DWORD dwSize, /* Size of passed header chunk. */
|
||
|
DMUS_IO_SEGMENT_HEADER *pHeader); /* Header chunk to fill. */
|
||
|
STDMETHODIMP SetTrackPriority(
|
||
|
REFGUID rguidTrackClassID, /* ClassID of Track. */
|
||
|
DWORD dwGroupBits, /* Group bits. */
|
||
|
DWORD dwIndex, /* Nth track. */
|
||
|
DWORD dwPriority); /* Priority to set. */
|
||
|
STDMETHODIMP SetAudioPathConfig(
|
||
|
IUnknown *pAudioPathConfig);
|
||
|
|
||
|
// 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);
|
||
|
|
||
|
HRESULT GetPChannels( DWORD* pdwNumPChannels, DWORD** ppaPChannels );
|
||
|
HRESULT CheckNotification( REFGUID );
|
||
|
|
||
|
// IDirectMusicObjectP
|
||
|
STDMETHOD_(void, Zombie)();
|
||
|
|
||
|
public:
|
||
|
HRESULT GetTrackConfig(REFGUID rguidTrackClassID,DWORD dwGroup, DWORD dwIndex, DWORD *pdwFlags) ;
|
||
|
HRESULT AddNotificationType(REFGUID rguidNotification, BOOL fFromPerformance);
|
||
|
HRESULT RemoveNotificationType(REFGUID rguidNotification, BOOL fFromPerformance);
|
||
|
BOOL IsTempoSource();
|
||
|
HRESULT CreateSegmentState(CSegState **ppSegState,CPerformance *pPerformance,
|
||
|
IDirectMusicAudioPath *pAudioPath, DWORD dwFlags);
|
||
|
CTrack *GetTrack(REFCLSID rType,DWORD dwGroupBits,DWORD dwIndex);
|
||
|
CTrack * GetTrackByParam(CTrack * pCTrack,REFGUID rguidType,DWORD dwGroupBits,DWORD dwIndex, BOOL fDontCheck);
|
||
|
HRESULT GetTrackByParam(REFGUID rgCommandGuid,DWORD dwGroupBits,
|
||
|
DWORD dwIndex,IDirectMusicTrack **ppTrack);
|
||
|
HRESULT LoadDirectMusicSegment(IStream* pIStream);
|
||
|
void AddNotificationTypeToAllTracks( REFGUID rguidNotification );
|
||
|
void RemoveNotificationTypeFromAllTracks( REFGUID rguidNotification );
|
||
|
CNotificationItem* FindNotification( REFGUID rguidNotification );
|
||
|
HRESULT LoadTrack(CRiffParser *pParser);
|
||
|
HRESULT CreateTrack(DMUS_IO_TRACK_HEADER& ioDMHdr, DWORD dwFlags, DWORD dwPriority, IStream *pStream);
|
||
|
HRESULT InsertTrack(IDirectMusicTrack *pTrack,DWORD dwGroupBits, DWORD dwFlags, DWORD dwPriority, DWORD dwPosition);
|
||
|
HRESULT LoadGraph(CRiffParser *pParser,CGraph **ppGraph);
|
||
|
HRESULT LoadAudioPath(IStream *pStream);
|
||
|
HRESULT ParseSegment(IStream* pIStream, LPDMUS_OBJECTDESC pDesc);
|
||
|
void Init();
|
||
|
HRESULT ComposeTransition(MUSIC_TIME mtTime,
|
||
|
IDirectMusicSegment* pFromSegment,
|
||
|
IDirectMusicSegment* pToSegment);
|
||
|
HRESULT ComposeInternal();
|
||
|
HRESULT SetClockTimeDuration(REFERENCE_TIME rtDuration);
|
||
|
HRESULT SetFlags(DWORD dwFlags);
|
||
|
void Clear(bool fZombie);
|
||
|
HRESULT MusicToReferenceTime(MUSIC_TIME mtTime, REFERENCE_TIME *prtTime);
|
||
|
HRESULT ReferenceToMusicTime(REFERENCE_TIME rtTime, MUSIC_TIME *pmtTime);
|
||
|
|
||
|
// Attributes
|
||
|
protected:
|
||
|
CRITICAL_SECTION m_CriticalSection;
|
||
|
DWORD m_dwRepeats; // # of times to repeat the segment. 0xffffffff is infinite
|
||
|
DWORD m_dwResolution; // the default resolution to start motifs and such.
|
||
|
DWORD m_dwSegFlags; // Flags loaded in with segment.
|
||
|
CTrackList m_TrackList; // list of Tracks held in this Segment
|
||
|
CAudioPathConfig* m_pAudioPathConfig; // Optional audio path loaded from file.
|
||
|
CGraph* m_pGraph; // Optional tool graph for segment.
|
||
|
CNotificationList m_NotificationList;
|
||
|
REFERENCE_TIME m_rtLength; // Optional length in reference time units.
|
||
|
MUSIC_TIME m_mtLength;
|
||
|
MUSIC_TIME m_mtStart;
|
||
|
MUSIC_TIME m_mtLoopStart;
|
||
|
MUSIC_TIME m_mtLoopEnd;
|
||
|
DWORD m_dwNumPChannels;
|
||
|
DWORD* m_paPChannels;
|
||
|
long m_cRef;
|
||
|
IUnknown * m_pUnkDispatch; // holds the controlling unknown of the scripting object that implements IDispatch
|
||
|
// 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?
|
||
|
|
||
|
bool m_fZombie;
|
||
|
|
||
|
public:
|
||
|
DWORD m_dwLoadID; // Identifier, used when loaded as part of a song.
|
||
|
CSong* m_pSong; // Optional parent song that segment belongs to. This is not AddRef'd.
|
||
|
DWORD m_dwPlayID; // ID of segment, if within a song.
|
||
|
DWORD m_dwNextPlayID; // ID of next segment, if within a song.
|
||
|
DWORD m_dwNextPlayFlags; // DMUS_SEGF flags for playing next segment, if within a song.
|
||
|
BOOL m_fPlayNext; // Whether the next segment should be played.
|
||
|
};
|
||
|
|
||
|
class CSegmentList : public AList
|
||
|
{
|
||
|
public:
|
||
|
void Clear();
|
||
|
void AddHead(CSegment* pSegment) { AList::AddHead((AListItem*)pSegment);}
|
||
|
void Insert(CSegment* pSegment);
|
||
|
BOOL IsMember(CSegment *pSegment) { return AList::IsMember((AListItem*)pSegment);}
|
||
|
CSegment* GetHead(){return (CSegment*)AList::GetHead();}
|
||
|
CSegment* GetItem(LONG lIndex){return (CSegment*)AList::GetItem(lIndex);}
|
||
|
CSegment* RemoveHead() {return (CSegment *) AList::RemoveHead();}
|
||
|
void Remove(CSegment* pSegment){AList::Remove((AListItem*)pSegment);}
|
||
|
void AddTail(CSegment* pSegment){AList::AddTail((AListItem*)pSegment);}
|
||
|
CSegment* GetTail(){ return (CSegment*)AList::GetTail();}
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif //__DIRECTMUSICSEGMENTOBJECT_H_
|