1

我正在尝试在使用 Ogre 的游戏中使用 FMOD 设置 3D 声音。声音侦听器连接到在样条曲线上运行的相机。我在播放器上附加了脚步声,音量应由播放器与相机的距离决定。

脚步声的作用就好像声音听者没有从其起始位置移动一样。在关卡开始时,脚步声很响,当你离开开始时,它们会变得更安静,直到你再也听不到它们了。如果你跑回到起点,它们会变得更响亮。但是,声音侦听器的场景节点的位置正在更新并与相机保持同步。

在代码中,以下行的每一帧都会生成一个 FMOD 错误:

result = m_system->set3DListenerAttributes(0, &pos, &vel, &forward, &up);

结果总是返回 FMOD_ERR_INVALID_HANDLE,并带有以下错误字符串 - “使用了无效的对象句柄”。我不知道为什么会产生这个错误。作为参数传入的所有 FMOD_VECTOR 都已初始化,我似乎正确设置了系统。代码在不同的类中到处都是,但这里是重要的部分:

// Initialise FMOD system
result = m_system->init(4093, FMOD_INIT_3D_RIGHTHANDED, 0);
result = m_system->set3DSettings(1.0f, 1.0f, 1.0f);

// Create sound
FMOD_MODE mode = FMOD_SOFTWARE;
if(a_positional)
{
    mode |= FMOD_3D;
}
FMOD_CREATESOUNDEXINFO info;
memset(&info, 0, sizeof(FMOD_CREATESOUNDEXINFO));
info.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
r = sys->_getFMODSystem()->createSound(a_file.c_str(), mode, &info, &retVal);

// Update sound listener
FMOD_VECTOR pos, vel, forward, up;

pos.x = m_sceneNode->getParentSceneNode()->_getDerivedPosition().x;
pos.y = m_sceneNode->getParentSceneNode()->_getDerivedPosition().y;
pos.z = m_sceneNode->getParentSceneNode()->_getDerivedPosition().z;

vel.x = 0;
vel.y = 0;
vel.z = 0;

forward.x = 0;
forward.y = 0;
forward.z = 1;

up.x = 0;
up.y = 1;
up.z = 0;

result = m_system->set3DListenerAttributes(0, &pos, &vel, &forward, &up);
// FMOD error: (36) An invalid object handle was used.

关于为什么“结果”返回此错误的任何想法?我假设这是 3D 声音无法正确播放的原因。

4

1 回答 1

2

无效句柄错误 (FMOD_ERR_INVALID_HANDLE) 是指您正在调用函数的对象,在这种情况下,这意味着 m_system 句柄无效。

首先,我注意到您省略了创建 FMOD::System 对象的代码,您能否确认您正在执行以下操作:

result = FMOD::System_Create(&m_system);

其次,如果您在某处拥有该代码,您是否可以验证 m_system 的值在创建和使用之间保持不变(也许某些东西正在破坏句柄)。

最后(从长远来看)如果您的标头和库不同步,您可能会收到不同的错误消息,请确保您使用的标头和库都来自相同版本的 FMOD。

额外注意,尝试与 FMOD 的日志记录版本链接,您应该在 TTY 上获得一些有用的调试输出,这可能对您的情况有所帮助。

于 2010-10-05T22:47:26.823 回答