一个vc++ direct sound播放wav文件的类.doc_第1页
一个vc++ direct sound播放wav文件的类.doc_第2页
一个vc++ direct sound播放wav文件的类.doc_第3页
一个vc++ direct sound播放wav文件的类.doc_第4页
一个vc++ direct sound播放wav文件的类.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一个vc+ direct sound播放wav文件的类 分类: VC+编程技术 2009-02-24 15:44 2422人阅读 评论(0) 收藏 举报 头文件#if !defined(AFX_DIRECTSOUND_H_A20FE86F_118F_11D2_9AB3_0060B0CDC13E_INCLUDED_) #define AFX_DIRECTSOUND_H_A20FE86F_118F_11D2_9AB3_0060B0CDC13E_INCLUDED_ #if _MSC_VER = 1000 #pragma once #endif / _MSC_VER = 1000 #include #include #pragma message(linking with Microsofts DirectSound library .) #pragma comment(lib, dsound.lib) class CDirectSound public: / 构造、析构函数 CDirectSound(); virtual CDirectSound(); /创建DirectSound对象 BOOL Create(LPCTSTR pszResource, CWnd * pWnd = 0); BOOL Create(UINT uResourceID, CWnd * pWnd = 0) return Create(MAKEINTRESOURCE(uResourceID), pWnd); BOOL Create(LPVOID pSoundData, CWnd * pWnd = 0); public: /操作函数 BOOL IsValid() const; void Play(DWORD dwStartPosition = 0, BOOL bLoop = FALSE); void Stop(); void Pause(); void Continue(); CDirectSound & EnableSound(BOOL bEnable = TRUE) m_bEnabled = bEnable; if( ! bEnable ) Stop(); return * this; BOOL IsEnabled() const return m_bEnabled; protected: /设置声音数据缓冲区 BOOL SetSoundData(LPVOID pSoundData, DWORD dwSoundSize); /创建DirectSoundBuffer BOOL CreateSoundBuffer(WAVEFORMATEX * pcmwf); /获取Wave数据 BOOL GetWaveData(void * pRes, WAVEFORMATEX * & pWaveHeader, void * & pbWaveData, DWORD & cbWaveSize); private: /声音数据 LPVOID m_pTheSound; /数据大小 DWORD m_dwTheSound; /DirectSoundBuffer指针 LPDIRECTSOUNDBUFFER m_pDsb; BOOL m_bEnabled; /DirectSound对象 static LPDIRECTSOUND m_lpDirectSound; static DWORD m_dwInstances; ; #endif / !defined(AFX_DIRECTSOUND_H_A20FE86F_118F_11D2_9AB3_0060B0CDC13E_INCLUDED_) 类的主体1. #includestdafx.h 2. #includeDirectSound.h 3. 4. /ThefollowingmacroisdefinedsinceDirectX5,butwillworkwith 5. /olderversionstoo. 6. #ifndefDSBLOCK_ENTIREBUFFER 7. #defineDSBLOCK_ENTIREBUFFER0x00000002 8. #endif 9. 10. #ifdef_DEBUG 11. #undefTHIS_FILE 12. staticcharTHIS_FILE=_FILE_; 13. #definenewDEBUG_NEW 14. #endif 15. 16. staticvoidDSError(HRESULThRes) 17. switch(hRes) 18. caseDS_OK:TRACE0(NOERROR/n);break; 19. caseDSERR_ALLOCATED:TRACE0(ALLOCATED/n);break; 20. caseDSERR_INVALIDPARAM:TRACE0(INVALIDPARAM/n);break; 21. caseDSERR_OUTOFMEMORY:TRACE0(OUTOFMEMORY/n);break; 22. caseDSERR_UNSUPPORTED:TRACE0(UNSUPPORTED/n);break; 23. caseDSERR_NOAGGREGATION:TRACE0(NOAGGREGATION/n);break; 24. caseDSERR_UNINITIALIZED:TRACE0(UNINITIALIZED/n);break; 25. caseDSERR_BADFORMAT:TRACE0(BADFORMAT/n);break; 26. caseDSERR_ALREADYINITIALIZED:TRACE0(ALREADYINITIALIZED/n);break; 27. caseDSERR_BUFFERLOST:TRACE0(BUFFERLOST/n);break; 28. caseDSERR_CONTROLUNAVAIL:TRACE0(CONTROLUNAVAIL/n);break; 29. caseDSERR_GENERIC:TRACE0(GENERIC/n);break; 30. caseDSERR_INVALIDCALL:TRACE0(INVALIDCALL/n);break; 31. caseDSERR_OTHERAPPHASPRIO:TRACE0(OTHERAPPHASPRIO/n);break; 32. caseDSERR_PRIOLEVELNEEDED:TRACE0(PRIOLEVELNEEDED/n);break; 33. default:TRACE1(%lu/n,hRes);break; 34. 35. 36. 37. / 38. /Construction/Destruction 39. / 40. 41. LPDIRECTSOUNDCDirectSound:m_lpDirectSound; 42. DWORDCDirectSound:m_dwInstances; 43. 44. 45. CDirectSound:CDirectSound() 46. 47. m_lpDirectSound=0; 48. m_pDsb=0; 49. m_pTheSound=0; 50. m_dwTheSound=0; 51. m_bEnabled=TRUE; 52. 53. +m_dwInstances; 54. 55. 56. CDirectSound:CDirectSound() 57. 58. if(m_pDsb) 59. m_pDsb-Release(); 60. 61. if(!-m_dwInstances&m_lpDirectSound) 62. m_lpDirectSound-Release(); 63. m_lpDirectSound=0; 64. 65. 66. 67. BOOLCDirectSound:Create(LPCTSTRpszResource,CWnd*pWnd) 68. 69. / 70. /loadresource 71. HINSTANCEhApp=:GetModuleHandle(0); 72. ASSERT(hApp); 73. 74. HRSRChResInfo=:FindResource(hApp,pszResource,TEXT(WAVE); 75. if(hResInfo=0) 76. returnFALSE; 77. 78. HGLOBALhRes=:LoadResource(hApp,hResInfo); 79. if(hRes=0) 80. returnFALSE; 81. 82. LPVOIDpTheSound=:LockResource(hRes); 83. if(pTheSound=0) 84. returnFALSE; 85. 86. returnCreate(pTheSound,pWnd); 87. 88. 89. 90. BOOLCDirectSound:Create(LPVOIDpSoundData,CWnd*pWnd) 91. /获取窗口句柄 92. if(pWnd=0) 93. pWnd=AfxGetApp()-GetMainWnd(); 94. ASSERT(pWnd!=0); 95. ASSERT(:IsWindow(pWnd-GetSafeHwnd(); 96. ASSERT(pSoundData!=0); 97. /创建DirectSound对象 98. if(m_lpDirectSound=0) 99. 100. HRESULThRes=DS_OK; 101. shortnRes=0; 102. do 103. if(nRes) 104. :Sleep(500); 105. hRes=:DirectSoundCreate(0,&m_lpDirectSound,0); 106. +nRes; 107. while(nResSetCooperativeLevel(pWnd-GetSafeHwnd(),DSSCL_NORMAL); 113. 114. ASSERT(m_lpDirectSound!=0); 115. /准备数据 116. WAVEFORMATEX*pcmwf; 117. if(!GetWaveData(pSoundData,pcmwf,m_pTheSound,m_dwTheSound)| 118. !CreateSoundBuffer(pcmwf)| 119. !SetSoundData(m_pTheSound,m_dwTheSound) 120. returnFALSE; 121. 122. returnTRUE; 123. 124. 125. 126. BOOLCDirectSound:GetWaveData(void*pRes,WAVEFORMATEX*&pWaveHeader,void*&pbWaveData,DWORD&cbWaveSize) 127. pWaveHeader=0; 128. pbWaveData=0; 129. cbWaveSize=0; 130. 131. DWORD*pdw=(DWORD*)pRes; 132. DWORDdwRiff=*pdw+; 133. DWORDdwLength=*pdw+; 134. DWORDdwType=*pdw+; 135. /检验“RIFF”标志 136. if(dwRiff!=mmioFOURCC(R,I,F,F) 137. returnFALSE; 138. /检验“WAVE”标志 139. if(dwType!=mmioFOURCC(W,A,V,E) 140. returnFALSE; 141. /指向声音数据 142. DWORD*pdwEnd=(DWORD*)(BYTE*)pdw+dwLength-4); 143. /查找声音数据 144. while(pdwpdwEnd) 145. 146. dwType=*pdw+; 147. dwLength=*pdw+; 148. switch(dwType) 149. casemmioFOURCC(f,m,t,): 150. if(!pWaveHeader) 151. 152. if(dwLengthCreateSoundBuffer(&dsbdesc,&m_pDsb,0) 187. 188. /Failed. 189. DSError(hRes); 190. m_pDsb=0; 191. returnFALSE; 192. 193. 194. returnTRUE; 195. 196. 197. 198. BOOLCDirectSound:SetSoundData(void*pSoundData,DWORDdwSoundSize) 199. LPVOIDlpvPtr1; 200. DWORDdwBytes1; 201. /获取一块内存 202. HRESULThr=m_pDsb-Lock(0,0,&lpvPtr1,&dwBytes1,0,0,DSBLOCK_ENTIREBUFFER); 203. /如果失败,重新分配 204. if(DSERR_BUFFERLOST=hr) 205. 206. m_pDsb-Restore(); 207. hr=m_pDsb-Lock(0,0,&lpvPtr1,&dwBytes1,0,0,DSBLOCK_ENTIREBUFFER); 208. 209. if(DS_OK=hr) 210. /复制声音数据 211. :CopyMemory(lpvPtr1,pSoundData,dwBytes1); 212. /释放锁定的内存块 213. hr=m_pDsb-Unlock(lpvPtr1,dwBytes1,0,0); 214. if(DS_OK=hr) 215. returnTRUE; 216. 217. returnFALSE; 218. 219. 220. voidCDirectSound:Play(DWORDdwStartPosition,BOOLbLoop) 221. 222. if(!IsValid()|!IsEnabled() 223. return; 224. /播放位置边界检验 225. if(dwStartPositionm_dwTheSound) 226. dwStartPosition=m_dwTheSound; 227. /重新设置播放位置 228. m_pDsb-SetCurre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论