«Недопустимый дескриптор объекта был использован» в FMOD-слушателе звука 3D - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь настроить 3D-звуки с помощью FMOD в игре, в которой используется Ogre. Звуковой слушатель прикреплен к камере, которая работает на сплайне. У меня есть звуки шагов, прикрепленные к плееру, и громкость должна определяться тем, насколько далеко игрок находится от камеры.

Звуки шагов ступни действуют так, как будто слушатель звука не движется из своего начального положения. В начале уровня шаги громкие, и по мере удаления от начала они становятся тише, пока вы их больше не слышите. Если вы вернетесь к началу, они станут громче. Однако положение узла сцены звукового слушателя обновляется и синхронизируется с камерой.

В коде есть ошибка 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.

Есть идеи, почему «result» возвращает эту ошибку? Я предполагаю, что это причина, почему 3D-звуки не воспроизводятся правильно.

1 Ответ

1 голос
/ 06 октября 2010

Недопустимая ошибка дескриптора (FMOD_ERR_INVALID_HANDLE) ссылается на объект, для которого вы вызываете функции, в этом случае это означает, что дескриптор m_system недопустим.

Сначала я заметил, что вы пропустили код для создания объекта FMOD :: System, можете ли вы подтвердить, что вы делаете следующее:

result = FMOD::System_Create(&m_system);

Во-вторых, если у вас где-то есть этот код, вы можете проверить, что значение m_system остается неизменным между моментом его создания и его использованием (возможно, что-то повредило дескриптор).

Наконец (как длинный выстрел), если ваши заголовки и библиотека не синхронизированы, вы можете получить другое сообщение об ошибке, убедитесь, что все используемые вами заголовки и библиотеки принадлежат к одной и той же версии FMOD.

Дополнительное примечание, попробуйте связать с записывающей версией FMOD, вы должны получить некоторые полезные выходные данные отладки на TTY, которые могут помочь вашей ситуации.

...