Procedura: Integrare X3DAudio con XAudio2

Questo argomento illustra come integrare X3DAudio con XAudio2. È possibile usare X3DAudio per fornire i valori del volume e dell'inclinazione per le voci XAudio2 e i parametri per l'effetto riverbero predefinito XAudio2. Questo argomento presuppone che sia stato creato un grafico audio come descritto in Procedura: Creare un grafico di elaborazione audio di base. Se non è già stato creato un grafico audio, X3DAudioInitialize avrà esito negativo.

Per inizializzare X3DAudio

  1. Inizializzare X3DAudio chiamando X3DAudioInitialize.

    La funzione X3DAudioInitialize accetta flag che indicano l'impostazione dell'altoparlante, la velocità del suono nelle unità mondiali definite dall'utente al secondo e un handle per restituire un'istanza del motore X3DAudio. Chiama IXAudio2MasteringVoice::GetChannelMask per ottenere la maschera del canale del formato di output.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Creare istanze delle strutture di X3DAUDIO_LISTENER e di X3DAUDIO_EMITTER .

    La struttura X3DAUDIO_LISTENER rappresenta la posizione di qualsiasi elemento che sente il suono. In genere, si tratta della posizione della fotocamera o di una posizione vicina. La struttura X3DAUDIO_EMITTER rappresenta la posizione della cosa che rende il suono. Ci sarà una struttura X3DAUDIO_EMITTER per ogni suono che viene tracciato.

    I membri delle strutture che non verranno aggiornati in un ciclo di gioco devono essere inizializzati qui. La maggior parte dei membri delle strutture può essere semplicemente inizializzata su zero. Tuttavia, alcuni membri di X3DAUDIO_EMITTER devono essere impostati per essere inizializzati su valori diversi da zero. Il membro ChannelCount del X3DAUDIO_EMITTER deve essere inizializzato sul numero di canali nella voce rappresentata dall'emettitore. Inoltre, il membro CurveDistanceScaler di X3DAUDIO_EMITTER deve essere compreso nell'intervallo FLT_MIN da FLT_MAX.

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

ChannelCount qui presuppone che si stia riproducendo un suono monocanale che è l'easist da configurare. Per le sorgenti audio con più di 1 canale, è necessario impostare anche l'emettitore ChannelRadius e pChannelAzimuths i valori.

  1. Creare un'istanza della struttura X3DAUDIO_DSP_SETTINGS .

    La struttura X3DAUDIO_DSP_SETTINGS viene usata per restituire i risultati calcolati da X3DAudioCalculate. La funzione X3DAudioCalculate non alloca memoria per i relativi parametri. Ciò significa che è necessario allocare matrici per i membri pMatrixCoefficients e pDelayTimes della struttura X3DAUDIO_DSP_SETTINGS se si intende usarli. Inoltre, è necessario impostare i membri SrcChannelCount e DstChannelCount sul numero di canali nelle voci di origine e di destinazione dell'emettitore.

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

    Nota

    Usare IXAudio2Voice::GetVoiceDetails nella voce mastering per ottenere il numero di InputChannels per nChannels. Per le versioni directX SDK di XAUDIO2 precedenti a Windows 8, usare IXAudio2::GetDeviceDetails.

     

Eseguire questi passaggi una volta ogni due o tre fotogrammi per calcolare nuove impostazioni e applicarle. In questo esempio, una voce di origine invia direttamente alla voce mastering e a una voce submix con un effetto riverbero applicato.

Per usare X3DAudio per calcolare e applicare nuove impostazioni audio 3D

  1. Aggiornare le strutture X3DAUDIO_LISTENER e X3DAUDIO_EMITTER con la posizione, la velocità e l'orientamento correnti.

    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. Chiama X3DAudioCalculate per calcolare nuove impostazioni per le voci.

    I parametri per X3DAudioCalculate saranno le strutture X3DAUDIO_LISTENER e X3DAUDIO_EMITTER aggiornate. I flag indicano quali valori devono essere calcolati da X3DAudioCalculate e quali X3DAUDIO_DSP_SETTINGS struttura conterrà i risultati dei calcoli eseguiti.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Usare IXAudio2Voice::SetOutputMatrix e IXAudio2SourceVoice::SetFrequencyRatio per applicare i valori di volume e pitch alla voce di origine.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Usare IXAudio2Voice::SetOutputMatrix per applicare il livello di riverbero calcolato alla voce submix.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Usare IXAudio2Voice::SetFilterParameters per applicare il coefficiente diretto del filtro a basso passaggio calcolato alla voce di origine.

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

X3DAudio

Panoramica di X3DAudio

Guida alla programmazione di XAudio2

Controllo volume e inclinazione di XAudio2