使用 FMOD 低级 API 中的共振音频时空间化中断

Posted

技术标签:

【中文标题】使用 FMOD 低级 API 中的共振音频时空间化中断【英文标题】:Broken spatialization when using Resonance Audio from FMOD Low Level API 【发布时间】:2018-11-18 06:51:34 【问题描述】:

在为 FMOD 使用 Resonance Audio 插件并尝试在没有 FMOD Studio 的情况下手动设置 DSP 时,我正在努力启用 Resonance Audio 声音空间化。

我的插件加载和 DSP 设置代码:

auto system = audio->fmod->system; //instance of FMOD::System
unsigned int resHandle;
CHECK_ERR(system->loadPlugin("../lib/resonanceaudio.dll", &resHandle, 0));

//0 = Resonance Audio Listener
//1 = Resonance Audio Soundfield
//2 = Resonance Audio Source
unsigned int listenerPlugin, sourcePlugin;
system->getNestedPlugin(resHandle, 0, &listenerPlugin);
system->getNestedPlugin(resHandle, 2, &sourcePlugin);

FMOD::DSP* listenerDsp;
CHECK_ERR(system->createDSPByPlugin(listenerPlugin, &listenerDsp));
FMOD::DSP* sourceDsp;
CHECK_ERR(system->createDSPByPlugin(sourcePlugin, &sourceDsp));

//This a channel group routed from the Master group
//I want to spatialize all sounds which are played in this group
FMOD::ChannelGroup *worldGroup = nullptr;
system->createChannelGroup("World", &worldGroup);
FMOD::ChannelGroup *masterGroup = nullptr;
system->getMasterChannelGroup(&masterGroup);
masterGroup->addGroup(worldGroup);

//Adding Resonance Audio dsps to the group
worldGroup->addDsp(0, sourceDsp);
worldGroup->addDsp(1, listenerDsp);

//Setting listener's position at (0, 0, 0)
system->set3DListenerAttributes(0, FMOD_VECTOR0, 0, 0, 0, FMOD_VECTOR0, 0, 1, FMOD_VECTOR0, 1, 0);

<loading sound> 

FMOD::Channel* channel = nullptr;
CHECK_ERR(system->playSound(sound, worldGroup, true, &channel));
channel->setMode(FMOD_3D);
channel->set3DAttributes(FMOD_VECTOR4, 0, 3, nullptr);
channel->setPaused(false);

<somewhere in update loop>
   system->update();

但在这一切之后,我根本听不到任何声音。

我认为错误是在我这边,所以我尝试在 FMOD Studio 中重复相同的设置。正如我在代码中所做的那样,我将 Resonance Audio Source 放置在事件主音轨的 Resonance Audio Listener 之前,一切正常(至少在 FMOD Studio 中,没有在游戏中尝试过)。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

我认为你应该打电话:

System::getMasterChannelGroup

获取master channel group 的实例,然后将 Resonance 音频 DSP 分配给主通道组。

//This a channel group routed from the Master group
//I want to spatialize all sounds which are played in this group
FMOD::ChannelGroup *worldGroup>;
<worldGroup setup>

因此,我不完全确定您的意思,因为我看不到您从主通道设置 ChannelGroup 路由的位置。如果我提供的解决方案不正确,请进一步了解我上面提到的代码。

【讨论】:

我更新了代码以显示 worldGroup 的设置方式。我还尝试将 Resonance Audio dsps 直接添加到 Master 组,但不幸的是它没有用。结果保持不变。 将 DSP 直接添加到主组时的错误消息究竟是什么? 当我在索引 0 处添加源 DSP 并在索引 1 处添加侦听器 DSP 时,在主组上播放的通道变得听不见,我什么也听不到。但是所有函数调用都返回 FMOD_OK 所以没有错误信息 关于将声音添加到主组时被剪切的问题,我相信您在覆盖索引 1 according to the FMOD docs 时会影响主通道推子/混音器。那么也许值得将您的 DSP 添加到索引 2,3 中? 我在为 dsp 指定索引时尝试使用 FMOD_CHANNELCONTROL_DSP_TAIL 并尝试将 dsp 放入索引 2,3,在这两种情况下都导致完全没有音频

以上是关于使用 FMOD 低级 API 中的共振音频时空间化中断的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中低级音频的最佳 API?

在 LibGDX 中使用 FMOD 进行高级音频管理

:使用fmod对音频进行变调处理

:使用fmod对音频进行变调处理

低级音频编程

音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图