FMOD - 无法同时播放声音

时间:2011-12-05 13:55:41

标签: c++ fmod

我想知道我做错了什么。我已经设置了我的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)

....

但即使在不同的频道上播放,其他非循环声音也会随机中断?

我非常感谢您提供的任何帮助

提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

我不知道您的问题,但我可以建议使用数组存储chn1 .. chrN值,以便您在代码中避免所有这些if只是这样做:

  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);

答案 1 :(得分:0)

我解决了这个问题。当我使用1024个通道而不是7个

初始化FMOD时,此设置实际上工作正常
fmodsys->init(1024, FMOD_INIT_NORMAL, 0);

频道显然重量很轻,使用后无需清洁,因此他们建议在论坛上始终在PC上初始化1024.