So wird's gemacht: Integrieren von X3DAudio in XAudio2

In diesem Thema wird gezeigt, wie Sie X3DAudio in XAudio2 integrieren. Sie können X3DAudio verwenden, um die Lautstärke- und Tonhöhenwerte für XAudio2-Stimmen und die Parameter für den in XAudio2 integrierten Halleffekt bereitzustellen. In diesem Thema wird davon ausgegangen, dass Sie ein Audiodiagramm erstellt haben, wie unter How to: Build a Basic Audio Processing Graph beschrieben. Wenn Sie noch kein Audiodiagramm erstellt haben, schlägt X3DAudioInitialize fehl.

So initialisieren Sie X3DAudio

  1. Initialisieren Sie X3DAudio, indem Sie X3DAudioInitialize aufrufen.

    Die X3DAudioInitialize-Funktion verwendet Flags, die die Lautsprechereinrichtung, die Soundgeschwindigkeit in benutzerdefinierten Welteinheiten pro Sekunde und einen Handle angeben, um eine instance der X3DAudio-Engine zurückzugeben. Rufen Sie IXAudio2MasteringVoice::GetChannelMask auf, um die Kanalmaske des Ausgabeformats abzurufen.

    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 Klanghörens dar. Im Allgemeinen ist dies die Position der Kamera oder eine Position in der Nähe. Die X3DAUDIO_EMITTER Struktur stellt die Position des Klangs dar. Es gibt eine X3DAUDIO_EMITTER Struktur für jeden Sound, der nachverfolgt wird.

    Mitglieder der Strukturen, die in einer Spielschleife nicht aktualisiert werden, sollten hier initialisiert werden. Die meisten Elemente der Strukturen können einfach auf null initialisiert werden. Einige Member von X3DAUDIO_EMITTER müssen jedoch so festgelegt werden, dass sie auf Werte ungleich null initialisiert werden. Das ChannelCount-Element des X3DAUDIO_EMITTER muss mit der Anzahl von Kanälen in der Stimme initialisiert werden, die der Emitter darstellt. Außerdem muss sich das CurveDistanceScaler-Element von X3DAUDIO_EMITTER im Bereich FLT_MIN FLT_MAX.

    X3DAUDIO_LISTENER Listener = {};
    
    X3DAUDIO_EMITTER Emitter = {};
    Emitter.ChannelCount = 1;
    Emitter.CurveDistanceScaler = Emitter.DopplerScaler = 1.0f;
    

Der ChannelCount geht hier davon aus, dass wir einen Monokanalsound wiedergeben, der die Einrichtung erleichtern soll. Für Soundquellen mit mehr als 1 Kanal müssen Sie auch den Emitter ChannelRadius und pChannelAzimuths die Werte festlegen.

  1. Erstellen Sie eine instance der X3DAUDIO_DSP_SETTINGS-Struktur.

    Die X3DAUDIO_DSP_SETTINGS-Struktur wird verwendet, um von X3DAudioCalculate berechnete Ergebnisse zurückzugeben. Die X3DAudioCalculate-Funktion weist keinem ihrer Parameter Arbeitsspeicher zu. Dies bedeutet, dass Sie Arrays für die pMatrixCoefficients- und pDelayTimes-Member der X3DAUDIO_DSP_SETTINGS Struktur zuordnen müssen, wenn Sie sie verwenden möchten. Darüber hinaus müssen Sie die Member SrcChannelCount und DstChannelCount auf die Anzahl der Kanäle in den Quell- und Zielstimme des Emitters festlegen.

    X3DAUDIO_DSP_SETTINGS DSPSettings = {};
    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 für die Masterstimme, um die Anzahl von InputChannels für nChannels abzurufen. 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 Submixstimme mit einem auf sie angewendeten Halleffekt.

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 Submixstimme anzuwenden.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Verwenden Sie IXAudio2Voice::SetFilterParameters , um den berechneten direkten Koeffizienten des Tiefpassfilters auf die Quellstimme anzuwenden.

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

X3DAudio

X3DAudio– Übersicht

XAudio2-Programmieranleitung

XAudio2-Lautstärke- und Pitch-Steuerung