Share via


Procedura: Creare una catena di effetti

Questo argomento illustra come applicare una catena di effetti a una voce per consentire l'elaborazione personalizzata dei dati audio per tale voce. Questo argomento descrive come usare l'effetto riverbero, ovvero uno degli effetti XAudio2 predefiniti.

Per creare una catena di effetti di base che applica un effetto a una voce

  1. Creare l'effetto.

    In questo esempio la funzione XAudio2CreateReverb crea un effetto riverbero . Per un elenco di possibili origini di effetti da usare con XAudio2, vedere Effetti audio XAudio2 .

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. Popolare una struttura XAUDIO2_EFFECT_DESCRIPTOR con i dati.

    Se nella catena sono presenti più effetti, ogni effetto avrà bisogno di una struttura XAUDIO2_EFFECT_DESCRIPTOR .

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. Popolare una struttura XAUDIO2_EFFECT_CHAIN con dati. In questo caso, la catena ha solo un effetto. Se la catena ha più di un effetto, il membro EffectCount conterrà il conteggio degli effetti e il membro pEffectDescriptors punta a una matrice di strutture XAUDIO2_EFFECT_DESCRIPTOR.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. Applicare la catena di effetti a una voce con la funzione SetEffectChain .

    È possibile applicare catene di effetti a voci master, voci di origine e voci submix.

    pVoice->SetEffectChain(&chain);
    
  5. Rilasciare l'effetto con IUnknown::Release.

    Quando si crea un XAPO, avrà un numero di riferimenti pari a 1. Quando la XAPO viene passata a XAudio2 con SetEffectChain, XAudio2 incrementa il conteggio dei riferimenti sulla XAPO. Il rilascio del riferimento del client alla XAPO consente a XAudio2 di assumere la proprietà della XAPO. Se XAudio2 ha l'unico riferimento alla XAPO, verrà eliminato quando non viene più usato da XAudio2. Se il codice client deve mantenere un riferimento alla XAPO, ad esempio per il riutilizzo successivo, è consigliabile ignorare questo passaggio.

    pXAPO->Release();
    
  6. Popolare la struttura dei parametri, se presente, associata all'effetto. L'effetto riverbero usa una struttura 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. Passare la struttura dei parametri dell'effetto all'effetto chiamando la funzione SetEffectParameters sulla voce a cui è collegato l'effetto.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Disabilitare o abilitare l'effetto, ogni volta che è appropriato.

    È possibile usare DisableEffect in qualsiasi momento per disattivare un effetto.

    pVoice->DisableEffect(0);
    

    È possibile attivare di nuovo un effetto con EnableEffect.

    pVoice->EnableEffect(0);
    

    I parametri per DisableEffect e EnableEffect specificano l'effetto nella catena per abilitare o disabilitare.

Effetti audio

Guida alla programmazione di XAudio2

Procedura: Creare un grafico di elaborazione audio di base

Panoramica di XAPO

Procedura: Usare XAOPFX in XAudio2

Procedura: Usare un XAOP in XAudio2