Cómo: crear un efecto en cadena

En este tema se muestra cómo puede aplicar una cadena de efectos a una voz para permitir el procesamiento personalizado de los datos de audio para esa voz. En este tema se describe cómo usar el efecto de reverberación, que es uno de los efectos XAudio2 integrados.

Para crear una cadena de efectos básica que aplique un efecto a una voz

  1. Cree el efecto.

    En este ejemplo, la función XAudio2CreateReverb crea un efecto de reverberación. Consulta Efectos de audio XAudio2 para obtener una lista de posibles fuentes de efectos para su uso con XAudio2.

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. Rellene una estructura de XAUDIO2_EFFECT_DESCRIPTOR con datos.

    Si hay varios efectos en la cadena, cada efecto necesitará una estructura XAUDIO2_EFFECT_DESCRIPTOR .

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. Rellene una estructura de XAUDIO2_EFFECT_CHAIN con datos. En este caso, la cadena solo tiene un efecto. Si la cadena tiene más de un efecto, el miembro EffectCount contendrá el recuento de efectos y el miembro pEffectDescriptors apuntará a una matriz de estructuras XAUDIO2_EFFECT_DESCRIPTOR.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. Aplique la cadena de efectos a una voz con la función SetEffectChain .

    Puede aplicar cadenas de efectos a las voces maestras, las voces de origen y las voces de submezcla.

    pVoice->SetEffectChain(&chain);
    
  5. Libere el efecto con IUnknown::Release.

    Al crear un XAPO, tendrá un recuento de referencias de 1. Cuando el XAPO se pasa a XAudio2 con SetEffectChain, XAudio2 incrementa el recuento de referencias en el XAPO. Liberar la referencia del cliente a XAPO permite que XAudio2 tome posesión del XAPO. Si XAudio2 tiene la única referencia al XAPO, se eliminará cuando XAudio2 ya no la use. Si el código de cliente necesita mantener una referencia al XAPO (por ejemplo, para su reutilización posterior), debe omitir este paso.

    pXAPO->Release();
    
  6. Rellene la estructura de parámetros, si existe, asociada al efecto. El efecto de reverberación usa una estructura 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. Pase la estructura de parámetros de efecto al efecto llamando a la función SetEffectParameters en la voz a la que se adjunta el efecto.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Deshabilite o habilite el efecto, siempre que corresponda.

    Puede usar DisableEffect en cualquier momento para desactivar un efecto.

    pVoice->DisableEffect(0);
    

    Puede volver a activar un efecto con EnableEffect.

    pVoice->EnableEffect(0);
    

    Los parámetros de DisableEffect y EnableEffect especifican el efecto de la cadena para habilitar o deshabilitar.

Efectos de audio

Guía de programación de XAudio2

Cómo: crear un gráfico de procesamiento de audio básico

Introducción a XAPO

Cómo: Usar XAOPFX en XAudio2

Cómo: Usar una XAOP en XAudio2