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)

....

Но это также случайно прерывается другими незацикленными звуками, даже если они воспроизводятся на разных каналах?

Я был бы очень признателен за любую помощь, которую вы можете предоставить

Заранее благодарим вас за любую помощь, которую вы можете оказать.


person Alex    schedule 05.12.2011    source источник


Ответы (2)


Я не знаю вашей проблемы, но я могу порекомендовать использовать массив для хранения значений 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);
person Giovanni Funchal    schedule 05.12.2011
comment
спасибо, это решение, которое я с удовольствием обдумаю, как только выясню, почему каналы не работают должным образом .. - person Alex; 05.12.2011

Я решил проблему. Эта настройка на самом деле работает нормально, когда я инициализирую FMOD с 1024 каналами вместо 7.

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

Каналы, по-видимому, очень легкие, и их не нужно чистить после использования, поэтому на своем форуме они рекомендуют всегда инициализировать 1024 на ПК.

person Alex    schedule 06.12.2011