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

212 lines
7.2 KiB
C++

// Copyright (c) 1996-1999 Microsoft Corporation
// UMSynth.h : Declaration of CUserModeSynth
#ifndef __UMSYNTH_H_
#define __UMSYNTH_H_
#include <ks.h>
#include <ksproxy.h>
#include <mmsystem.h>
#include "dsound.h"
#include "dmusicc.h"
#include "dmusics.h"
#include "CSynth.h"
#include "synth.h"
#include "dsoundp.h" // For IDirectSoundSource
class CUserModeSynth;
// @@BEGIN_DDKSPLIT -- This section will be removed in the DDK sample. See ddkreadme.txt for more info.
#if 0 // The following section will only take affect in the DDK sample.
// @@END_DDKSPLIT
// {F5038F82-C052-11D2-872F-00600893B1BD}
DEFINE_GUID(CLSID_DDKSynth,
0xf5038f82, 0xc052, 0x11d2, 0x87, 0x2f, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd);
// @@BEGIN_DDKSPLIT -- This section will be removed in the DDK sample.
#endif
// @@END_DDKSPLIT
typedef HRESULT (CUserModeSynth::*GENPROPHANDLER)(ULONG ulId, BOOL fSet, LPVOID pbBuffer, PULONG cbBuffer);
#define GENPROP_F_STATIC 0x00000000
#define GENPROP_F_FNHANDLER 0x00000001
#include <pshpack4.h>
struct GENERICPROPERTY
{
const GUID *pguidPropertySet; // What property set?
ULONG ulId; // What item?
ULONG ulSupported; // Get/Set flags for QuerySupported
ULONG ulFlags; // GENPROP_F_xxx
LPVOID pPropertyData; // Data to be returned
ULONG cbPropertyData; // and its size
GENPROPHANDLER pfnHandler; // Handler fn iff GENPROP_F_FNHANDLER
};
#include <poppack.h>
/////////////////////////////////////////////////////////////////////////////
// CDMSynth
class CUserModeSynth : public IDirectMusicSynth8, public IDirectSoundSource, public IKsControl
{
// @@BEGIN_DDKSPLIT -- This section will be removed in the DDK sample. See ddkreadme.txt for more info.
friend class CDSLink;
friend class CClock;
// @@END_DDKSPLIT
public:
// IUnknown
//
virtual STDMETHODIMP QueryInterface(const IID &iid, void **ppv);
virtual STDMETHODIMP_(ULONG) AddRef();
virtual STDMETHODIMP_(ULONG) Release();
// IDirectMusicSynth
public:
virtual STDMETHODIMP Open(LPDMUS_PORTPARAMS pPortParams);
virtual STDMETHODIMP Close();
virtual STDMETHODIMP SetNumChannelGroups(DWORD dwGroups);
virtual STDMETHODIMP Download(LPHANDLE phDownload, LPVOID pvData, LPBOOL pbFree);
virtual STDMETHODIMP Unload(HANDLE hDownload,
HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE),
HANDLE hUserData);
virtual STDMETHODIMP PlayBuffer(REFERENCE_TIME rt, LPBYTE pbBuffer, DWORD cbBuffer);
virtual STDMETHODIMP GetRunningStats(LPDMUS_SYNTHSTATS pStats);
virtual STDMETHODIMP GetPortCaps(LPDMUS_PORTCAPS pCaps);
virtual STDMETHODIMP SetMasterClock(IReferenceClock *pClock);
virtual STDMETHODIMP GetLatencyClock(IReferenceClock **ppClock);
virtual STDMETHODIMP Activate(BOOL fEnable);
virtual STDMETHODIMP SetSynthSink(IDirectMusicSynthSink *pSynthSink);
virtual STDMETHODIMP Render(short *pBuffer, DWORD dwLength, LONGLONG llPosition);
virtual STDMETHODIMP SetChannelPriority(DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority);
virtual STDMETHODIMP GetChannelPriority(DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority);
virtual STDMETHODIMP GetFormat(LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize);
virtual STDMETHODIMP GetAppend(DWORD* pdwAppend);
// IDirectMusicSynth8
public:
virtual STDMETHODIMP PlayVoice(REFERENCE_TIME rt, DWORD dwVoiceId, DWORD dwChannelGroup, DWORD dwChannel, DWORD dwDLId, PREL prPitch, VREL vrVolume, SAMPLE_TIME stVoiceStart, SAMPLE_TIME stLoopStart, SAMPLE_TIME stLoopEnd );
virtual STDMETHODIMP StopVoice(REFERENCE_TIME rt, DWORD dwVoiceId );
virtual STDMETHODIMP GetVoiceState(DWORD dwVoice[], DWORD cbVoice, DMUS_VOICE_STATE VoiceState[] );
virtual STDMETHODIMP Refresh(DWORD dwDownloadID, DWORD dwFlags );
virtual STDMETHODIMP AssignChannelToBuses(DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwBuses, DWORD cBuses );
// IDirectSoundSource
public:
virtual STDMETHODIMP GetFormat(LPWAVEFORMATEX pWaveFormatEx, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten);
virtual STDMETHODIMP SetSink(IDirectSoundConnect* pSinkConnect);
virtual STDMETHODIMP Seek(ULONGLONG sp);
virtual STDMETHODIMP Read(LPVOID *ppvBuffer, LPDWORD pdwIDs, LPDWORD pdwFuncIDs, LPLONG plPitchBends, DWORD cpvBuffer, PULONGLONG pcb);
virtual STDMETHODIMP GetSize(PULONGLONG pcb);
// IDirectSoundSource : members
private:
ULONGLONG m_ullPosition;
// IKsControl
public:
virtual STDMETHODIMP KsProperty(
PKSPROPERTY pPropertyIn,
ULONG ulPropertyLength,
LPVOID pvPropertyData,
ULONG ulDataLength,
PULONG pulBytesReturned);
virtual STDMETHODIMP KsMethod(
IN PKSMETHOD Method,
IN ULONG MethodLength,
IN OUT LPVOID MethodData,
IN ULONG DataLength,
OUT PULONG BytesReturned
);
virtual STDMETHODIMP KsEvent(
IN PKSEVENT Event,
IN ULONG EventLength,
IN OUT LPVOID EventData,
IN ULONG DataLength,
OUT PULONG BytesReturned
);
CUserModeSynth();
~CUserModeSynth();
HRESULT Init();
private:
// @@BEGIN_DDKSPLIT -- This section will be removed in the DDK sample. See ddkreadme.txt for more info.
HRESULT UseDefaultSynthSink();
// @@END_DDKSPLIT
long m_cRef;
IDirectMusicSynthSink *m_pSynthSink;
IDirectSoundSynthSink *m_pSynthSink8;
CSynth * m_pSynth; // Just one synth engine.
BOOL m_fActive; // Currently active.
DWORD m_dwSampleRate; // Synths sample rate
DWORD m_dwChannels; // number of ouput channels
DWORD m_dwBufferFlags;// flags the type of output buffer dssink or interleaved or plain mono
LONG m_lVolume; // in 1/100 dB
LONG m_lBoost; // in 1/100 dB
LONG m_lGainAdjust; // in 1/100 dB
CRITICAL_SECTION m_CriticalSection; // Critical section to manage access.
BOOL m_fCSInitialized;
HRESULT HandleSetVolume(
ULONG ulId,
BOOL fSet,
LPVOID pbBuffer,
PULONG pcbBuffer);
HRESULT HandleSetBoost(
ULONG ulId,
BOOL fSet,
LPVOID pbBuffer,
PULONG pcbBuffer);
HRESULT HandleReverb(ULONG ulId, BOOL fSet, LPVOID pbBuffer, PULONG pcbBuffer);
HRESULT HandleEffects(ULONG ulId, BOOL fSet, LPVOID pbBuffer, PULONG pcbBuffer);
HRESULT HandleGetSampleRate(ULONG ulId, BOOL fSet, LPVOID pbBuffer, PULONG pcbBuffer);
static GENERICPROPERTY m_aProperty[];
static const int m_nProperty;
//static GENERICPROPERTY *FindPropertyItem(REFGUID rguid, ULONG ulId);
GENERICPROPERTY *FindPropertyItem(REFGUID rguid, ULONG ulId);
};
// Class factory
//
// Common to emulation/WDM.
//
class CDirectMusicSynthFactory : public IClassFactory
{
public:
// IUnknown
//
virtual STDMETHODIMP QueryInterface(const IID &iid, void **ppv);
virtual STDMETHODIMP_(ULONG) AddRef();
virtual STDMETHODIMP_(ULONG) Release();
// Interface IClassFactory
//
virtual STDMETHODIMP CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv);
virtual STDMETHODIMP LockServer(BOOL bLock);
// Constructor
//
CDirectMusicSynthFactory();
// Destructor
~CDirectMusicSynthFactory();
private:
long m_cRef;
};
#endif //__UMSYNTH_H_