Como: Integrar X3DAudio ao XAudio2

Este tópico mostra como integrar o X3DAudio ao XAudio2. Você pode usar X3DAudio para fornecer os valores de volume e de tom para vozes XAudio2 e os parâmetros para o XAudio2 criado no efeito reverb. Este tópico pressupõe que você tenha criado um grafo de áudio, conforme descrito em Como criar um grafo de processamento de áudio básico. Se você ainda não tiver criado um grafo de áudio, X3DAudioInitialize falhará.

Para inicializar x3DAudio

  1. Inicialize X3DAudio chamando X3DAudioInitialize.

    A função X3DAudioInitialize usa sinalizadores indicando a configuração do alto-falante, a velocidade do som em unidades mundiais definidas pelo usuário por segundo e um identificador para retornar uma instância do mecanismo X3DAudio. Chame IXAudio2MasteringVoice::GetChannelMask para obter a máscara de canal do formato de saída.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
    X3DAUDIO_HANDLE X3DInstance;
    X3DAudioInitialize( dwChannelMask, X3DAUDIO_SPEED_OF_SOUND, X3DInstance );
    
  2. Crie instâncias das estruturas X3DAUDIO_LISTENER e X3DAUDIO_EMITTER .

    A estrutura X3DAUDIO_LISTENER representa a posição do que está ouvindo o som. Geralmente, essa é a posição da câmera ou uma posição próxima a ela. A estrutura X3DAUDIO_EMITTER representa a posição da coisa que está fazendo o som. Haverá uma estrutura X3DAUDIO_EMITTER para cada som que está sendo rastreado.

    Os membros das estruturas que não serão atualizadas em um loop de jogo devem ser inicializados aqui. A maioria dos membros das estruturas pode simplesmente ser inicializada como zero. No entanto, alguns membros de X3DAUDIO_EMITTER precisam ser definidos para serem inicializados como valores não zero. O membro ChannelCount do X3DAUDIO_EMITTER precisa ser inicializado para o número de canais na voz que o emissor representa. Além disso, o membro CurveDistanceScaler do X3DAUDIO_EMITTER deve estar no intervalo FLT_MIN para FLT_MAX.

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

O ChannelCount aqui pressupõe que estamos tocando um som monocanal que é o easist a ser configurado. Para fontes de som com mais de 1 canal, você também deve definir o emissor ChannelRadius e pChannelAzimuths os valores.

  1. Crie uma instância da estrutura X3DAUDIO_DSP_SETTINGS .

    A estrutura X3DAUDIO_DSP_SETTINGS é usada para retornar resultados calculados por X3DAudioCalculate. A função X3DAudioCalculate não aloca memória para nenhum de seus parâmetros. Isso significa que você precisa alocar matrizes para os membros pMatrixCoefficients e pDelayTimes da estrutura X3DAUDIO_DSP_SETTINGS se você pretende usá-las. Além disso, você precisa definir os membros SrcChannelCount e DstChannelCount para o número de canais nas vozes de origem e destino do emissor.

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

    Observação

    Use IXAudio2Voice::GetVoiceDetails na voz de masterização para obter o número de InputChannels para nChannels. Para versões do SDK do DirectX do XAUDIO2 antes de Windows 8, use IXAudio2::GetDeviceDetails.

     

Execute essas etapas uma vez a cada dois ou três quadros para calcular novas configurações e aplicá-las. Neste exemplo, uma voz de origem está enviando diretamente para a voz de mestre e para uma voz de submixagem com um efeito reverb aplicado a ela.

Para usar X3DAudio para calcular e aplicar novas configurações de áudio 3D

  1. Atualize as estruturas X3DAUDIO_LISTENER e X3DAUDIO_EMITTER com sua posição, velocidade e orientação atuais.

    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. Chame X3DAudioCalculate para calcular novas configurações para as vozes.

    Os parâmetros para X3DAudioCalculate serão as estruturas de X3DAUDIO_LISTENER e X3DAUDIO_EMITTER atualizadas. Os sinalizadores indicarão quais valores X3DAudioCalculate devem calcular e qual estrutura X3DAUDIO_DSP_SETTINGS conterá os resultados dos cálculos executados.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Use IXAudio2Voice::SetOutputMatrix e IXAudio2SourceVoice::SetFrequencyRatio para aplicar os valores de volume e de tom à voz de origem.

    pSFXSourceVoice->SetOutputMatrix( pMasterVoice, 1, deviceDetails.OutputFormat.Format.nChannels, DSPSettings.pMatrixCoefficients ) ;
    pSFXSourceVoice->SetFrequencyRatio(DSPSettings.DopplerFactor);
    
  4. Use IXAudio2Voice::SetOutputMatrix para aplicar o nível de reverb calculado à voz de submixagem.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Use IXAudio2Voice::SetFilterParameters para aplicar o coeficiente direto de filtro de passagem baixa calculado à voz de origem.

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

X3DAudio

Visão geral do X3DAudio

Guia de Programação em XAudio2

XAudio2 Volume e Controle de Tom