FMOD - невозможно воспроизвести одновременные звуки - PullRequest
0 голосов
/ 05 декабря 2011

Мне интересно, делаю ли я что-то не так.Я настроил свой класс 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 ]

1 голос
/ 05 декабря 2011

Я не знаю вашей проблемы, но я могу порекомендовать использовать массив для хранения значений 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);
0 голосов
/ 06 декабря 2011

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

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

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

...