source: GTP/trunk/App/Demos/Illum/pathmap/Common/DXUTsound.h @ 2197

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