用waveoutwrite播放wav文件时,怎样实现循环播放?

shadowWind 2004-08-07 05:01:28
我想找一个播放结束时触发的消息函数,
在函数内部判断循环播放的标志变量,如需循环就再执行一遍waveoutwrite,

这样可行吗?
播放结束时,有没有触发什么消息?

多谢!

我尝试添加了
afx_msg void OnMMWomDone(UINT wParam, LONG lParam);
ON_MESSAGE(MM_WOM_DONE,OnMMWomDone)
并在内部设了断点,可是这个消息函数始终没被触发。
...全文
288 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowWind 2004-08-09
  • 打赏
  • 举报
回复
不好意思
昨天没有上网

搞定了,
多谢
kvw3000 2004-08-07
  • 打赏
  • 举报
回复

MMRESULT waveOutOpen(
LPHWAVEOUT phwo,
UINT_PTR uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD_PTR dwCallback,
DWORD_PTR dwCallbackInstance,
DWORD fdwOpen
);

要处理消息,必须在这个函数中设置好最后三个参数,参考msdn:
dwCallback
Pointer to a fixed callback function, an event handle, a handle to a window, or the identifier of a thread to be called during waveform-audio playback to process messages related to the progress of the playback. If no callback function is required, this value can be zero. For more information on the callback function, see waveOutProc.

dwCallbackInstance
User-instance data passed to the callback mechanism. This parameter is not used with the window callback mechanism.

fdwopen
CALLBACK_EVENT The dwCallback parameter is an event handle.
CALLBACK_FUNCTION The dwCallback parameter is a callback procedure address.
CALLBACK_NULL No callback mechanism. This is the default setting.
CALLBACK_THREAD The dwCallback parameter is a thread identifier.
CALLBACK_WINDOW The dwCallback parameter is a window handle.

在我给你的代码中找到下面一段,作出更改,下面给出了更改后的代码,其中m_hWnd为处理消息的窗口句柄。更改后就可以按照你所说的处理消息了。

//检查音频输出设备是否能播放指定的音频文件
if (waveOutOpen(&hWaveOut, WAVE_MAPPER, lpFormat, (ULONG)m_hWnd, NULL, CALLBACK_WINDOW) != 0)
{
//Failed to OPEN the wave out devices
ShowMsg("Open the wave out devices failed!");
OnStop();
return;
}
AthlonxpX86 2004-08-07
  • 打赏
  • 举报
回复
用这种方式播放,WAV缓冲区是由你自己控制的,每当驱动程序将缓冲区的数据播放完,都会在回调函数中要求你提交缓冲区,因此要实现循环播放还用我多说?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧