gpt4 book ai didi

macos - FMOD Ex 掉落声音,最终变得无声

转载 作者:行者123 更新时间:2023-12-01 22:53:08 27 4
gpt4 key购买 nike

我正在尝试将一个旧的开源 FMOD 3 游戏(糖果危机)移植到 OS X 上最新版本的 FMOD Ex 4。它的声音需求非常简单——它播放 WAV,有时改变它们的频率或扬声器混合,还播放 MOD 跟踪器音乐,有时会改变速度。我发现游戏一开始运行良好,但在几分钟后,它开始提前截断声音,然后音乐失去 channel 并最终停止,然后随着时间的推移所有声音都停止了。如果我减少 FMOD 可用的 channel 数,我可以使问题更快地重现。

即使我从不播放音乐文件,我也可能会出现声音被截断/缺失的问题,但音乐肯定会让事情变得更糟。我还尝试注释掉调整声音频率和扬声器混音的代码,但这不是问题所在。

我在每一帧调用 update()

以下是我使用 FMOD 播放 WAV 的全部交互:

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

这就是我玩 MOD 的方式。

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 失败了,但我很乐意被证明是错误的。

最佳答案

听起来您的音乐需要设置为比其他声音更高的优先级。请记住,数字越小越重要。我认为您可以在 channel 上设置优先级。

关于macos - FMOD Ex 掉落声音,最终变得无声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com