«Был использован недопустимый дескриптор объекта» в прослушивателе звука FMOD 3D

Я пытаюсь настроить 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.

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


person games_dev85    schedule 05.10.2010    source источник


Ответы (1)


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

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

result = FMOD::System_Create(&m_system);

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

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

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

person Mathew Block    schedule 05.10.2010
comment
Вы были совершенно правы, m_system была нулевой. Я создавал систему FMOD в другом классе и должен был передать указатель на m_system в этом классе. Я не знал, что вы можете вызывать функции для нулевых указателей, и программа не сломается, если функция не обращается к переменным-членам, поэтому я узнал кое-что новое. - person games_dev85; 08.10.2010
comment
Отлично, и да, пока класс не касается каких-либо переменных-членов, вы можете вызывать функцию для указателя NULL. Если вы внимательно посмотрите на «указатели» FMOD, вы заметите, что большинство из них в любом случае на самом деле являются дескрипторами, поэтому значения, подобные «1», вполне допустимы. - person Mathew Block; 11.10.2010