共用方式為


使用方法:整合 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 之前的 XAUDIO2 DirectX SDK 版本,請使用 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 音量和音調控制項