Руководство: интегрирование X3DAudio с XAudio2

В этом разделе показано, как интегрировать X3DAudio с XAudio2. С помощью X3DAudio можно указать значения громкости и тона для голосов XAudio2, а также параметры встроенного эффекта реверберации XAudio2. В этом разделе предполагается, что вы создали звуковой граф, как описано в разделе Практическое руководство. Создание базового графа обработки звука. Если вы еще не создали звуковой граф, X3DAudioInitialize завершится ошибкой.

Инициализация X3DAudio

  1. Инициализируйте X3DAudio, вызвав X3DAudioInitialize.

    Функция X3DAudioInitialize принимает флаги, указывающие настройку динамика, скорость звука в определяемых пользователем единицах в секунду и дескриптор для возврата экземпляра обработчика X3DAudio. Вызовите IXAudio2MasteringVoice::GetChannelMask , чтобы получить маску канала формата вывода.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Создание экземпляров структур X3DAUDIO_LISTENER и X3DAUDIO_EMITTER .

    Структура X3DAUDIO_LISTENER представляет положение того, что слышит звук. Как правило, это положение камеры или положение рядом с ней. Структура X3DAUDIO_EMITTER представляет положение вещи, издающего звук. Для каждого отслеживаемого звука будет одна X3DAUDIO_EMITTER структура.

    Члены структур, которые не будут обновляться в игровом цикле, должны быть инициализированы здесь. Большинство элементов структур можно просто инициализировать нулевым значением. Однако некоторые элементы X3DAUDIO_EMITTER необходимо задать для инициализации ненулевыми значениями. Элемент ChannelCount X3DAUDIO_EMITTER необходимо инициализировать в соответствии с количеством каналов в голосе, который представляет излучатель. Кроме того, элемент CurveDistanceScaler X3DAUDIO_EMITTER должен находиться в диапазоне FLT_MIN для FLT_MAX.

    X3DAUDIO_LISTENER Listener = {};
    
    X3DAUDIO_EMITTER Emitter = {};
    Emitter.ChannelCount = 1;
    Emitter.CurveDistanceScaler = Emitter.DopplerScaler = 1.0f;
    

ChannelCount здесь предполагает, что мы воспроизводим моноканационный звук, который проще всего настроить. Для источников звука с более чем 1 каналом необходимо также задать излучатель ChannelRadius и pChannelAzimuths значения.

  1. Создайте экземпляр структуры X3DAUDIO_DSP_SETTINGS .

    Структура X3DAUDIO_DSP_SETTINGS используется для возврата результатов, вычисляемых методом X3DAudioCalculate. Функция X3DAudioCalculate не выделяет память ни для одного из ее параметров. Это означает, что необходимо выделить массивы для элементов pMatrixCoefficients и pDelayTimes структуры X3DAUDIO_DSP_SETTINGS , если вы планируете их использовать. Кроме того, необходимо задать для членов SrcChannelCount и DstChannelCount количество каналов в исходном и целевом голосах излучателя.

    X3DAUDIO_DSP_SETTINGS DSPSettings = {};
    FLOAT32 * matrix = new FLOAT32[deviceDetails.OutputFormat.Format.nChannels];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = deviceDetails.OutputFormat.Format.nChannels;
    DSPSettings.pMatrixCoefficients = matrix;
    

    Примечание

    Используйте IXAudio2Voice::GetVoiceDetails в мастер-голосе, чтобы получить количество входных каналов для nChannels. Для версий пакета SDK для DirectX XAUDIO2 до Windows 8 используйте IXAudio2::GetDeviceDetails.

     

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

Использование X3DAudio для вычисления и применения новых параметров трехмерного звука

  1. Обновите X3DAUDIO_LISTENER и X3DAUDIO_EMITTER структуры, указав их текущее положение, скорость и ориентацию.

    Emitter.OrientFront = EmitterOrientFront;
    Emitter.OrientTop = EmitterOrientTop;
    Emitter.Position = EmitterPosition;
    Emitter.Velocity = EmitterVelocity;
    Listener.OrientFront = ListenerOrientFront;
    Listener.OrientTop = ListenerOrientTop;
    Listener.Position = ListenerPosition;
    Listener.Velocity = ListenerVelocity;
    
  2. Вызовите X3DAudioCalculate , чтобы вычислить новые параметры для голосов.

    Параметры для X3DAudioCalculate будут обновленными X3DAUDIO_LISTENER и X3DAUDIO_EMITTER структурами. Флаги указывают, какие значения следует вычислить X3DAudioCalculate и какая X3DAUDIO_DSP_SETTINGS структура будет содержать результаты выполненных вычислений.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Используйте IXAudio2Voice::SetOutputMatrix и IXAudio2SourceVoice::SetFrequencyRatio , чтобы применить значения громкости и тона к исходному голосу.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Используйте IXAudio2Voice::SetOutputMatrix , чтобы применить вычисляемый уровень реверберации к голосу субмикшации.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Используйте IXAudio2Voice::SetFilterParameters , чтобы применить вычисляемый коэффициент прямого фильтра низких проходов к исходному голосу.

    XAUDIO2_FILTER_PARAMETERS FilterParameters = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * DSPSettings.LPFDirectCoefficient), 1.0f };
    pSFXSourceVoice->SetFilterParameters(&FilterParameters);
    

X3DAudio

Обзор X3DAudio

Руководство по программированию для XAudio2

Элемент управления громкости и тона XAudio2