BufferWaveOut.cpp
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:3k
源码类别:

控制台编程

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////
  2. // class CBufferWaveOut
  3. //
  4. // 功能: 实现内存中的裸音频数据的播放
  5. // 创建人: 陈文凯 (chwkai@gmail.com)
  6. // 创建日期:2005年5月19日
  7. // 修改人:
  8. // 修改日期:
  9. // 版本
  10. #include "StdAfx.h"
  11. #include ".bufferwaveout.h"
  12. CBufferWaveOut::CBufferWaveOut(void)
  13. {
  14. // 重置指针
  15. this->m_pAllocBuffer = NULL;
  16. this->m_pNextBuffer = NULL;
  17. this->m_pPreBuffer = NULL;
  18. }
  19. CBufferWaveOut::~CBufferWaveOut(void)
  20. {
  21. // 停止播放,并释放所占用资源
  22. this->Stop();
  23. }
  24. //////////////////////////////////////////////////////////////////////////
  25. // 打开输出设备,设置回调方式,设置format信息
  26. // Prepare所用到的缓存
  27. BOOL CBufferWaveOut::Init(WAVEFORMATEX fmt, DWORD hWnd)
  28. {
  29. BOOL bRet = FALSE;
  30. // 打开输出设备
  31. if (bRet = CWaveOut::Init(fmt, hWnd))
  32. {
  33. // 预备全部缓冲块
  34. this->m_pNextBuffer = this->m_pAllocBuffer;
  35. while (this->m_pNextBuffer != NULL)
  36. {
  37. waveOutPrepareHeader(this->m_hWaveOut, this->m_pNextBuffer, sizeof(WAVEHDR));
  38. this->m_pNextBuffer = this->m_pNextBuffer->lpNext;
  39. }
  40. }
  41. return bRet;
  42. }
  43. //////////////////////////////////////////////////////////////////////////
  44. // 开始播放音频裸数据
  45. void CBufferWaveOut::Start()
  46. {
  47. if (this->m_pAllocBuffer != NULL)
  48. {
  49. // 发送第一个缓冲快
  50. this->m_pPreBuffer = this->m_pAllocBuffer;
  51. this->m_pNextBuffer = this->m_pPreBuffer->lpNext;
  52. waveOutWrite(this->m_hWaveOut, this->m_pPreBuffer, sizeof(WAVEHDR));
  53. }
  54. }
  55. //////////////////////////////////////////////////////////////////////////
  56. // 设定播放的缓存区,设定format信息,调用init进行初始化
  57. BOOL CBufferWaveOut::LoadBuffer( WAVEHDR* pBuffer , WAVEFORMATEX fmt, DWORD hWnd)
  58. {
  59. BOOL bRet = FALSE;
  60. if (pBuffer != NULL)
  61. {
  62. // 停止当前播放
  63. this->Stop();
  64. // 调用init进行初始化
  65. bRet = this->Init(fmt, hWnd);
  66. // 设定缓存
  67. this->m_pAllocBuffer = pBuffer;
  68. }
  69. return bRet;
  70. }
  71. //////////////////////////////////////////////////////////////////////////
  72. // 处理WOU_DONE消息
  73. LRESULT CBufferWaveOut::OnDone(DWORD dwParam)
  74. {
  75. // 维护缓冲链表
  76. this->m_pPreBuffer->lpNext = this->m_pNextBuffer;
  77. // 发送待播放的缓冲
  78. if (this->m_pNextBuffer != NULL)
  79. {
  80. this->m_pPreBuffer = this->m_pNextBuffer;
  81. this->m_pNextBuffer = this->m_pNextBuffer->lpNext;
  82. waveOutWrite(this->m_hWaveOut, this->m_pPreBuffer, sizeof(WAVEHDR));
  83. }
  84. else
  85. {
  86. // 缓冲播放完毕后结束
  87. this->Stop();
  88. }
  89. return 0;
  90. }
  91. //////////////////////////////////////////////////////////////////////////
  92. // 停止播放,关闭输出设备, UnPrepare所用到的缓冲块
  93. void CBufferWaveOut::Stop()
  94. {
  95. // 停止播放
  96. CWaveOut::Stop();
  97. // UnPrepare 全部缓冲块
  98. this->m_pNextBuffer = this->m_pAllocBuffer;
  99. while (this->m_pNextBuffer != NULL)
  100. {
  101. waveOutUnprepareHeader(this->m_hWaveOut, this->m_pNextBuffer, sizeof(WAVEHDR));
  102. this->m_pNextBuffer = this->m_pNextBuffer->lpNext;
  103. }
  104. // 关闭输出设备
  105. CWaveOut::CloseDev();
  106. // 释放所占用资源,重置属性
  107. this->Dispose();
  108. }
  109. //////////////////////////////////////////////////////////////////////////
  110. // 释放所占用资源,重置属性
  111. void CBufferWaveOut::Dispose()
  112. {
  113. // 重置指针
  114. this->m_pAllocBuffer = NULL;
  115. this->m_pNextBuffer = NULL;
  116. this->m_pPreBuffer = NULL;
  117. // 重置基类参数
  118. CWaveOut::Dispose();
  119. }