方法: XAudio2 と X3DAudio の統合
このトピックでは、X3DAudio と XAudio2 を統合する方法について説明します。 X3DAudio を使用して、XAudio2 音声の音量とピッチの値と、リバーブ効果で組み込まれている XAudio2 のパラメーターを指定できます。 このトピックでは、「 方法: 基本的なオーディオ処理グラフを作成する」の説明に従ってオーディオ グラフを作成していることを前提としています。 オーディオ グラフをまだ作成していない場合、 X3DAudioInitialize は失敗します。
X3DAudio を初期化するには
X3DAudioInitialize を呼び出して X3DAudio を初期化します。
X3DAudioInitialize 関数は、スピーカーのセットアップ、1 秒あたりのユーザー定義ワールド 単位でのサウンドの速度、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構造は、音を出す物の位置を表します。 追跡対象のサウンドごとに 1 つの X3DAUDIO_EMITTER 構造があります。
ゲーム ループで更新されない構造体のメンバーは、ここで初期化する必要があります。 構造体のほとんどのメンバーは、単に 0 に初期化できます。 ただし、 X3DAUDIO_EMITTER の一部のメンバーは、0 以外の値に初期化されるように設定する必要があります。 X3DAUDIO_EMITTERの ChannelCount メンバーは、エミッターが表す音声のチャネル数に初期化する必要があります。 また、X3DAUDIO_EMITTER の CurveDistanceScaler メンバーは、 FLT_MAX FLT_MIN範囲内にある必要があります。
X3DAUDIO_LISTENER Listener = {}; X3DAUDIO_EMITTER Emitter = {}; Emitter.ChannelCount = 1; Emitter.CurveDistanceScaler = Emitter.DopplerScaler = 1.0f;
ここでの ChannelCount は、設定する easist であるモノチャネル サウンドを再生していることを前提としています。 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 の InputChannel の数を取得します。 Windows 8より前の DirectX SDK バージョンの XAUDIO2 の場合は、IXAudio2::GetDeviceDetails を使用します。
新しい設定を計算して適用するには、次の手順を 2 ~ 3 フレームに 1 回実行します。 この例では、ソースボイスがマスタリングボイスとサブミックスボイスに直接送信され、リバーブエフェクトが適用されています。
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);
関連トピック