Поделиться через


Практическое руководство. Интеграция 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