Я пытаюсь перенести старую игру с открытым исходным кодом 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 разоряется, но я бы хотел, чтобы его доказали неправильно.
Возможно, вы посмотрите на [bass] (http://www.un4seen.com/). –
Спасибо за информацию. Мне было трудно найти надежных соперников для воспроизведения MOD в 2015 году :) Сложность FMOD, по-видимому, объясняется необычными частотами дискретизации в WAV - связанный был 22254 Гц (классические звуки Mac OS использовали эту частоту), и у меня есть другой звук на частоте 11127 Гц который также проявляет сбой. Я могу обойти проблему, просто передискретируя WAV. Раздражает, но не стоит переписывать. – StilesCrisis
Я никогда не использовал FMOD, но я удивлен, что у него нет функции повторной выборки. Бас и басмод-библиотеки были целыми веками и могут делать практически все, что вы можете себе представить. Я пробовал несколько других на протяжении многих лет, но еще не нашел ничего хорошего, особенно для воспроизведения файлов мод. :) –