mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
7.2 KiB
211 lines
7.2 KiB
// 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_
|