Compartilhar via


Como: Criar uma cadeia de efeitos

Este tópico mostra como você pode aplicar uma cadeia de efeitos a uma voz para permitir o processamento personalizado dos dados de áudio para essa voz. Este tópico descreve como usar o efeito reverb, que é um dos efeitos XAudio2 internos.

Para criar uma cadeia de efeitos básica que aplica um efeito a uma voz

  1. Crie o efeito .

    Neste exemplo, a função XAudio2CreateReverb cria um efeito reverb. Consulte Efeitos de áudio XAudio2 para obter uma lista de possíveis fontes de efeitos para uso com XAudio2.

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. Preencha uma estrutura XAUDIO2_EFFECT_DESCRIPTOR com dados.

    Se houver vários efeitos na cadeia, cada efeito precisará de uma estrutura XAUDIO2_EFFECT_DESCRIPTOR .

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. Preencha uma estrutura XAUDIO2_EFFECT_CHAIN com dados. Nesse caso, a cadeia tem apenas um efeito. Se a cadeia tiver mais de um efeito, o membro EffectCount conterá a contagem de efeitos e o membro pEffectDescriptors apontará para uma matriz de estruturas XAUDIO2_EFFECT_DESCRIPTOR.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. Aplique a cadeia de efeitos a uma voz com a função SetEffectChain .

    Você pode aplicar cadeias de efeitos a vozes master, vozes de origem e vozes de submixagem.

    pVoice->SetEffectChain(&chain);
    
  5. Libere o efeito com IUnknown::Release.

    Quando você criar um XAPO, ele terá uma contagem de referência de 1. Quando o XAPO é passado para XAudio2 com SetEffectChain, xAudio2 incrementa a contagem de referência no XAPO. Liberar a referência do cliente para o XAPO permite que o XAudio2 assuma a propriedade do XAPO. Se XAudio2 tiver a única referência ao XAPO, ele será descartado quando não estiver mais sendo usado pelo XAudio2. Se o código do cliente precisar manter uma referência ao XAPO, por exemplo, para reutilização posterior, ignore esta etapa.

    pXAPO->Release();
    
  6. Preencha a estrutura de parâmetros, se houver, associada ao efeito . O efeito reverb usa uma estrutura XAUDIO2FX_REVERB_PARAMETERS .

    XAUDIO2FX_REVERB_PARAMETERS reverbParameters;
    reverbParameters.ReflectionsDelay = XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_DELAY;
    reverbParameters.ReverbDelay = XAUDIO2FX_REVERB_DEFAULT_REVERB_DELAY;
    reverbParameters.RearDelay = XAUDIO2FX_REVERB_DEFAULT_REAR_DELAY;
    reverbParameters.PositionLeft = XAUDIO2FX_REVERB_DEFAULT_POSITION;
    reverbParameters.PositionRight = XAUDIO2FX_REVERB_DEFAULT_POSITION;
    reverbParameters.PositionMatrixLeft = XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX;
    reverbParameters.PositionMatrixRight = XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX;
    reverbParameters.EarlyDiffusion = XAUDIO2FX_REVERB_DEFAULT_EARLY_DIFFUSION;
    reverbParameters.LateDiffusion = XAUDIO2FX_REVERB_DEFAULT_LATE_DIFFUSION;
    reverbParameters.LowEQGain = XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_GAIN;
    reverbParameters.LowEQCutoff = XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_CUTOFF;
    reverbParameters.HighEQGain = XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_GAIN;
    reverbParameters.HighEQCutoff = XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_CUTOFF;
    reverbParameters.RoomFilterFreq = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_FREQ;
    reverbParameters.RoomFilterMain = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_MAIN;
    reverbParameters.RoomFilterHF = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_HF;
    reverbParameters.ReflectionsGain = XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_GAIN;
    reverbParameters.ReverbGain = XAUDIO2FX_REVERB_DEFAULT_REVERB_GAIN;
    reverbParameters.DecayTime = XAUDIO2FX_REVERB_DEFAULT_DECAY_TIME;
    reverbParameters.Density = XAUDIO2FX_REVERB_DEFAULT_DENSITY;
    reverbParameters.RoomSize = XAUDIO2FX_REVERB_DEFAULT_ROOM_SIZE;
    reverbParameters.WetDryMix = XAUDIO2FX_REVERB_DEFAULT_WET_DRY_MIX;
    
  7. Passe a estrutura do parâmetro de efeito para o efeito chamando a função SetEffectParameters na voz à qual o efeito está anexado.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Desabilite ou habilite o efeito, sempre que apropriado.

    Você pode usar DisableEffect a qualquer momento para desativar um efeito.

    pVoice->DisableEffect(0);
    

    Você pode ativar um efeito novamente com EnableEffect.

    pVoice->EnableEffect(0);
    

    Os parâmetros para DisableEffect e EnableEffect especificam qual efeito na cadeia habilitar ou desabilitar.

Efeitos de áudio

Guia de Programação em XAudio2

Como: Compilar um gráfico de processamento de áudio básico

Visão geral do XAPO

Como usar XAOPFX no XAudio2

Como usar um XAOP no XAudio2