使用方法:整合 X3DAudio 與 XAudio2
本主題說明如何整合 X3DAudio 與 XAudio2。 您可以使用 X3DAudio 來提供 XAudio2 語音的音量和音調值,以及 XAudio2 內建殘響效果的參數。 本主題假設您已建立音訊圖表,如 如何:建置基本音訊處理圖形中所述。 如果您尚未建立音訊圖表, X3DAudioInitialize 將會失敗。
初始化 X3DAudio
呼叫 X3DAudioInitialize 來初始化 X3DAudio。
X3DAudioInitialize函式會採用旗標,指出喇叭設定、使用者定義世界單位每秒音效的速度,以及傳回 X3DAudio 引擎實例的控制碼。 呼叫 IXAudio2MasteringVoice::GetChannelMask 以取得輸出格式的通道遮罩。
DWORD dwChannelMask; pMasteringVoice->GetChannelMask( &dwChannelMask ); X3DAUDIO_HANDLE X3DInstance; X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
建立 X3DAUDIO_LISTENER 和 X3DAUDIO_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 個通道的音效來源,您也必須設定發出器和
ChannelRadius
pChannelAzimuths
值。
建立 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 音訊設定
使用目前的位置、速度和方向,更新 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;
呼叫 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 );
使用 IXAudio2Voice::SetOutputMatrix 和 IXAudio2SourceVoice::SetFrequencyRatio 將音量和音調值套用至來源語音。
pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ; pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
使用 IXAudio2Voice::SetOutputMatrix 將計算的殘響層級套用至副混音。
pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
使用 IXAudio2Voice::SetFilterParameters 將計算的低傳遞篩選直接係數套用至來源語音。
XAUDIO2_FILTER_PARAMETERS FilterParameters = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * DSPSettings.LPFDirectCoefficient), 1.0f }; pSFXSourceVoice->SetFilterParameters(&FilterParameters);
相關主題