Войти
ПрограммированиеФорумЗвук

Помогите разобратся с X3DAudio

#0
18:26, 15 июля 2009

typedef struct X3DAUDIO_LISTENER
{
    X3DAUDIO_VECTOR OrientFront;
    X3DAUDIO_VECTOR OrientTop;
    X3DAUDIO_VECTOR Position;
    X3DAUDIO_VECTOR Velocity;
    X3DAUDIO_CONE *pCone;
} X3DAUDIO_LISTENER, *LPX3DAUDIO_LISTENER;

Как мне передать туда направление?
Собственно меня смущает OrientFront и OrientTop


#1
19:12, 15 июля 2009

Antonnio
OrientFront - направление "вперед"
OrientTop - направление "вверх"

берем вектор 0, 0, 1 и поворачиваем его матрицей камеры - это будет front
берем вектор 0, 1, 0 и поворачиваем его матрицей камеры - это будет top

#2
13:53, 16 июля 2009

Большое спасибо, разобрался.

#3
19:48, 8 авг. 2009

А вот ещё одна проблема, я портировал демку XAudio2Sound3D на свой движок, всё работает, но звук слышен только из левой колонки. Пробовал играться с эмитером и X3DAudioCalculate - ничего.

Эмиттер
X3DAUDIO_EMITTER emt = {0};
m_Emitter = emt;
m_Emitter.Position = D3DXVECTOR3(0,0,0);
m_Emitter.OrientFront = D3DXVECTOR3(0, 0, -1);
m_Emitter.OrientTop = D3DXVECTOR3(0, 1, 1);
m_Emitter.Velocity = D3DXVECTOR3(0,0,0);
m_Emitter.ChannelCount = 1.0f;
m_Emitter.CurveDistanceScaler = 50.0f;
m_Emitter.DopplerScaler = 1.0f;
m_Emitter.CurveDistanceScaler = FLT_MIN;

Апдейт
SoundList::iterator it;
for(it = m_SoundList.begin(); it != m_SoundList.end(); it++)
{
  if((*it)->Is3D() == true)
  {
    X3DAudioCalculate(
        X3DInstance,
        &m_AudioListener->GetX3DAudioListener(),
        &static_cast<CAudioEmitter*>(*it)->GetX3DAudioEmitter(),
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER
        | X3DAUDIO_CALCULATE_LPF_DIRECT
        | X3DAUDIO_CALCULATE_REVERB,
        &m_DSPSettings
        );

    IXAudio2SourceVoice* voice = (*it)->GetXAudio2SourceVoice();
    if( voice != NULL )
    {
    voice->SetFrequencyRatio( m_DSPSettings.DopplerFactor );
    voice->SetOutputMatrix( pMasterVoice, 1, nChannels,
        matrixCoefficients );

    voice->SetOutputMatrix(pSubmixVoice, 1, 1, &m_DSPSettings.ReverbLevel);

    XAUDIO2_FILTER_PARAMETERS FilterParametersDirect = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * m_DSPSettings.LPFDirectCoefficient), 1.0f }; // see XAudio2CutoffFrequencyToRadians() in XAudio2.h for more information on the formula used here
    voice->SetOutputFilterParameters(pMasterVoice, &FilterParametersDirect);
    XAUDIO2_FILTER_PARAMETERS FilterParametersReverb = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * m_DSPSettings.LPFReverbCoefficient), 1.0f }; // see XAudio2CutoffFrequencyToRadians() in XAudio2.h for more information on the formula used here
    voice->SetOutputFilterParameters(pSubmixVoice, &FilterParametersReverb);
    }
}

#4
18:48, 10 авг. 2009

Неужели никто не работал с этим?

#5
20:09, 10 авг. 2009

Antonnio
Работали конечно и все работает прекрасно :)

Подозрительная строчка
voice->SetOutputMatrix(pSubmixVoice, 1, 1, &m_DSPSettings.ReverbLevel);

SourceChannels = 1, это понятно, а DestinationChannels = 1 уже нет ;)

#6
21:13, 10 авг. 2009

При DestinationChannels = 2 звук слышен опять же только из левого динамика, плюс звук проигрывается один раз( и это при buffer.LoopCount = XAUDIO2_LOOP_INFINITE) и проигрывается очень быстро(раза в 3 быстее оригинала).
При DestinationChannels >= 3 просто шум

#7
21:22, 10 авг. 2009

Обнаружилась ещё одна вещь : при DestinationChannels >= 3 приложение запускается то с шумом, как я описал выше, то нормально, т.е. звук проигрывается с нормальной скоростью и с бесконечным повтором. О чём это может говорить?

#8
0:41, 11 авг. 2009

Antonnio
> Обнаружилась ещё одна вещь : при DestinationChannels >= 3 приложение
> запускается то с шумом, как я описал выше, то нормально, т.е. звук
> проигрывается с нормальной скоростью и с бесконечным повтором. О чём это может
> говорить?

Где-то мусор передаете.


Тут что-то явно неправильно :)

voice->SetOutputMatrix( pMasterVoice, 1, nChannels, matrixCoefficients );
voice->SetOutputMatrix(pSubmixVoice, 1, 1, &m_DSPSettings.ReverbLevel); - особенно здесь  &m_DSPSettings.ReverbLevel

логика этого кода не ясна совсем

может &m_DSPSettings.pMatrixCoefficients во второй строке, а первую убрать?

#9
8:19, 11 авг. 2009

Тогда будет 2Д.
voice->SetOutputMatrix(pSubmixVoice, 1, 1, &m_DSPSettings.ReverbLevel); - это для фильтра XAudio2CreateReverb( &pReverbEffect ).

Убрал то что не первостепенно:

X3DAudioCalculate(
  X3DInstance,
  &m_AudioListener->GetX3DAudioListener(),
  &static_cast<CAudioEmitter*>(*it)->GetX3DAudioEmitter(),
  X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER ,
  &m_DSPSettings
    );

IXAudio2SourceVoice* voice = (*it)->GetXAudio2SourceVoice();
if( voice != NULL )
{
  voice->SetFrequencyRatio( m_DSPSettings.DopplerFactor );
  voice->SetOutputMatrix( pMasterVoice, 1, nChannels, m_DSPSettings.pMatrixCoefficients );
}
Звук также звучит из левой колонки. При изменении направления и удалении/приближении листнера ничего не происходит.

ПрограммированиеФорумЗвук

Тема в архиве.