Partilhar via


Como: Integrar X3DAudio com XAudio2

Este tópico mostra como integrar o X3DAudio com o XAudio2. Você pode usar o X3DAudio para fornecer os valores de volume e tom para vozes XAudio2 e os parâmetros para o efeito de reverberação integrado XAudio2. Este tópico pressupõe que você tenha criado um gráfico de áudio conforme descrito em Como: Criar um gráfico de processamento de áudio básico. Se você ainda não criou um gráfico de áudio, X3DAudioInitialize falhará.

Para inicializar o X3DAudio

  1. Inicialize o X3DAudio chamando X3DAudioInitialize.

    A funçãoX3DAudioInitialize 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 de tudo o que está ouvindo o som. Geralmente, esta é a posição da câmera ou uma posição perto dela. A estrutura X3DAUDIO_EMITTER representa a posição da coisa que faz o som. Haverá uma estrutura X3DAUDIO_EMITTER para cada som que está sendo rastreado.

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

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

O ChannelCount aqui assume que estamos reproduzindo um som mono, que é o mais fácil de configurar. Para fontes de som com mais de 1 canal, você também deve definir os valores de ChannelRadius e pChannelAzimuths do emissor.

  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 caso pretenda utilizá-los. Além disso, é necessário definir os membros SrcChannelCount e DstChannelCount para corresponder ao número de canais presentes 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 mestre para obter o número de canais de entrada para nChannels. Para versões do SDK do DirectX do XAUDIO2 anteriores ao 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 é enviada diretamente para a voz de masterização e para uma voz de submistura com um efeito de reverberação aplicado a ela.

Para usar o 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 as novas configurações das vozes.

    Os parâmetros para X3DAudioCalculate serão a estrutura X3DAUDIO_LISTENER atualizada e a estrutura X3DAUDIO_EMITTER. Os sinalizadores indicarão quais valores X3DAudioCalculate deve calcular e qual estrutura X3DAUDIO_DSP_SETTINGS conterá os resultados dos cálculos realizados.

    X3DAudioCalculate(X3DInstance, &Listener, &Emitter,
        X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB,
        &DSPSettings );
    
  3. Utilize IXAudio2Voice::SetOutputMatrix e IXAudio2SourceVoice::SetFrequencyRatio para aplicar os valores de volume e 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 reverberação calculado à voz da submixagem.

    pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
    
  5. Use IXAudio2Voice::SetFilterParameters para aplicar o coeficiente direto calculado do filtro passa-baixo à 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 XAudio2

Controle de Volume e Afinação XAudio2