65.9K
CodeProject 正在变化。 阅读更多。
Home

播放 Wave 资源

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.48/5 (11投票s)

2008年6月22日

CPOL

2分钟阅读

viewsIcon

34628

downloadIcon

1435

使用低级音频 API 播放波形资源。

引言

如果您的应用程序需要使用**低级音频 API** 播放**波形资源**,请按照下面的“使用代码”部分操作。

使用代码

很简单:只需包含、实例化、加载和播放即可。

将“RscWaveOut.h”和“RscWaveOut.cpp”添加到您的项目中(对于 22050Hz、8bps、Mono 以外的格式,请调整 CRscWaveOut 类中的一些值;这很容易完成)。转到项目设置 > 链接 > 添加 "winmm.lib"。

  1. 添加一个成员
  2. CRscWaveOut m_RscWaveOut;
  3. 加载波形资源(例如,在 OnInitDialog() 或主类的构造函数中)
  4. m_RscWaveOut.LoadWaveResource(IDR_WAVE_TICK_HIGH, AfxGetApp()->m_hInstance);
  5. 播放波形(也许在按钮下)
  6. m_RscWaveOut.PlayWave();

背景

情况是我的应用程序必须将 Wave 文件作为资源包含,并快速频繁地播放它们。 还有其他高级/中级音频 API,例如 sndPlaySound 函数,但我注意到 sndPlaySound 每次播放 Wave 时都会创建和销毁一个线程。 我猜测这是我的应用程序中明显的音频延迟的原因之一。 我尝试使用低级音频 API - waveOut~mmio~ 函数。 幸运的是,我可以将所有必要的函数封装在一个类 CRscWaveOut 中,您可以将其快速应用于您的项目。

CRscWaveOut 类可能很有用

  • 如果 Wave 文件必须位于项目的资源中。
  • 如果使用低级音频 API 播放必须快速且精确地控制时间。

虽然我没有在超过 100 毫秒的 Wave 样本上测试过,但我认为该类将成功工作。 如果出现问题,请仔细查看 CRscWaveOutCallBack 函数。 通过处理不仅仅提供的消息(例如,MM_WOM_DONE),您可以轻松处理较长的 Wave 资源缓冲。

该示例是一个 MFC 项目,但核心 CRscWaveOut 类是基于 Win32 API 构建的,因此您可以在 ATL、WTL 和 Win32 项目中使用该类。 例如,我将部分代码用于 www.groovedive.com 的节拍器 ActiveX 中的快速声音生成。

历史

  • 2008.06.23:创建。
© . All rights reserved.