在FMOD 3D声音监听器中使用了“无效的对象句柄”

时间:2010-10-05 05:00:28

标签: c++ audio ogre3d fmod

我正在尝试在使用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声音无法正常播放的原因。

1 个答案:

答案 0 :(得分:1)

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

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

result = FMOD::System_Create(&m_system);

其次,如果您在某处可以使用该代码,则可以验证m_system的值在创建时和使用时之间保持不变(可能是某些内容损坏了句柄)。

最后(作为一个长镜头)如果你的标题和lib不同步,你可能会得到一个不同的错误信息,确保你使用的标题和库都来自相同版本的FMOD。

额外注意,尝试使用FMOD的日志版本进行链接,您应该在TTY上获得一些有用的调试输出,这可能有助于您的情况。