如何使用FMOD实现两个声音的循环播放

brian_zhao 2011-04-09 12:51:07
我想通过回调函数来判断FMOD_CHANNEL_CALLBACKTYPE_END的状态,确定一个声音是否结束,如果一个声音结束,马上播放另一个声音。主程序中使用WaitForSingleObject (hSoundOverEvent, INFINITE)来等待回调函数的状态。
现在的问题是:主程序停在WaitForSingleObject处,不能实现循环播放。查看帮助文档,说channel::setCallback必须依赖System::update,也就是说只有当声音播放完毕后你还要调用System::update,才能得到FMOD_CHANNEL_CALLBACKTYPE_END的状态。可是如果这样就失去了WaitForSingleObject的意义,因为其不能自动触发。
请问:怎么才能用FMOD实现两个声音的循环播放呢?(注:不用播放列表技术。)代码如下

include <windows.h>
#include <stdio.h>
#include <conio.h>

#include "../../api/inc/fmod.hpp"
#include "../../api/inc/fmod_errors.h"

void ERRCHECK(FMOD_RESULT result)
{
if (result != FMOD_OK)
{
printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
exit(-1);
}
}

HANDLE hSoundOverEvent = NULL;

/* 一个声音片段播放完毕时回调*/
FMOD_RESULT F_CALLBACK callbackChannel(FMOD_CHANNEL * channel, FMOD_CHANNEL_CALLBACKTYPE type, void * commanddata1, void * commanddata2)
{
FMOD::Channel *cppchannel = (FMOD::Channel *)channel;

if(type == FMOD_CHANNEL_CALLBACKTYPE_END)
{
SetEvent(hSoundOverEvent);
};

return FMOD_OK;
}

int main(int argc, char *argv[])
{

/************************************
Create sound system
***********************************/

FMOD::System *system;
FMOD::Sound *sound1, *sound2;
FMOD::Channel *channel;
FMOD_RESULT result;
int key;
FMOD_MODE modeTyre = FMOD_LOOP_OFF | FMOD_SOFTWARE;

result = FMOD::System_Create(&system);
ERRCHECK(result);

result = system->init(32, FMOD_INIT_NORMAL, 0);
ERRCHECK(result);

result = system->createSound("../wavesource/v40_20ms.wav", modeTyre, 0, &sound1);
ERRCHECK(result);
result = system->createSound("../wavesource/v80_20ms.wav", modeTyre, 0, &sound2);
ERRCHECK(result);
result = system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);
ERRCHECK(result);

int i= 1;

do
{
if(_kbhit())
{
key = getch();
}
if((i & 1) == 0)
result = system->playSound(FMOD_CHANNEL_FREE, sound2, false, &channel);
else
result = system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);
i +=1;
channel->setCallback(callbackChannel);
system->update();
WaitForSingleObject (hSoundOverEvent, INFINITE);
} while (key != 27);


/* Shut down */

result = sound1->release();
ERRCHECK(result);
result = sound2->release();
ERRCHECK(result);
result = system->close();
ERRCHECK(result);
result = system->release();

return 0;
}
...全文
256 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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