共用方式為


如何:整合 X3DAudio 與 XAudio2

本主題說明如何整合 X3DAudio 與 XAudio2。 您可以使用 X3DAudio 來提供 XAudio2 語音的音量和音調值,以及 XAudio2 內建殘響效果的參數。 本主題假設您已建立音訊圖形,如 如何:建置基本音訊處理圖形中所述。 如果您尚未建立音訊圖表,X3DAudioInitialize 將會失敗。

初始化 X3DAudio

  1. 通過呼叫 X3DAudioInitialize初始化 X3DAudio。

    X3DAudioInitialize 函式接受旗標,用於指出喇叭配置、用戶定義世界單位中的每秒聲音速度,以及傳回 X3DAudio 引擎實例的句柄。 呼叫 IXAudio2MasteringVoice::GetChannelMask 以取得輸出格式的通道掩碼。

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. 建立 X3DAUDIO_LISTENERX3DAUDIO_EMITTER 結構的實例。

    X3DAUDIO_LISTENER 結構表示正在接收聲音的聽者的位置。 一般而言,這是相機的位置或接近它的位置。 X3DAUDIO_EMITTER 結構代表發出聲音之物體的位置。 每個被追蹤的聲音都會有一個 X3DAUDIO_EMITTER 結構。

    在此應初始化不會在遊戲迴圈中更新之結構的成員。 結構的大部分成員只要初始化為零即可。 不過,X3DAUDIO_EMITTER 的某些成員必須設定為非零值。 X3DAUDIO_EMITTER 的 ChannelCount 成員必須初始化為發出器所代表之語音中的通道數目。 此外,X3DAUDIO_EMITTER 的 CurveDistanceScaler 成員必須在 FLT_MIN 到 FLT_MAX 範圍內。

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

這裡的 ChannelCount 假設我們正在播放單聲道音效,這是最簡單的設定。 對於超過 1 個通道的音效來源,您也必須設定發出器 ChannelRadiuspChannelAzimuths 值。

  1. 建立 X3DAUDIO_DSP_SETTINGS 結構的實例。

    X3DAUDIO_DSP_SETTINGS 結構可用來傳回 X3DAudioCalculate所計算的結果。 X3DAudioCalculate 函式不會為其任何參數配置記憶體。 這表示,如果您想要使用陣列,您必須為 X3DAUDIO_DSP_SETTINGS 結構的 pMatrixCoefficients 和 pDelayTimes 成員配置數位。 此外,您必須將 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的 InputChannels 數目。 針對 Windows 8 之前的 DirectX SDK 版本XAUDIO2,請使用 IXAudio2::GetDeviceDetails。

     

每兩到三個畫面格執行這些步驟一次,以計算新的設定並加以套用。 在此範例中,來源語音會直接傳送至主控語音,以及傳送至套用混響效果的副混音語音。

若要使用 X3DAudio 來計算並套用新的 3D 音訊設定

  1. 使用目前的位置、速度和方向更新 X3DAUDIO_LISTENERX3DAUDIO_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_LISTENERX3DAUDIO_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::SetOutputMatrixIXAudio2SourceVoice::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 音量和音調控制