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

307 lines
13 KiB
C++

// Copyright (c) 1998-1999 Microsoft Corporation
// DMSStObj.h : Declaration of the CSegState
#ifndef __AUDIOPATH_H_
#define __AUDIOPATH_H_
#include "dmusici.h"
#include "dmusicf.h"
#include "TrkList.h"
#include "alist.h"
#include "..\shared\dmstrm.h"
#include "dmscriptautguids.h"
#include "..\shared\dmusiccp.h"
class CPerformance;
class CSegState;
class CGraph;
class CAudioPathConfig;
class CBufferConfig;
struct IDirectSoundConnect;
class CBufferNode : public AListItem
{
friend class CBufferManager;
friend class CAudioPath;
public:
CBufferNode();
~CBufferNode();
ULONG AddRef();
ULONG Release();
IDirectSoundBuffer *GetBuffer() { if (m_pBuffer) m_pBuffer->AddRef(); return m_pBuffer;}
HRESULT Activate(BOOL fActivate);
private:
void FinalDeactivate();
CBufferNode* GetNext() { return (CBufferNode*)AListItem::GetNext();}
IDirectSoundBuffer * m_pBuffer; // DSound buffer that this manages.
DMUS_IO_BUFFER_ATTRIBUTES_HEADER m_BufferHeader; // GUID that identifies this buffer and flags (can it be shared?).
CBufferManager * m_pManager; // Pointer to parent list.
long m_lActivateCount; // How many times this has been activated.
long m_cRef; // How many objects point at this.
};
class CBufferManager : public AList
{
public:
CBufferManager();
~CBufferManager() ;
HRESULT Init(CPerformance *pPerf, DMUS_AUDIOPARAMS *pAudioParams) ;
HRESULT InitSink();
void AddHead(CBufferNode* pBufferNode) { AList::AddHead((AListItem*)pBufferNode);}
CBufferNode* GetHead(){return (CBufferNode*)AList::GetHead();}
CBufferNode* RemoveHead() {return (CBufferNode *) AList::RemoveHead();}
void Remove(CBufferNode* pBufferNode){AList::Remove((AListItem*)pBufferNode);}
void AddTail(CBufferNode* pBufferNode){AList::AddTail((AListItem*)pBufferNode);}
void Clear();
void FinalDeactivate();
CBufferNode * GetBufferNode(REFGUID guidBufferID);
HRESULT CreateBuffer(CBufferConfig *pConfig, CBufferConfig **pNew);
private:
CPerformance *m_pPerf; // Pointer to parent performance.
CBufferConfig *m_pFirstBuffer; // Actual buffer created by config.
public:
IDirectSoundConnect* m_pSinkConnect; // The sink object which manages creation of buffers in dsound.
IDirectSoundSynthSink *m_pSynthSink; // Used to activate sink.
DMUS_AUDIOPARAMS m_AudioParams;
};
#define BUFFER_REVERB 1
#define BUFFER_ENVREVERB 2
#define BUFFER_3D 3
#define BUFFER_3D_DRY 4
#define BUFFER_MONO 6
#define BUFFER_STEREO 7
#define BUFFER_MUSIC 8
DEFINE_GUID(GUID_Buffer_Primary,0x186cc544, 0xdb29, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74);
#define DMUS_BUFFERF_PRIMARY 4 // This buffer flag is a private definition.
#define DMUS_STANDARD_PATH_DX7 20 // This is for internal use only.
#define MAX_CONNECTIONS 32 // Maximum of 32 buffers connected to one PChannel.
class CBufferConfig : public AListItem
{
public:
CBufferConfig(DWORD dwType) ;
~CBufferConfig();
void DecideType(); // Looks at embedded GUID and infers default type, if one exists.
HRESULT Load(IStream *pStream);
CBufferConfig* GetNext() { return (CBufferConfig*)AListItem::GetNext();}
IUnknown * m_pBufferConfig; // Buffer definition.
CBufferNode * m_pBufferNode; // Manages the DSound buffer.
DMUS_IO_BUFFER_ATTRIBUTES_HEADER m_BufferHeader; // GUID that identifies this buffer and flags.
DWORD m_dwStandardBufferID;// Optionally, one of the standard buffer types.
HRESULT Activate(BOOL fActivate);
};
class CBufferConfigList : public AList
{
public:
void AddHead(CBufferConfig* pBufferConfig) { AList::AddHead((AListItem*)pBufferConfig);}
CBufferConfig* GetHead(){return (CBufferConfig*)AList::GetHead();}
CBufferConfig* RemoveHead() {return (CBufferConfig *) AList::RemoveHead();}
void Remove(CBufferConfig* pBufferConfig){AList::Remove((AListItem*)pBufferConfig);}
void AddTail(CBufferConfig* pBufferConfig){AList::AddTail((AListItem*)pBufferConfig);}
void Clear();
CBufferNode * GetBufferNode(REFGUID guidBufferID);
HRESULT CreateRunTimeVersion(CBufferConfigList *pCopy, CBufferManager *pManager);
HRESULT Activate(BOOL fActivate);
};
class CPortConfig;
class CBufferConnect : public AListItem
{
public:
CBufferConnect() ;
~CBufferConnect();
CBufferConnect *CreateRunTimeVersion(CPortConfig *pParent);
HRESULT Load(CRiffParser *pParser);
CBufferConnect* GetNext() { return (CBufferConnect*)AListItem::GetNext();}
DMUS_IO_PCHANNELTOBUFFER_HEADER m_ConnectHeader;
GUID * m_pguidBufferIDs;// Set of guids identifying buffers to connect to.
CBufferNode ** m_ppBufferNodes; // Array of equivalent Buffer nodes.
};
class CBufferConnectList : public AList
{
public:
void AddHead(CBufferConnect* pBufferConnect) { AList::AddHead((AListItem*)pBufferConnect);}
CBufferConnect* GetHead(){return (CBufferConnect*)AList::GetHead();}
CBufferConnect* RemoveHead() {return (CBufferConnect *) AList::RemoveHead();}
void Remove(CBufferConnect* pBufferConnect){AList::Remove((AListItem*)pBufferConnect);}
void AddTail(CBufferConnect* pBufferConnect){AList::AddTail((AListItem*)pBufferConnect);}
HRESULT CreateRunTimeVersion(CBufferConnectList *pDestination, CPortConfig *pParent);
void Clear();
};
class CAudioPath;
class CPortConfig : public AListItem
{
public:
CPortConfig() ;
~CPortConfig();
HRESULT CreateRunTimeVersion(CPortConfig ** ppCopy, CAudioPath *pParent,CBufferManager *pManager);
CPortConfig* GetNext() { return (CPortConfig*)AListItem::GetNext();}
CBufferNode * GetBufferNode(REFGUID guidBuffer);
HRESULT Activate(BOOL fActivate);
HRESULT CPortConfig::Load(CRiffParser *pParser);
DMUS_IO_PORTCONFIG_HEADER m_PortHeader; // Port configuration header, from file.
DMUS_PORTPARAMS8 m_PortParams; // Port params for opening the port, also from file.
DWORD m_dwPortID; // Used to track the index of a created port, once connecting.
CBufferConnectList m_BufferConnectList; // Pchannel to buffer mappings.
CBufferConfigList m_BufferConfigList; // List of dsound buffer configurations.
CAudioPath * m_pParent; // Parent audio path.
IDirectMusicPort * m_pPort; // Pointer to port, if run time version.
BOOL m_fAlreadyHere; // Check for recursive case looking for buffer nodes.
};
class CPortConfigList : public AList
{
public:
void AddHead(CPortConfig* pPortConfig) { AList::AddHead((AListItem*)pPortConfig);}
CPortConfig* GetHead(){return (CPortConfig*)AList::GetHead();}
CPortConfig* RemoveHead() {return (CPortConfig *) AList::RemoveHead();}
void Remove(CPortConfig* pPortConfig){AList::Remove((AListItem*)pPortConfig);}
void AddTail(CPortConfig* pPortConfig){AList::AddTail((AListItem*)pPortConfig);}
HRESULT CreateRunTimeVersion(CPortConfigList *pDestination,CAudioPath *pParent,CBufferManager *pManager);
void Clear();
HRESULT Activate(BOOL fActivate);
BOOL UsesPort(IDirectMusicPort *pPort);
};
class CAudioPath;
DEFINE_GUID(IID_CAudioPath,0xb06c0c23, 0xd3c7, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
/* The AudioPath represents a configuration of pchannels, ports, and buffers to play
segments. The performance creates CAudioPath objects from CAudioPathConfig file
objects and stores them in a linked list, which it uses to keep track of them.
*/
class CAudioPath :
public IDirectMusicAudioPath,
public IDirectMusicGraph,
public AListItem
{
public:
CAudioPath();
~CAudioPath();
CAudioPath* GetNext() { return (CAudioPath*)AListItem::GetNext();}
// IUnknown
STDMETHODIMP QueryInterface(const IID &iid, void **ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IDirectMusicAudioPath
STDMETHODIMP GetObjectInPath( DWORD dwPChannel,DWORD dwStage,DWORD dwBuffer, REFGUID guidObject,
DWORD dwIndex,REFGUID iidInterface, void ** ppObject);
STDMETHODIMP Activate(BOOL fActivate) ;
STDMETHODIMP SetVolume(long lVolume,DWORD dwDuration) ;
STDMETHODIMP ConvertPChannel( DWORD dwPChannelIn,DWORD *pdwPChannelOut) ;
// IDirectMusicGraph
STDMETHODIMP Shutdown();
STDMETHODIMP InsertTool(IDirectMusicTool *pTool,DWORD *pdwPChannels,DWORD cPChannels,LONG lIndex);
STDMETHODIMP GetTool(DWORD,IDirectMusicTool**);
STDMETHODIMP RemoveTool(IDirectMusicTool*);
STDMETHODIMP StampPMsg(DMUS_PMSG* pEvent);
HRESULT Init(IUnknown *pSourceConfig,CPerformance *pPerf);
HRESULT ConnectToPorts(CPerformance *pPerf,DWORD dwSampleRate);
CBufferNode * GetBufferNode(REFGUID guidBuffer);
void SetGraph(CGraph *pGraph);
CGraph *GetGraph();
void Deactivate();
BOOL IsActive() { return m_fActive; }
BOOL NoPorts() { return m_PortConfigList.IsEmpty(); }
BOOL UsesPort(IDirectMusicPort *pPort) { return m_PortConfigList.UsesPort(pPort); }
private:
BOOL m_fDeactivating; // State variable.
BYTE m_bLastVol; // Last volume change.
CRITICAL_SECTION m_CriticalSection;
BOOL m_fActive; // Indicates that the audio path is active.
long m_cRef; // Reference counter.
DWORD * m_pdwVChannels; // Array of source VChannels.
DWORD * m_pdwPChannels; // Array of destination PChannels.
DWORD m_dwChannelCount; // Size of arrays.
CGraph * m_pGraph; // Route tool graph.
CPerformance * m_pPerformance; // Pointer to performance, needed to release PChannels.
CAudioPathConfig * m_pConfig; // Source configuration.
CPortConfigList m_PortConfigList; // List of port definitions (copied from source.)
CBufferConfigList m_BufferConfigList; // List of DSound buffers connected to the ports.
IUnknown * m_pUnkDispatch; // holds the controlling unknown of the scripting object that implements IDispatch
};
class CAudioPathList : public AList
{
public:
void Clear();
void AddHead(CAudioPath* pAudioPath) { AList::AddHead((AListItem*)pAudioPath);}
CAudioPath* GetHead(){return (CAudioPath*)AList::GetHead();}
CAudioPath* RemoveHead() {return (CAudioPath *) AList::RemoveHead();}
void Remove(CAudioPath* pAudioPath){AList::Remove((AListItem*)pAudioPath);}
void AddTail(CAudioPath* pAudioPath){AList::AddTail((AListItem*)pAudioPath);}
BOOL IsMember(CAudioPath* pAudioPath){return AList::IsMember((AListItem*)pAudioPath);}
BOOL UsesPort(IDirectMusicPort *pPort);
CBufferNode * GetBufferNode(REFGUID guidBufferID);
};
DEFINE_GUID(IID_CAudioPathConfig,0xe9874261, 0xab52, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
class CAudioPathConfig :
public IPersistStream,
public IDirectMusicObject
{
friend class CAudioPath;
public:
CAudioPathConfig();
~CAudioPathConfig();
static CAudioPathConfig *CreateStandardConfig(DWORD dwType,DWORD dwPChannelCount,DWORD dwSampleRate);
// IUnknown
STDMETHODIMP QueryInterface(const IID &iid, void **ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// 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 );
// IDirectMusicObject
STDMETHODIMP GetDescriptor(LPDMUS_OBJECTDESC pDesc);
STDMETHODIMP SetDescriptor(LPDMUS_OBJECTDESC pDesc);
STDMETHODIMP ParseDescriptor(LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc);
HRESULT Load( CRiffParser *pParser);
protected:
CGraph * m_pGraph; // Audio path tool graph.
CPortConfigList m_PortConfigList; // List of port definitions.
CBufferConfigList m_BufferConfigList; // List of global dsound buffer configurations.
CRITICAL_SECTION m_CriticalSection;
long m_cRef;
DWORD m_fPartialLoad;
// 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. */
IUnknown * m_pUnkDispatch; // holds the controlling unknown of the scripting object that implements IDispatch
};
#endif // __AUDIOPATH_H_