Sound.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:6k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // Sound.cpp: implementation of the CSound class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "StdAfx.h"
  5. #define ORBIT_MAX_RADIUS        5.5f
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. CSound::~CSound()
  10. {
  11. FreeDirectSound();
  12. }
  13. CSound::CSound()
  14. {
  15. m_pDS = NULL;
  16. m_pDS3DBuffer = NULL;
  17. // m_pWaveSoundRead = NULL;
  18. m_3dSound = FALSE; // ENABLE 3D?
  19. m_SoundOff = TRUE;
  20. m_pDSListener = NULL;
  21. }
  22. HRESULT CSound::GetCaps(void)
  23. {
  24. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  25. return m_pDS->GetCaps(&m_DSCaps);
  26. }
  27. HRESULT CSound::ContinuousPlay( BOOL Enable )
  28. {
  29. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  30. LPDIRECTSOUNDBUFFER lpDSB;
  31.     DSBUFFERDESC dsbdesc;
  32. HRESULT rval;
  33. // Get primary SoundBuffer
  34. ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
  35.     dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
  36.     dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; 
  37. rval = m_pDS->CreateSoundBuffer(&dsbdesc, &lpDSB, NULL);
  38. if( FAILED(rval) ) return rval;
  39. if( Enable ) rval=lpDSB->Play( 0, 0, DSBPLAY_LOOPING );
  40. else rval=lpDSB->Stop( );
  41. SAFE_RELEASE( lpDSB );
  42. return rval;
  43. }
  44. HRESULT CSound::Create(void *hWnd, BOOL Exclusive)
  45. {
  46. HRESULT rval;
  47. m_bDeferSettings = 0;
  48. rval = DirectSoundCreate(NULL, &m_pDS, NULL);
  49. if(rval != DS_OK) return rval;
  50. rval = m_pDS->SetCooperativeLevel((HWND)hWnd, (Exclusive) ? DSSCL_EXCLUSIVE : DSSCL_NORMAL );
  51. if(rval != DS_OK) return rval;
  52. m_SoundOff=FALSE;
  53. if( Exclusive )
  54. return SetFormat( 22050, TRUE, TRUE );
  55. return DS_OK;
  56. }
  57. HRESULT CSound::SetFormat(long Frequency, BOOL Bit16, BOOL stereo)
  58. {
  59. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  60. LPDIRECTSOUNDBUFFER pDSB;
  61.     DSBUFFERDESC dsbdesc;
  62. WAVEFORMATEX wfx;
  63. HRESULT rval;
  64. // Get primary SoundBuffer
  65. ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
  66.     dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
  67.     dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; 
  68. rval = m_pDS->CreateSoundBuffer(&dsbdesc, &pDSB, NULL); 
  69. if( FAILED(rval) ) return rval;
  70. // Set the desired Format
  71. ZeroMemory( &wfx, sizeof(WAVEFORMATEX) );
  72. wfx.wFormatTag=WAVE_FORMAT_PCM;
  73. wfx.nSamplesPerSec=Frequency;
  74. wfx.wBitsPerSample=(Bit16) ? 16 : 8;
  75. wfx.nChannels=(stereo) ? 2 : 1;
  76. wfx.nBlockAlign=wfx.wBitsPerSample/8*wfx.nChannels;
  77. wfx.nAvgBytesPerSec=Frequency*wfx.nBlockAlign;
  78. rval=pDSB->SetFormat( &wfx );
  79. SAFE_RELEASE( pDSB );
  80. return rval;
  81. }
  82. VOID CSound::FreeDirectSound(VOID)
  83. {
  84.     // Release DirectSound interfaces
  85.     SAFE_RELEASE( m_pDSListener );
  86.     SAFE_RELEASE( m_pDS ); 
  87. }
  88. HRESULT CSound::Enable3d(VOID)
  89. {
  90. if(m_pDS==NULL) return DSERR_UNINITIALIZED;
  91. LPDIRECTSOUNDBUFFER lpDSB;
  92.     DSBUFFERDESC dsbdesc;
  93. HRESULT rval;
  94. // Get primary SoundBuffer
  95. ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
  96.     dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
  97.     dsbdesc.dwFlags = DSBCAPS_CTRL3D|DSBCAPS_PRIMARYBUFFER; 
  98. rval = m_pDS->CreateSoundBuffer(&dsbdesc, &lpDSB, NULL);
  99. if( FAILED(rval) ) return rval;
  100. rval=lpDSB->QueryInterface(IID_IDirectSound3DListener, (LPVOID *)&m_pDSListener);
  101. if( FAILED(rval) ) return rval;
  102. SAFE_RELEASE( lpDSB );
  103. m_3dSound = TRUE;
  104. return DS_OK;
  105. }
  106. HRESULT CSound::Set3dFactors( float DopplerFactor, float RolloffFactor, float DistanceFactor )
  107. {
  108. HRESULT rval;
  109. if(m_pDSListener==NULL) return DSERR_UNINITIALIZED;
  110. rval=m_pDSListener->SetDopplerFactor( DopplerFactor, DS3D_DEFERRED );
  111. if(FAILED(rval)) return rval;
  112. rval=m_pDSListener->SetRolloffFactor( RolloffFactor, DS3D_DEFERRED );
  113. if(FAILED(rval)) return rval;
  114. rval=m_pDSListener->SetDistanceFactor( DistanceFactor, DS3D_DEFERRED );
  115. if(FAILED(rval)) return rval;
  116. return m_pDSListener->CommitDeferredSettings();
  117. }
  118. HRESULT CSound::Place3dListener( float posX, float posY, float posZ, float frontX, float frontY, float frontZ, float topX, float topY, float topZ, BOOL setOrientation )
  119. {
  120. HRESULT rval;
  121. if(m_pDSListener==NULL) return DSERR_UNINITIALIZED;
  122. rval=m_pDSListener->SetPosition( posX, posY, posZ, DS3D_DEFERRED ); //DS3D_IMMEDIATE
  123. if(FAILED(rval)) return rval;
  124. if( setOrientation )
  125. {
  126. rval=m_pDSListener->SetOrientation( frontX, frontY, frontZ, topX, topY, topZ, DS3D_DEFERRED );
  127. if(FAILED(rval)) return rval;
  128. }
  129. return m_pDSListener->CommitDeferredSettings();
  130. }
  131. HRESULT CSound::SetMIDIVolume( BYTE rvol, BYTE lvol )
  132. {
  133. MIDIOUTCAPS midiCaps;
  134. if( FAILED( midiOutGetDevCaps(0, &midiCaps, sizeof(midiCaps)) ) ) 
  135. return DSERR_NODRIVER;
  136. if( midiCaps.dwSupport&MIDICAPS_VOLUME )
  137. return midiOutSetVolume( 0, MAKEVOL(rvol, lvol) );
  138. return DSERR_UNSUPPORTED;
  139. }
  140. HRESULT CSound::SetDIGIVolume( BYTE rvol, BYTE lvol )
  141. {
  142. WAVEOUTCAPS waveCaps;
  143. if( FAILED( waveOutGetDevCaps(0, &waveCaps, sizeof(waveCaps)) ) )
  144. return DSERR_NODRIVER;
  145. if( waveCaps.dwSupport&WAVECAPS_VOLUME )
  146. return waveOutSetVolume( 0, MAKEVOL(rvol, lvol) );
  147. return DSERR_UNSUPPORTED;
  148. }
  149. HRESULT CSound::SetCDVolume( BYTE rvol, BYTE lvol )
  150. {
  151. AUXCAPS auxCaps;
  152. if( FAILED( auxGetDevCaps(0, &auxCaps, sizeof(auxCaps)) ) )
  153. return DSERR_NODRIVER;
  154. if( auxCaps.dwSupport&AUXCAPS_VOLUME )
  155. return auxSetVolume( 0, MAKEVOL(rvol, lvol) );
  156. return DSERR_UNSUPPORTED;
  157. }
  158. DWORD CSound::GetMIDIVolume( void )
  159. {
  160. DWORD vol;
  161. midiOutGetVolume(0, &vol);
  162. return vol;
  163. }
  164. DWORD CSound::GetDIGIVolume( void )
  165. {
  166. DWORD vol;
  167. waveOutGetVolume(0, &vol);
  168. return vol;
  169. }
  170. DWORD CSound::GetCDVolume( void )
  171. {
  172. DWORD vol;
  173. auxGetVolume(0, &vol);
  174. return vol;
  175. }