方法 : X3DAudio と XAudio2 の統合

ここでは、X3DAudio を XAudio2 と統合する方法を示します。X3DAudio を使用すると、XAudio2 ボイスのボリュームとピッチ値、およびリバーブ エフェクトで構築された XAudio2 のパラメーターを指定できます。ここで説明する方法は、オーディオ グラフが「方法 : 基本的なオーディオ処理グラフの作成」に記載されている方法で作成されていることを前提としています。

X3DAudio の初期化

  1. X3DAudioInitialize を呼び出して、X3DAudio を初期化します。

    X3DAudioInitialize 関数は、スピーカー セットアップを示すフラグを受け取ります。XBox 360 上で、これは常に 6 スピーカー構成となります。その他のパラメーターは、サウンドの速度 (ユーザー定義のワールド単位/秒) および X3DAudio エンジンのインスタンスを返すハンドルです。

    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER |
        SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT,
        X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. X3DAUDIO_LISTENER 構造体および X3DAUDIO_EMITTER 構造体のインスタンスを作成します。

    X3DAUDIO_LISTENER 構造体は、サウンドが聞こえるすべてのものの位置を表します。通常、これはカメラの位置またはその近辺となります。X3DAUDIO_EMITTER 構造体は、サウンドを発するものの位置を表します。追跡中のサウンドごとに、1 つの X3DAUDIO_EMITTER 構造体があります。

    ゲーム ループで更新されない構造体のメンバーは、ここで初期化する必要があります。構造体のほとんどのメンバーは簡単に 0 に初期化できますが、X3DAUDIO_EMITTER の一部のメンバーは 0 以外の値に初期化するよう設定する必要があります。X3DAUDIO_EMITTERChannelCount メンバーは、エミッターが表すボイスのチャンネル数に初期化する必要があります。さらに、X3DAUDIO_EMITTERCurveDistanceScaler メンバーは FLT_MIN ~ FLT_MAX の範囲内でなければなりません。

    X3DAUDIO_LISTENER Listener = {0};
    
    X3DAUDIO_EMITTER Emitter = {0};
    Emitter.ChannelCount = 1;
    Emitter.CurveDistanceScaler = FLT_MIN;
    
  3. X3DAUDIO_DSP_SETTINGS 構造体のインスタンスを作成します。

    X3DAUDIO_DSP_SETTINGS 構造体を使用して、X3DAudioCalculate により計算された結果が返されます。X3DAudioCalculate 関数は、そのパラメーターのいずれにもメモリーを割り当てません。したがって、パラメーターが使用される場合、配列を X3DAUDIO_DSP_SETTINGS 構造体の pMatrixCoefficients および pDelayTimes メンバーに割り当てる必要はありません。さらに、SrcChannelCount および DstChannelCount メンバーを、エミッターのソース ボイスと転送先のボイスのチャンネル数に設定する必要があります。

    X3DAUDIO_DSP_SETTINGS DSPSettings = {0};
    FLOAT32 matrix[6];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = 6;
    DSPSettings.pMatrixCoefficients = matrix;
    

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 は各チャンネルに対するボリュームとサウンドのピッチ調整を計算します。

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter, X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER, &DSPSettings );
    
  3. IXAudio2Voice::SetOutputMatrix および IXAudio2SourceVoice::SetFrequencyRatio を使用して、ボイスのボリュームとピッチ値を適用します。

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, 6, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    

関連トピック