// Copyright (c) 1996-1999 Microsoft Corporation // UMSynth.h : Declaration of CUserModeSynth #ifndef __UMSYNTH_H_ #define __UMSYNTH_H_ #include #include #include #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 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 ///////////////////////////////////////////////////////////////////////////// // 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_