FMOD -无法播放同步声音
FMOD - Unable to play simultaneous sounds
我想知道我是否做错了什么。我已经将SoundManager类设置为5个不同的通道,在我的游戏中有些声音可能会同时播放,比如开火的声音和敌人"受伤"的声音……这就是我如何设置FMOD和我调用的函数来播放声音的方式,它们总是重绕到开始:
void SoundMgr::init(){
System_Create(&fmodsys);
fmodsys->init(5, FMOD_INIT_NORMAL, 0)
}
void SoundMgr::play(string name, int chan){
if(chan == 1){
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn1);
chn1->setMode(FMOD_LOOP_OFF);
chn1->setPosition(0, FMOD_TIMEUNIT_PCM);
chn1->setPaused(false);
} else if(chan == 2){
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn2);
chn2->setMode(FMOD_LOOP_OFF);
chn2->setPosition(0, FMOD_TIMEUNIT_PCM);
chn2->setPaused(false);
} else if(chan == 3){
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn3);
chn3->setMode(FMOD_LOOP_OFF);
chn3->setPosition(0, FMOD_TIMEUNIT_PCM);
chn3->setPaused(false);
} else if(chan == 4){
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn4);
chn4->setMode(FMOD_LOOP_OFF);
chn4->setPosition(0, FMOD_TIMEUNIT_PCM);
chn4->setPaused(false);
} else if(chan == 5){
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn5);
chn5->setMode(FMOD_LOOP_OFF);
chn5->setPosition(0, FMOD_TIMEUNIT_PCM);
chn5->setPaused(false);
}
}
在游戏中,我有(这只是一个例子,但它发生在大多数声音中):
....
sMgr->play("gunshot", 1);
....
sMgr->play("rat_hurt", 3);
...
然而,结果是非常随机的,两种声音很少同时播放,而大多数时候两种声音中只有一种播放…
我还有一个循环模式:
void SoundMgr::playRepeat(string name, int chan){
if(chan == 1){
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn1);
chn1->setMode(FMOD_LOOP_NORMAL);
chn1->setPosition(0, FMOD_TIMEUNIT_PCM);
chn1->setPaused(false);
} else if(chan == 2)
....
但这也会被其他非循环声音随机打断,即使在不同的频道上播放?
如果您能提供任何帮助,我将非常感谢。
对于您可能提供的任何帮助,我提前表示感谢。
我不知道你的问题,但我可以建议使用数组来存储chn1
..chrN
值,这样你就可以避免所有这些if
s在你的代码,只要做:
assert(chan >= 0 && chan < sizeof(channel_array));
channel& the_chn = channel_array[chan];
fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &the_chn);
the_chn->setMode(FMOD_LOOP_NORMAL);
the_chn->setPosition(0, FMOD_TIMEUNIT_PCM);
the_chn->setPaused(false);
我解决了这个问题。当我用1024通道而不是7通道初始化FMOD时,这个设置实际上工作得很好
fmodsys->init(1024, FMOD_INIT_NORMAL, 0);
通道显然很轻,使用后不需要清理,因此他们在论坛上建议在PC上始终初始化1024。
相关文章:
- Xaudio2在更改缓冲区或循环时弹出声音
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 如何更改'a'声音?
- 在C++中同步线程
- 如何收听Windows当前正在播放的声音?
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- 如何在 c++ 中循环中使用频率变化的声音?
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- FMOD -无法播放同步声音