Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
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 );
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
epChannelAzimuths
do emissor.
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
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;
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 );
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);
Use IXAudio2Voice::SetOutputMatrix para aplicar o nível de reverberação calculado à voz da submixagem.
pSFXSourceVoice->SetOutputMatrix(pSubmixVoice, 1, 1, &DSPSettings.ReverbLevel);
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);
Tópicos relacionados