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

控制台编程

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////
  2. // class CWaveOut
  3. //
  4. // 功能: 语音播放的基类
  5. // 创建人: 陈文凯 (chwkai@gmail.com)
  6. // 创建日期:2005年5月19日
  7. // 修改人:
  8. // 修改日期:
  9. // 版本
  10. #include "StdAfx.h"
  11. #include ".waveout.h"
  12. //////////////////////////////////////////////////////////////////////////
  13. // 构造函数
  14. CWaveOut::CWaveOut(void)
  15. {
  16. this->m_hWnd = 0;
  17. this->m_hWaveOut = 0;
  18. // 设置标志位
  19. this->m_bPlaying = FALSE;
  20. this->m_bPaused = FALSE;
  21. }
  22. //////////////////////////////////////////////////////////////////////////
  23. // 析构函数
  24. CWaveOut::~CWaveOut(void)
  25. {
  26. this->Stop();
  27. }
  28. //////////////////////////////////////////////////////////////////////////
  29. // 打开输出设备,设置回调窗口
  30. BOOL CWaveOut::Init(WAVEFORMATEX fmt, DWORD hWnd)
  31. {
  32. MMRESULT nResult = 0;
  33. BOOL bRet = false;
  34. // 检查是否有可用的输出设备
  35. // 若设备已经打开,则返回,不进行任何操作
  36. if (this->IsDevAvailable())
  37. {
  38. // 设置format
  39. this->m_format = fmt;
  40. // 设置回调窗口
  41. this->m_hWnd = hWnd;
  42. // 打开输出设备
  43. nResult = waveOutOpen(&this->m_hWaveOut, WAVE_MAPPER, &this->m_format, 
  44. this->m_hWnd, 0, CALLBACK_WINDOW);
  45. bRet = (nResult == MMSYSERR_NOERROR);
  46. }
  47. return bRet;
  48. }
  49. //////////////////////////////////////////////////////////////////////////
  50. // 回收资源
  51. void CWaveOut::Dispose()
  52. {
  53. this->m_hWnd = 0;
  54. this->m_hWaveOut = 0;
  55. // 设置标志位
  56. this->m_bPlaying = FALSE;
  57. this->m_bPaused = FALSE;
  58. }
  59. //////////////////////////////////////////////////////////////////////////
  60. // 停止播放
  61. void CWaveOut::Stop()
  62. {
  63. // 停止播放
  64. waveOutReset(this->m_hWaveOut);
  65. // 设定设备和播放状态
  66. this->m_bPlaying = FALSE;
  67. this->m_bPaused = FALSE;
  68. }
  69. //////////////////////////////////////////////////////////////////////////
  70. // 关闭输出设备
  71. void CWaveOut::CloseDev()
  72. {
  73. // 关闭输出设备
  74. waveOutClose(this->m_hWaveOut);
  75. }
  76. //////////////////////////////////////////////////////////////////////////
  77. // 是否存在可用的输出设备
  78. BOOL CWaveOut::IsDevAvailable() const
  79. {
  80. return (waveOutGetNumDevs() > 0);
  81. }
  82. //////////////////////////////////////////////////////////////////////////
  83. // 修改当前状态为正在播放
  84. void CWaveOut::Start()
  85. {
  86. // 标识正在播放
  87. this->m_bPlaying = TRUE;
  88. this->m_bPaused = FALSE;
  89. }
  90. //////////////////////////////////////////////////////////////////////////
  91. // 暂停播放
  92. void CWaveOut::Pause()
  93. {
  94. if (this->m_bPlaying)
  95. {
  96. waveOutPause(this->m_hWaveOut);
  97. this->m_bPlaying = FALSE;
  98. this->m_bPaused = TRUE;
  99. }
  100. }
  101. //////////////////////////////////////////////////////////////////////////
  102. // 恢复播放暂停的音频数据
  103. void CWaveOut::Resume()
  104. {
  105. if (this->m_bPaused)
  106. {
  107. waveOutRestart(this->m_hWaveOut);
  108. this->m_bPlaying = TRUE;
  109. this->m_bPaused = FALSE;
  110. }
  111. }