DXUTsound.h
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:6k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: DXUTsound.h
  3. //
  4. // Copyright (c) Microsoft Corp. All rights reserved.
  5. //-----------------------------------------------------------------------------
  6. #ifndef DXUTSOUND_H
  7. #define DXUTSOUND_H
  8. //-----------------------------------------------------------------------------
  9. // Classes used by this header
  10. //-----------------------------------------------------------------------------
  11. class CSoundManager;
  12. class CSound;
  13. class CStreamingSound;
  14. class CWaveFile;
  15. //-----------------------------------------------------------------------------
  16. // Typing macros 
  17. //-----------------------------------------------------------------------------
  18. #define WAVEFILE_READ   1
  19. #define WAVEFILE_WRITE  2
  20. #define DXUT_StopSound(s)         { if(s) s->Stop(); }
  21. #define DXUT_PlaySound(s)         { if(s) s->Play( 0, 0 ); }
  22. #define DXUT_PlaySoundLooping(s)  { if(s) s->Play( 0, DSBPLAY_LOOPING ); }
  23. //-----------------------------------------------------------------------------
  24. // Name: class CSoundManager
  25. // Desc: 
  26. //-----------------------------------------------------------------------------
  27. class CSoundManager
  28. {
  29. protected:
  30.     IDirectSound8* m_pDS;
  31. public:
  32.     CSoundManager();
  33.     ~CSoundManager();
  34.     HRESULT Initialize( HWND hWnd, DWORD dwCoopLevel );
  35.     inline  LPDIRECTSOUND8 GetDirectSound() { return m_pDS; }
  36.     HRESULT SetPrimaryBufferFormat( DWORD dwPrimaryChannels, DWORD dwPrimaryFreq, DWORD dwPrimaryBitRate );
  37.     HRESULT Get3DListenerInterface( LPDIRECTSOUND3DLISTENER* ppDSListener );
  38.     HRESULT Create( CSound** ppSound, LPWSTR strWaveFileName, DWORD dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL, DWORD dwNumBuffers = 1 );
  39.     HRESULT CreateFromMemory( CSound** ppSound, BYTE* pbData, ULONG ulDataSize, LPWAVEFORMATEX pwfx, DWORD dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL, DWORD dwNumBuffers = 1 );
  40.     HRESULT CreateStreaming( CStreamingSound** ppStreamingSound, LPWSTR strWaveFileName, DWORD dwCreationFlags, GUID guid3DAlgorithm, DWORD dwNotifyCount, DWORD dwNotifySize, HANDLE hNotifyEvent );
  41. };
  42. //-----------------------------------------------------------------------------
  43. // Name: class CSound
  44. // Desc: Encapsulates functionality of a DirectSound buffer.
  45. //-----------------------------------------------------------------------------
  46. class CSound
  47. {
  48. protected:
  49.     LPDIRECTSOUNDBUFFER* m_apDSBuffer;
  50.     DWORD                m_dwDSBufferSize;
  51.     CWaveFile*           m_pWaveFile;
  52.     DWORD                m_dwNumBuffers;
  53.     DWORD                m_dwCreationFlags;
  54.     HRESULT RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, BOOL* pbWasRestored );
  55. public:
  56.     CSound( LPDIRECTSOUNDBUFFER* apDSBuffer, DWORD dwDSBufferSize, DWORD dwNumBuffers, CWaveFile* pWaveFile, DWORD dwCreationFlags );
  57.     virtual ~CSound();
  58.     HRESULT Get3DBufferInterface( DWORD dwIndex, LPDIRECTSOUND3DBUFFER* ppDS3DBuffer );
  59.     HRESULT FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, BOOL bRepeatWavIfBufferLarger );
  60.     LPDIRECTSOUNDBUFFER GetFreeBuffer();
  61.     LPDIRECTSOUNDBUFFER GetBuffer( DWORD dwIndex );
  62.     HRESULT Play( DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lVolume = 0, LONG lFrequency = -1, LONG lPan = 0 );
  63.     HRESULT Play3D( LPDS3DBUFFER p3DBuffer, DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lFrequency = 0 );
  64.     HRESULT Stop();
  65.     HRESULT Reset();
  66.     BOOL    IsSoundPlaying();
  67. };
  68. //-----------------------------------------------------------------------------
  69. // Name: class CStreamingSound
  70. // Desc: Encapsulates functionality to play a wave file with DirectSound.  
  71. //       The Create() method loads a chunk of wave file into the buffer, 
  72. //       and as sound plays more is written to the buffer by calling 
  73. //       HandleWaveStreamNotification() whenever hNotifyEvent is signaled.
  74. //-----------------------------------------------------------------------------
  75. class CStreamingSound : public CSound
  76. {
  77. protected:
  78.     DWORD m_dwLastPlayPos;
  79.     DWORD m_dwPlayProgress;
  80.     DWORD m_dwNotifySize;
  81.     DWORD m_dwNextWriteOffset;
  82.     BOOL  m_bFillNextNotificationWithSilence;
  83. public:
  84.     CStreamingSound( LPDIRECTSOUNDBUFFER pDSBuffer, DWORD dwDSBufferSize, CWaveFile* pWaveFile, DWORD dwNotifySize );
  85.     ~CStreamingSound();
  86.     HRESULT HandleWaveStreamNotification( BOOL bLoopedPlay );
  87.     HRESULT Reset();
  88. };
  89. //-----------------------------------------------------------------------------
  90. // Name: class CWaveFile
  91. // Desc: Encapsulates reading or writing sound data to or from a wave file
  92. //-----------------------------------------------------------------------------
  93. class CWaveFile
  94. {
  95. public:
  96.     WAVEFORMATEX* m_pwfx;        // Pointer to WAVEFORMATEX structure
  97.     HMMIO         m_hmmio;       // MM I/O handle for the WAVE
  98.     MMCKINFO      m_ck;          // Multimedia RIFF chunk
  99.     MMCKINFO      m_ckRiff;      // Use in opening a WAVE file
  100.     DWORD         m_dwSize;      // The size of the wave file
  101.     MMIOINFO      m_mmioinfoOut;
  102.     DWORD         m_dwFlags;
  103.     BOOL          m_bIsReadingFromMemory;
  104.     BYTE*         m_pbData;
  105.     BYTE*         m_pbDataCur;
  106.     ULONG         m_ulDataSize;
  107.     CHAR*         m_pResourceBuffer;
  108. protected:
  109.     HRESULT ReadMMIO();
  110.     HRESULT WriteMMIO( WAVEFORMATEX *pwfxDest );
  111. public:
  112.     CWaveFile();
  113.     ~CWaveFile();
  114.     HRESULT Open( LPWSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags );
  115.     HRESULT OpenFromMemory( BYTE* pbData, ULONG ulDataSize, WAVEFORMATEX* pwfx, DWORD dwFlags );
  116.     HRESULT Close();
  117.     HRESULT Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead );
  118.     HRESULT Write( UINT nSizeToWrite, BYTE* pbData, UINT* pnSizeWrote );
  119.     DWORD   GetSize();
  120.     HRESULT ResetFile();
  121.     WAVEFORMATEX* GetFormat() { return m_pwfx; };
  122. };
  123. #endif // DXUTSOUND_H