So wird's gemacht: Integrieren von X3DAudio in XAudio2

In diesem Thema wird gezeigt, wie X3DAudio in XAudio2 integriert wird. Sie können X3DAudio verwenden, um die Lautstärke- und Tonhöhenwerte für XAudio2-Stimmen und die Parameter für den integrierten Halleffekt XAudio2 zur Verfügung zu stellen. In diesem Thema wird davon ausgegangen, dass Sie ein Audiodiagramm erstellt haben, wie unter How to: Build a Basic Audio Processing Graph. Wenn Sie noch kein Audiodiagramm erstellt haben, erzeugt X3DAudioInitialize einen Fehler.

So initialisieren Sie X3DAudio

  1. Initialisieren Sie X3DAudio, indem Sie X3DAudioInitialize aufrufen.

    Die X3DAudioInitialize-Funktion verwendet Flags, die die Einrichtung des Lautsprechers, die Geschwindigkeit des Sounds in benutzerdefinierten Welteinheiten pro Sekunde und ein Handle zum Zurückgeben einer Instanz der X3DAudio-Engine angeben. Rufen Sie IXAudio2MasteringVoice::GetChannelMask auf, um die Kanalmaske des Ausgabeformats zu erhalten.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Erstellen Sie Instanzen der X3DAUDIO _ LISTENER- und X3DAUDIO _ EMITTER-Strukturen.

    Die X3DAUDIO _ LISTENER-Struktur stellt die Position des Sounds dar. Im Allgemeinen ist dies die Position der Kamera oder eine Position in der Nähe. Die X3DAUDIO _ EMITTER-Struktur stellt die Position des Sounds dar. Es gibt eine X3DAUDIO _ EMITTER-Struktur für jeden Sound, der nachverfolgt wird.

    Member der Strukturen, die nicht in einer Spielschleife aktualisiert werden, sollten hier initialisiert werden. Die meisten Member der Strukturen können einfach mit 0 initialisiert werden. Einige Member von X3DAUDIO _ EMITTER müssen jedoch so festgelegt werden, dass sie auf Werte ohne Null initialisiert werden. Das ChannelCount-Member des X3DAUDIO-EMITTER _ muss mit der Anzahl der Kanäle in der Stimme initialisiert werden, die der Emitter darstellt. Außerdem muss das CurveDistanceScaler-Mitglied von X3DAUDIO _ EMITTER im Bereich FLT _ MIN bis FLT _ MAX liegen.

    X3DAUDIO_LISTENER Listener = {0};
    X3DAUDIO_EMITTER Emitter = {0};
    Emitter.ChannelCount = 1;
    Emitter.CurveDistanceScaler = FLT_MIN;
    
  3. Erstellen Sie eine Instanz der X3DAUDIO _ DSP _ SETTINGS-Struktur.

    Die X3DAUDIO _ DSP _ SETTINGS-Struktur wird verwendet, um von X3DAudioCalculateberechnete Ergebnisse zurück zu geben. Die X3DAudioCalculate-Funktion weist keinen Arbeitsspeicher für einen ihrer Parameter zu. Dies bedeutet, dass Sie Arrays für die pMatrixCoefficients- und pDelayTimes-Member der X3DAUDIO _ DSP _ SETTINGS-Struktur zuordnen müssen, wenn Sie diese verwenden möchten. Darüber hinaus müssen Sie die Elemente SrcChannelCount und DstChannelCount auf die Anzahl der Kanäle in den Quell- und Zielstimmen des Emitters festlegen.

    X3DAUDIO_DSP_SETTINGS DSPSettings = {0};
    FLOAT32 * matrix = new FLOAT32[deviceDetails.OutputFormat.Format.nChannels];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = deviceDetails.OutputFormat.Format.nChannels;
    DSPSettings.pMatrixCoefficients = matrix;
    

    Hinweis

    Verwenden Sie IXAudio2Voice::GetVoiceDetails auf der Masterstimme, um die Anzahl der InputChannels für nChannels zu erhalten. Verwenden Sie für DirectX SDK-Versionen von XAUDIO2 vor Windows 8 IXAudio2::GetDeviceDetails.

Führen Sie diese Schritte alle zwei bis drei Frames aus, um neue Einstellungen zu berechnen und anzuwenden. In diesem Beispiel sendet eine Quellstimme direkt an die Masterstimme und an eine Untermischungsstimme, auf die ein Halleffekt angewendet wird.

So verwenden Sie X3DAudio zum Berechnen und Anwenden neuer 3D-Audioeinstellungen

  1. Aktualisieren Sie die X3DAUDIO _ LISTENER- und X3DAUDIO _ EMITTER-Strukturen mit ihrer aktuellen Position, Geschwindigkeit und Ausrichtung.

    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. Rufen Sie X3DAudioCalculate auf, um neue Einstellungen für die Stimmen zu berechnen.

    Die Parameter für X3DAudioCalculate sind die aktualisierten X3DAUDIO _ LISTENER- und X3DAUDIO _ EMITTER-Strukturen. Die Flags geben an, welche Werte X3DAudioCalculate berechnen soll und welche X3DAUDIO _ DSP _ SETTINGS-Struktur die Ergebnisse der durchgeführten Berechnungen enthält.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Verwenden Sie IXAudio2Voice::SetOutputMatrix und IXAudio2SourceVoice::SetFrequencyRatio, um die Lautstärke- und Tonhöhenwerte auf die Quellstimme anzuwenden.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Verwenden Sie IXAudio2Voice::SetOutputMatrix, um die berechnete Hallebene auf die Untermischungsstimme anzuwenden.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Verwenden Sie IXAudio2Voice::SetFilterParameters, um den berechneten direkten Filterkoeffizienten für den niedrigen Durchgang auf die Quellstimme anzuwenden.

    XAUDIO2_FILTER_PARAMETERS FilterParameters = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * DSPSettings.LPFDirectCoefficient), 1.0f };
    pSFXSourceVoice->SetFilterParameters(&FilterParameters);
    

X3DAudio

Übersicht über X3DAudio

XAudio2-Programmieranleitung

XAudio2-Steuerelement für Lautstärke und Tonhöhe