2015-02-21 6 views
2

Я пытаюсь перенести старую игру с открытым исходным кодом FMOD 3 (Candy Crisis) в последнюю версию FMOD Ex 4 на OS X. Его звуковые потребности очень просты - он играет WAV, иногда меняя их частоту или комбинацию динамиков, а также воспроизводит музыку трекера MOD, иногда меняя скорость. Я нахожу, что игра работает нормально сначала, но в течение нескольких минут она начинает усекать звуки рано, затем музыка теряет каналы и в конце концов останавливается, а затем со временем весь звук прекращается. Я могу заставить проблему воспроизводить быстрее, если я уменьшу количество каналов, доступных для FMOD.FMOD Ex отбрасывает звуки, в конечном итоге исчезает

Я могу получить усеченную/отсутствующую звуковую проблему, даже если я никогда не проигрываю музыкальный файл, но музыка определенно ухудшает ситуацию. Я также пробовал комментировать код, который регулирует частоту звука и сочетание динамиков, и это не проблема.

Я звоню update() каждый рама.

Вот совокупность моих взаимодействий с FMOD играть WAVs:

void InitSound(void) 
{ 
    FMOD_RESULT result = FMOD::System_Create(&g_fmod); 
    FMOD_ERRCHECK(result); 

    unsigned int version; 
    result = g_fmod->getVersion(&version); 
    FMOD_ERRCHECK(result); 

    if (version < FMOD_VERSION) 
    { 
     printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); 
     abort(); 
    } 

    result = g_fmod->init(8 /* was originally 64, but 8 repros the issue faster */, FMOD_INIT_NORMAL, 0); 
    FMOD_ERRCHECK(result); 

    for (int index=0; index<kNumSounds; index++) 
    { 
     result = g_fmod->createSound(QuickResourceName("snd", index+128, ".wav"), FMOD_DEFAULT, 0, &s_sound[index]); 
     FMOD_ERRCHECK(result); 
    } 
} 


void PlayMono(short which) 
{ 
    if (soundOn) 
    { 
     FMOD_RESULT  result = g_fmod->playSound(FMOD_CHANNEL_FREE, s_sound[which], false, NULL); 
     FMOD_ERRCHECK(result); 
    } 
} 

void PlayStereoFrequency(short player, short which, short freq) 
{ 
    if (soundOn) 
    { 
     FMOD::Channel* channel = NULL; 
     FMOD_RESULT  result = g_fmod->playSound(FMOD_CHANNEL_FREE, s_sound[which], true, &channel); 
     FMOD_ERRCHECK(result); 

     result = channel->setSpeakerMix(player, 1.0f - player, 0, 0, 0, 0, 0, 0); 
     FMOD_ERRCHECK(result); 

     float channelFrequency; 
     result = s_sound[which]->getDefaults(&channelFrequency, NULL, NULL, NULL); 
     FMOD_ERRCHECK(result); 

     result = channel->setFrequency((channelFrequency * (16 + freq))/16); 
     FMOD_ERRCHECK(result); 

     result = channel->setPaused(false); 
     FMOD_ERRCHECK(result); 
    } 
} 

void UpdateSound() 
{ 
    g_fmod->update(); 
} 

А вот как я играю моды.

void ChooseMusic(short which) 
{ 
    if(musicSelection >= 0 && musicSelection <= k_songs) 
    { 
     s_musicChannel->stop(); 
     s_musicChannel = NULL; 

     s_musicModule->release(); 
     s_musicModule = NULL; 

     musicSelection = -1; 
    } 

    if (which >= 0 && which <= k_songs) 
    { 
     FMOD_RESULT result = g_fmod->createSound(QuickResourceName("mod", which+128, ""), FMOD_DEFAULT, 0, &s_musicModule); 
     FMOD_ERRCHECK(result); 

     result = g_fmod->playSound(FMOD_CHANNEL_FREE, s_musicModule, true, &s_musicChannel); 
     FMOD_ERRCHECK(result); 

     EnableMusic(musicOn); 
     s_musicModule->setLoopCount(-1); 
     s_musicChannel->setPaused(false); 

     musicSelection = which; 
     s_musicPaused = 0; 
    } 
} 

Если кто-то хочет поэкспериментировать с этим, сообщите мне, и я загружу проект где-нибудь. Чувство моего кишечника - это то, что FMOD разоряется, но я бы хотел, чтобы его доказали неправильно.

ответ

2

Каждый раз, когда я воспроизвожу следующий WAV, FMOD теряет один канал навсегда. Я могу воспроизвести это проигрывание канала в примере «playound», если я заменил существующий jaguar.wav своим файлом.

https://drive.google.com/file/d/0B1eDRY8sV_a9SXMyNktXbWZOYWs/view?usp=sharing

Я связался с Firelight и получил этот ответ. Очевидно, WAV могут включать в себя команду циклирования! Не имел представления.

Здравствуйте Джон,

Я принял взглянуть на двух файлов, которые вы предоставили. Оба файла завершают с 2-мя образцами бесконечной области цикла.

FMOD 4 (и FMOD 5 по этому вопросу) будут видеть область цикла в файле и автоматически включить FMOD_LOOP_NORMAL, если вы не указан какой-либо режим цикла. Предполагая, что вы хотите, чтобы однократное поведение просто проходило в FMOD_LOOP_OFF, когда вы создаете звук.

С наилучшими пожеланиями, Блок Мэтью | Старший инженер Платформа

Технически такое поведение противоречит документированный поведение FMOD_DEFAULT (которое указано подразумевает FMOD_LOOP_OFF), поэтому они планируют улучшить документацию здесь.

+1

Возможно, вы посмотрите на [bass] (http://www.un4seen.com/). –

+0

Спасибо за информацию. Мне было трудно найти надежных соперников для воспроизведения MOD в 2015 году :) Сложность FMOD, по-видимому, объясняется необычными частотами дискретизации в WAV - связанный был 22254 Гц (классические звуки Mac OS использовали эту частоту), и у меня есть другой звук на частоте 11127 Гц который также проявляет сбой. Я могу обойти проблему, просто передискретируя WAV. Раздражает, но не стоит переписывать. – StilesCrisis

+0

Я никогда не использовал FMOD, но я удивлен, что у него нет функции повторной выборки. Бас и басмод-библиотеки были целыми веками и могут делать практически все, что вы можете себе представить. Я пробовал несколько других на протяжении многих лет, но еще не нашел ничего хорошего, особенно для воспроизведения файлов мод. :) –

2

Похоже, ваша музыка должна быть установлена ​​как более высокий приоритет, чем ваши другие звуки. Помните, что более низкие цифры важнее. Я думаю, вы можете просто установить приоритет на канале.

+0

Это работало как шарм. Я не понимал, что WAV по умолчанию имеют равный приоритет с MOD, то есть они могут украсть канал. Спасибо! – StilesCrisis

+0

Ну, это в основном работало. Музыка никогда не прерывается. Но если я запустил игру достаточно долго, в конечном итоге все WAV перестанут играть; но музыка никогда не останавливается. FMOD не возвращает никаких ошибок. – StilesCrisis

2

Основываясь на полученном образце волны, FMOD ведет себя правильно, как кажется, вы выяснили. Образец имеет цикл, который соблюдается FMOD, и последние образцы просто повторяются навсегда. Хотя это бесполезно, это правильно, и дисперсия в образцах настолько мала, что не слышно.В то время как часть оригинальной спецификации для формата волны не была включена, расширенная информация была добавлена ​​позже для поддержки метаданных, таких как автор, заголовок, комментарии и несколько точек цикла.

Лучше всего проверить все исходные активы для тех, которые содержат информацию о цикле. Простое воспроизведение всех звуков без информации о петле, вероятно, не лучшее решение. Некоторые петли могут быть преднамеренными. У тех, у кого есть код, который их останавливает. Как правило, в игре вся форма волны зацикливается, когда требуется цикл. Затем вы можете написать или использовать инструмент, который будет лишать информацию о петле. Если вы пишете свой собственный инструмент, я бы рекомендовал передискретизировать звук на собственную частоту дискретизации на выходе оборудования. Вам нужно было бы обеспечить, чтобы ваш ресамплер был точным (без сдвига во времени) и не вводил шум.

Исторически, некоторые игровые системы имели секцию в конце звука с тишиной и точкой петли, установленной на этой области. Незначительная причина этого заключалась в сокращении всплывающих окон, которые могут возникнуть в конце звука в аппаратном аудиоканале.

Любопытно, что последние 16 образцов вашего .wav выглядят как мусор, и мне интересно, были ли использованы средства .wav, которые вы используете, из источника, предназначенного для игровой консоли, и именно там появилась информация об фиктивном контуре также.

Это был бы комментарий, но моя скромная репутация не позволяет этого.

+0

Я автор WAV, поэтому мне не нужно беспокоиться о том, что данные цикла являются преднамеренными. Это не так :) Данные были преобразованы из ресурсов Mac 'snd' еще в 2001 году; к сожалению, я не помню, какой инструмент я использовал. Оригинальная игра не основывалась на каких-либо специальных трюках «snd». Они просто должны быть простыми звуками. – StilesCrisis

+0

@StilesCrisis К счастью, вы знаете источник. Разве это WAV уникально в точке петли? Кроме того, последние 16 образцов выглядят как шум для вас? Звуки с одним выстрелом обычно имеют затухание до 0, поэтому они не появляются. Многие (включая более старые) системы и драйверы звуковых карт автоматически применяют эффект типа ADSR (атака-распад-сустейн-релиз) к воспроизведению WAV, что в основном исключает появление всплесков из формы сигнала, не начинающейся или заканчивающейся на 0. Возможно, вы захотите сделать быстрый точечные проверки некоторых из ваших других источников волн. – ChocoBilly

 Смежные вопросы

  • Нет связанных вопросов^_^