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

控制台编程

开发平台:

C/C++

  1. #include "StdAfx.h"
  2. #include ".smallfilewaveout.h"
  3. #include "math.h"
  4. CSmallFileWaveOut::CSmallFileWaveOut(void)
  5. {
  6. this->m_allocData.lpData = NULL;
  7. }
  8. CSmallFileWaveOut::~CSmallFileWaveOut(void)
  9. {
  10. this->Stop();
  11. }
  12. //////////////////////////////////////////////////////////////////////////
  13. // 打开输出设备,设置回调方式,并分配播放缓冲,读入全部裸音频数据 
  14. BOOL CSmallFileWaveOut::Init(WAVEFORMATEX fmt, DWORD hWnd)
  15. {
  16. // 打开输出设备,设置回调方式
  17. BOOL bRet = CWaveOut::Init(fmt, hWnd);
  18. // 读取字节数
  19. UINT nRead = 0;
  20. // 全部读入裸音频数据
  21. if (bRet)
  22. {
  23. // 分配缓冲块结构
  24. nRead = this->m_wavFile.GetDataChunkSize();
  25. this->m_allocData.lpData = new char[nRead];
  26. if (this->m_allocData.lpData != NULL)
  27. {
  28. this->m_wavFile.Reset();
  29. // 获取实际读取得byte数
  30. nRead = this->m_wavFile.ReadBytes(this->m_allocData.lpData, nRead);
  31. // 填写缓冲块格式信息
  32. this->m_allocData.dwBufferLength = nRead;
  33. this->m_allocData.dwBytesRecorded = 0;
  34. this->m_allocData.dwFlags = 0;
  35. this->m_allocData.dwLoops = 0;
  36. this->m_allocData.dwUser = nRead;
  37. // 预制缓冲块
  38. waveOutPrepareHeader(this->m_hWaveOut, 
  39. &this->m_allocData, sizeof(WAVEHDR));
  40. }
  41. }
  42. return bRet;
  43. }
  44. //////////////////////////////////////////////////////////////////////////
  45. // 处理WOM_DONE消息,继续播放下一个缓冲块
  46. LRESULT CSmallFileWaveOut::OnDone(DWORD dwParam)
  47. {
  48. return 0;
  49. }
  50. //////////////////////////////////////////////////////////////////////////
  51. // 获得指定范围内的样本点
  52. void CSmallFileWaveOut::GetSamples(WAVEHDR* pWaveHdr, unsigned int nFrom, unsigned int nCount) const
  53. {
  54. // 计算实际起始字节位置
  55. unsigned nBytesFrom = 0;
  56. // 计算实际包含字节数
  57. unsigned int nTotalBytes = 0;
  58. // wave文件格式信息
  59. WAVEFORMATEX fmt = this->m_wavFile.GetWaveFormat();
  60. // 尚可播放的音频数据字节数
  61. unsigned int nRest = 0;
  62. if (pWaveHdr != NULL && this->m_allocData.lpData != NULL)
  63. {
  64. nBytesFrom = nFrom * fmt.nBlockAlign;
  65. nTotalBytes = nCount * fmt.nBlockAlign;
  66. nRest = this->m_wavFile.GetDataChunkSize() - nBytesFrom;
  67. nTotalBytes = ((nTotalBytes > nRest || nTotalBytes <= 0) ? nRest : nTotalBytes);
  68. pWaveHdr->dwBufferLength = nTotalBytes;
  69. pWaveHdr->dwUser = nTotalBytes;
  70. pWaveHdr->lpData = &this->m_allocData.lpData[nBytesFrom];
  71. }
  72. }
  73. //////////////////////////////////////////////////////////////////////////
  74. // 播放指定范围内的样本点
  75. void CSmallFileWaveOut::PlaySamples(unsigned int nFrom, unsigned int nCount)
  76. {
  77. // 计算实际起始字节位置
  78. unsigned nBytesFrom = 0;
  79. // 计算实际包含字节数
  80. unsigned int nTotalBytes = 0;
  81. // wave文件格式信息
  82. WAVEFORMATEX fmt = this->m_wavFile.GetWaveFormat();
  83. // 尚可播放的音频数据字节数
  84. unsigned int nRest = 0;
  85. nBytesFrom = nFrom * fmt.nBlockAlign;
  86. nTotalBytes = nCount * fmt.nBlockAlign;
  87. nRest = this->m_wavFile.GetDataChunkSize() - nBytesFrom;
  88. nTotalBytes = (nTotalBytes > nRest ? nRest : nTotalBytes);
  89. if (nTotalBytes > 0 && this->m_allocData.lpData != NULL)
  90. {
  91. this->m_playBuffer.lpData = &this->m_allocData.lpData[nBytesFrom];
  92. this->m_playBuffer.dwBufferLength = nTotalBytes;
  93. this->m_playBuffer.dwBytesRecorded = 0;
  94. this->m_playBuffer.dwFlags = 0;
  95. this->m_playBuffer.dwUser = nTotalBytes;
  96. // 预制缓冲块
  97. waveOutPrepareHeader(this->m_hWaveOut, 
  98. &this->m_playBuffer, sizeof(WAVEHDR));
  99. // 发送缓冲块
  100. waveOutWrite(this->m_hWaveOut, &this->m_playBuffer, sizeof(WAVEHDR));
  101. // unprepared音频块
  102. waveOutUnprepareHeader(
  103. this->m_hWaveOut, &this->m_playBuffer, sizeof(WAVEHDR));
  104. }
  105. }
  106. //////////////////////////////////////////////////////////////////////////
  107. // 播放音频逻数据
  108. void CSmallFileWaveOut::Start()
  109. {
  110. if (this->m_allocData.lpData != NULL)
  111. {
  112. CWaveOut::Start();
  113. // 发送缓冲块
  114. waveOutWrite(this->m_hWaveOut, &this->m_allocData, sizeof(WAVEHDR));
  115. }
  116. }
  117. //////////////////////////////////////////////////////////////////////////
  118. // 停止播放,关闭输出设备, UnPrepare缓冲块
  119. void CSmallFileWaveOut::Stop()
  120. {
  121. // 停止播放
  122. CWaveOut::Stop();
  123. // unprepared音频块
  124. waveOutUnprepareHeader(
  125. this->m_hWaveOut, &this->m_allocData, sizeof(WAVEHDR));
  126. // 关闭输出设备
  127. CWaveOut::CloseDev();
  128. // 清除缓冲区,初始化数据
  129. this->Dispose();
  130. }
  131. //////////////////////////////////////////////////////////////////////////
  132. // 清除缓冲区,初始化数据
  133. void CSmallFileWaveOut::Dispose()
  134. {
  135. if (this->m_allocData.lpData != NULL)
  136. {
  137. delete[] this->m_allocData.lpData;
  138. this->m_allocData.lpData = NULL;
  139. }
  140. // 关闭所打开文件
  141. CFileWaveOut::Dispose();
  142. }