FMOD - 无法同时播放声音

Posted

技术标签:

【中文标题】FMOD - 无法同时播放声音【英文标题】:FMOD - Unable to play simultaneous sounds 【发布时间】:2011-12-05 13:55:40 【问题描述】:

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

....

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

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

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

【问题讨论】:

【参考方案1】:

我不知道您的问题,但我可以建议使用数组来存储 chn1..chrN 值,这样您只需执行以下操作即可在代码中避免所有这些 ifs:

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

【讨论】:

谢谢,这是一个我很乐意考虑的解决方案,一旦我弄清楚为什么渠道无法正常工作..【参考方案2】:

我解决了这个问题。当我使用 1024 个通道而不是 7 个通道初始化 FMOD 时,此设置实际上工作正常

fmodsys->init(1024, FMOD_INIT_NORMAL, 0);

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

【讨论】:

以上是关于FMOD - 无法同时播放声音的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中同时播放多个声音?

使用 AVAudioPlayer 同时播放多个声音

同时播放两个声音c#

在javascript中同时播放多个声音

同时播放三个声音c#

ALSA 需要 MMAP 来在我的游戏中同时播放即时声音吗?