text: /************************************************************************
  *                                                                       *
  *   dmusics.h -- Definitions for created a DirectMusic software synth   *
  *                                                                       *
  *   Copyright (c) 1998-1999 Microsoft Corporation
  *                                                                       *
  ************************************************************************/
  
  #ifndef _DMUSICS_
  #define _DMUSICS_
  
  #include "dmusicc.h"
  
  /* Software synths are enumerated from under this registry key.
   */
  #define REGSTR_PATH_SOFTWARESYNTHS  "Software\\Microsoft\\DirectMusic\\SoftwareSynths"
  
  interface IDirectMusicSynth;
  interface IDirectMusicSynthSink;
  
  #ifndef __cplusplus 
  typedef interface IDirectMusicSynth IDirectMusicSynth;
  typedef interface IDirectMusicSynthSink IDirectMusicSynthSink;
  #endif
  
  #ifndef _DMUS_VOICE_STATE_DEFINED
  #define _DMUS_VOICE_STATE_DEFINED
  
  typedef struct _DMUS_VOICE_STATE
  {
      BOOL                bExists;
      SAMPLE_POSITION     spPosition;
  } DMUS_VOICE_STATE; 
  
  #endif /* _DMUS_VOICE_STATE_DEFINED */
  
  /* IDirectMusicSynth::Refresh
   *
   * This is the last buffer of the stream. It may be a partial block.
   */
  #define REFRESH_F_LASTBUFFER        0x00000001
  
  #undef  INTERFACE
  #define INTERFACE  IDirectMusicSynth
  DECLARE_INTERFACE_(IDirectMusicSynth, IUnknown)
  {
      /* IUnknown */
      STDMETHOD(QueryInterface)       (THIS_ REFIID, LPVOID FAR *) PURE;
      STDMETHOD_(ULONG,AddRef)        (THIS) PURE;
      STDMETHOD_(ULONG,Release)       (THIS) PURE;
  
      /* IDirectMusicSynth */
      STDMETHOD(Open)                 (THIS_ LPDMUS_PORTPARAMS pPortParams) PURE;
      STDMETHOD(Close)                (THIS) PURE;
      STDMETHOD(SetNumChannelGroups)  (THIS_ DWORD dwGroups) PURE;
      STDMETHOD(Download)             (THIS_ LPHANDLE phDownload, 
                                             LPVOID pvData, 
                                             LPBOOL pbFree ) PURE;
      STDMETHOD(Unload)               (THIS_ HANDLE hDownload, 
                                             HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE), 
                                             HANDLE hUserData ) PURE; 
      STDMETHOD(PlayBuffer)           (THIS_ REFERENCE_TIME rt, 
                                             LPBYTE pbBuffer, 
                                             DWORD cbBuffer) PURE;
      STDMETHOD(GetRunningStats)      (THIS_ LPDMUS_SYNTHSTATS pStats) PURE;
      STDMETHOD(GetPortCaps)          (THIS_ LPDMUS_PORTCAPS pCaps) PURE;
      STDMETHOD(SetMasterClock)       (THIS_ IReferenceClock *pClock) PURE;
      STDMETHOD(GetLatencyClock)      (THIS_ IReferenceClock **ppClock) PURE;
      STDMETHOD(Activate)             (THIS_ BOOL fEnable) PURE;
      STDMETHOD(SetSynthSink)         (THIS_ IDirectMusicSynthSink *pSynthSink) PURE;
      STDMETHOD(Render)               (THIS_ short *pBuffer, 
                                             DWORD dwLength, 
                                             LONGLONG llPosition) PURE;
      STDMETHOD(SetChannelPriority)   (THIS_ DWORD dwChannelGroup,
                                             DWORD dwChannel,
                                             DWORD dwPriority) PURE;
      STDMETHOD(GetChannelPriority)   (THIS_ DWORD dwChannelGroup,
                                             DWORD dwChannel,
                                             LPDWORD pdwPriority) PURE;
      STDMETHOD(GetFormat)            (THIS_ LPWAVEFORMATEX pWaveFormatEx,
                                             LPDWORD pdwWaveFormatExSize) PURE;
      STDMETHOD(GetAppend)            (THIS_ DWORD* pdwAppend) PURE;
  };
  
  #undef  INTERFACE
  
  #define INTERFACE  IDirectMusicSynth8
  DECLARE_INTERFACE_(IDirectMusicSynth8, IDirectMusicSynth)
  {
      /* IUnknown */
      STDMETHOD(QueryInterface)       (THIS_ REFIID, LPVOID FAR *) PURE;
      STDMETHOD_(ULONG,AddRef)        (THIS) PURE;
      STDMETHOD_(ULONG,Release)       (THIS) PURE;
  
      /* IDirectMusicSynth */
      STDMETHOD(Open)                 (THIS_ LPDMUS_PORTPARAMS pPortParams) PURE;
      STDMETHOD(Close)                (THIS) PURE;
      STDMETHOD(SetNumChannelGroups)  (THIS_ DWORD dwGroups) PURE;
      STDMETHOD(Download)             (THIS_ LPHANDLE phDownload, 
                                             LPVOID pvData, 
                                             LPBOOL pbFree ) PURE;
      STDMETHOD(Unload)               (THIS_ HANDLE hDownload, 
                                             HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE), 
                                             HANDLE hUserData ) PURE; 
      STDMETHOD(PlayBuffer)           (THIS_ REFERENCE_TIME rt, 
                                             LPBYTE pbBuffer, 
                                             DWORD cbBuffer) PURE;
      STDMETHOD(GetRunningStats)      (THIS_ LPDMUS_SYNTHSTATS pStats) PURE;
      STDMETHOD(GetPortCaps)          (THIS_ LPDMUS_PORTCAPS pCaps) PURE;
      STDMETHOD(SetMasterClock)       (THIS_ IReferenceClock *pClock) PURE;
      STDMETHOD(GetLatencyClock)      (THIS_ IReferenceClock **ppClock) PURE;
      STDMETHOD(Activate)             (THIS_ BOOL fEnable) PURE;
      STDMETHOD(SetSynthSink)         (THIS_ IDirectMusicSynthSink *pSynthSink) PURE;
      STDMETHOD(Render)               (THIS_ short *pBuffer, 
                                             DWORD dwLength, 
                                             LONGLONG llPosition) PURE;
      STDMETHOD(SetChannelPriority)   (THIS_ DWORD dwChannelGroup,
                                             DWORD dwChannel,
                                             DWORD dwPriority) PURE;
      STDMETHOD(GetChannelPriority)   (THIS_ DWORD dwChannelGroup,
                                             DWORD dwChannel,
                                             LPDWORD pdwPriority) PURE;
      STDMETHOD(GetFormat)            (THIS_ LPWAVEFORMATEX pWaveFormatEx,
                                             LPDWORD pdwWaveFormatExSize) PURE;
      STDMETHOD(GetAppend)            (THIS_ DWORD* pdwAppend) PURE;
  
  	/* IDirectMusicSynth8 */
      STDMETHOD(PlayVoice)            (THIS_ REFERENCE_TIME rt, 
  										   DWORD dwVoiceId, 
  										   DWORD dwChannelGroup, 
  										   DWORD dwChannel, 
  										   DWORD dwDLId, 
  										   long	 prPitch,			/* PREL not defined here */
  										   long  vrVolume,          /* VREL not defined here */
                                             SAMPLE_TIME stVoiceStart,
                                             SAMPLE_TIME stLoopStart,
                                             SAMPLE_TIME stLoopEnd) PURE;
  
      STDMETHOD(StopVoice)            (THIS_ REFERENCE_TIME rt, 
  										   DWORD dwVoiceId ) PURE;
  
      STDMETHOD(GetVoiceState)        (THIS_ DWORD dwVoice[], 
  										   DWORD cbVoice,
  										   DMUS_VOICE_STATE dwVoiceState[] ) PURE;
      STDMETHOD(Refresh)              (THIS_ DWORD dwDownloadID,
                                             DWORD dwFlags) PURE;
      STDMETHOD(AssignChannelToBuses) (THIS_ DWORD dwChannelGroup,
                                             DWORD dwChannel,
                                             LPDWORD pdwBuses,
                                             DWORD cBuses) PURE;                                           
  };
  
  #undef  INTERFACE
  #define INTERFACE  IDirectMusicSynthSink
  DECLARE_INTERFACE_(IDirectMusicSynthSink, IUnknown)
  {
      /* IUnknown */
      STDMETHOD(QueryInterface)       (THIS_ REFIID, LPVOID FAR *) PURE;
      STDMETHOD_(ULONG,AddRef)        (THIS) PURE;
      STDMETHOD_(ULONG,Release)       (THIS) PURE;
  
      /* IDirectMusicSynthSink */
      STDMETHOD(Init)                 (THIS_ IDirectMusicSynth *pSynth) PURE;
      STDMETHOD(SetMasterClock)       (THIS_ IReferenceClock *pClock) PURE;
      STDMETHOD(GetLatencyClock)      (THIS_ IReferenceClock **ppClock) PURE;
      STDMETHOD(Activate)             (THIS_ BOOL fEnable) PURE;
      STDMETHOD(SampleToRefTime)      (THIS_ LONGLONG llSampleTime,
                                             REFERENCE_TIME *prfTime) PURE;
      STDMETHOD(RefTimeToSample)      (THIS_ REFERENCE_TIME rfTime, 
                                             LONGLONG *pllSampleTime) PURE;
      STDMETHOD(SetDirectSound)       (THIS_ LPDIRECTSOUND pDirectSound,
                                             LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE;                                           
      STDMETHOD(GetDesiredBufferSize) (THIS_ LPDWORD pdwBufferSizeInSamples) PURE;                                           
  };
  
  DEFINE_GUID(IID_IDirectMusicSynth, 0x9823661,  0x5c85, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6);
  DEFINE_GUID(IID_IDirectMusicSynth8,0x53cab625, 0x2711, 0x4c9f, 0x9d, 0xe7, 0x1b, 0x7f, 0x92, 0x5f, 0x6f, 0xc8);
  DEFINE_GUID(IID_IDirectMusicSynthSink,0x9823663, 0x5c85, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6);
  
  /* Property Set GUID_DMUS_PROP_SetSynthSink
   *
   * Item 0: An IUnknown on which the port can QueryInterface for a user-mode synth sink.
   */
  DEFINE_GUID(GUID_DMUS_PROP_SetSynthSink,0x0a3a5ba5, 0x37b6, 0x11d2, 0xb9, 0xf9, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12);
  
  /* Property Set GUID_DMUS_PROP_SinkUsesDSound
   *
   * Item 0: A DWORD boolean indicating whether or not the sink requires an IDirectSound interface. The
   * default is FALSE if this property item is not implemented by the sink.
   */
  DEFINE_GUID(GUID_DMUS_PROP_SinkUsesDSound, 0xbe208857, 0x8952, 0x11d2, 0xba, 0x1c, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); 
  
  #endif
  