Compartir a través de


Cómo: integrar X3DAudio con XAudio2

En este tema se muestra cómo integrar X3DAudio con XAudio2. Puede usar X3DAudio para proporcionar los valores de volumen y tono para las voces XAudio2 y los parámetros para el efecto de reverberación integrado de XAudio2. En este tema se supone que ha creado un grafo de audio como se describe en How to: Build a Basic Audio Processing Graph. Si aún no ha creado un gráfico de audio, se producirá un error en X3DAudioInitialize .

Para inicializar X3DAudio

  1. Inicialice X3DAudio llamando a X3DAudioInitialize.

    La función X3DAudioInitialize toma marcas que indican la configuración del altavoz, la velocidad de sonido en unidades mundiales definidas por el usuario por segundo y un identificador para devolver una instancia del motor X3DAudio. Llame a IXAudio2MasteringVoice::GetChannelMask para obtener la máscara de canal del formato de salida.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Cree instancias de las estructuras de X3DAUDIO_LISTENER y X3DAUDIO_EMITTER .

    La estructura X3DAUDIO_LISTENER representa la posición de lo que esté escuchando el sonido. Por lo general, esta es la posición de la cámara o una posición cercana a ella. La estructura X3DAUDIO_EMITTER representa la posición de lo que hace el sonido. Habrá una estructura X3DAUDIO_EMITTER para cada sonido al que se realiza el seguimiento.

    Los miembros de las estructuras que no se actualizarán en un bucle de juego deben inicializarse aquí. La mayoría de los miembros de las estructuras simplemente se pueden inicializar en cero. Sin embargo, algunos miembros de X3DAUDIO_EMITTER deben establecerse para inicializarse en valores distintos de cero. El miembro ChannelCount del X3DAUDIO_EMITTER debe inicializarse en el número de canales de la voz que representa el emisor. Además, el miembro CurveDistanceScaler de X3DAUDIO_EMITTER debe estar en el intervalo FLT_MIN para FLT_MAX.

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

El ChannelCount aquí supone que estamos reproduciendo un sonido monocanal que es el easist que se va a configurar. Para orígenes de sonido con más de 1 canal, también debe establecer el emisor ChannelRadius y pChannelAzimuths los valores.

  1. Cree una instancia de la estructura X3DAUDIO_DSP_SETTINGS .

    La estructura X3DAUDIO_DSP_SETTINGS se usa para devolver los resultados calculados por X3DAudioCalculate. La función X3DAudioCalculate no asigna memoria para ninguno de sus parámetros. Esto significa que debe asignar matrices para los miembros pMatrixCoefficients y pDelayTimes de la estructura X3DAUDIO_DSP_SETTINGS si quiere usarlos. Además, debe establecer los miembros SrcChannelCount y DstChannelCount en el número de canales de las voces de origen y destino del emisor.

    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:

    Use IXAudio2Voice::GetVoiceDetails en la voz de masterización para obtener el número de InputChannels para nChannels. Para las versiones del SDK de DirectX de XAUDIO2 anteriores a Windows 8, use IXAudio2::GetDeviceDetails.

     

Realice estos pasos una vez cada dos a tres fotogramas para calcular la nueva configuración y aplicarlos. En este ejemplo, una voz de origen se envía directamente a la voz de maestro y a una voz de submezcla con un efecto de reverberación aplicado.

Para usar X3DAudio para calcular y aplicar la nueva configuración de audio 3D

  1. Actualice las estructuras X3DAUDIO_LISTENER y X3DAUDIO_EMITTER con su posición actual, velocidad y orientación.

    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. Llame a X3DAudioCalculate para calcular la nueva configuración de las voces.

    Los parámetros de X3DAudioCalculate serán las estructuras actualizadas X3DAUDIO_LISTENER y X3DAUDIO_EMITTER . Las marcas indicarán qué valores debe calcular X3DAudioCalculate y qué estructura X3DAUDIO_DSP_SETTINGS contendrá los resultados de los cálculos realizados.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Use IXAudio2Voice::SetOutputMatrix y IXAudio2SourceVoice::SetFrequencyRatio para aplicar los valores de volumen y tono a la voz de origen.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Use IXAudio2Voice::SetOutputMatrix para aplicar el nivel de reverberación calculado a la voz de submezcla.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Use IXAudio2Voice::SetFilterParameters para aplicar el coeficiente directo de filtro de paso bajo calculado a la voz de origen.

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

X3DAudio

Información general sobre X3DAudio

Guía de programación de XAudio2

Control de volumen y tono XAudio2