播放 Wave 资源






2.48/5 (11投票s)
使用低级音频 API 播放波形资源。
引言
如果您的应用程序需要使用**低级音频 API** 播放**波形资源**,请按照下面的“使用代码”部分操作。
使用代码
很简单:只需包含、实例化、加载和播放即可。
将“RscWaveOut.h”和“RscWaveOut.cpp”添加到您的项目中(对于 22050Hz、8bps、Mono 以外的格式,请调整 CRscWaveOut
类中的一些值;这很容易完成)。转到项目设置 > 链接 > 添加 "winmm.lib"。
- 添加一个成员
- 加载波形资源(例如,在
OnInitDialog()
或主类的构造函数中) - 播放波形(也许在按钮下)
CRscWaveOut m_RscWaveOut;
m_RscWaveOut.LoadWaveResource(IDR_WAVE_TICK_HIGH, AfxGetApp()->m_hInstance);
m_RscWaveOut.PlayWave();
背景
情况是我的应用程序必须将 Wave 文件作为资源包含,并快速频繁地播放它们。 还有其他高级/中级音频 API,例如 sndPlaySound
函数,但我注意到 sndPlaySound
每次播放 Wave 时都会创建和销毁一个线程。 我猜测这是我的应用程序中明显的音频延迟的原因之一。 我尝试使用低级音频 API - waveOut~
和 mmio~
函数。 幸运的是,我可以将所有必要的函数封装在一个类 CRscWaveOut
中,您可以将其快速应用于您的项目。
CRscWaveOut
类可能很有用
- 如果 Wave 文件必须位于项目的资源中。
- 如果使用低级音频 API 播放必须快速且精确地控制时间。
虽然我没有在超过 100 毫秒的 Wave 样本上测试过,但我认为该类将成功工作。 如果出现问题,请仔细查看 CRscWaveOut
的 CallBack
函数。 通过处理不仅仅提供的消息(例如,MM_WOM_DONE
),您可以轻松处理较长的 Wave 资源缓冲。
该示例是一个 MFC 项目,但核心 CRscWaveOut
类是基于 Win32 API 构建的,因此您可以在 ATL、WTL 和 Win32 项目中使用该类。 例如,我将部分代码用于 www.groovedive.com 的节拍器 ActiveX 中的快速声音生成。
历史
- 2008.06.23:创建。