So wird's gemacht: Erstellen einer Effektkette

In diesem Thema erfahren Sie, wie Sie eine Effektkette auf eine Stimme anwenden können, um eine benutzerdefinierte Verarbeitung der Audiodaten für diese Stimme zu ermöglichen. In diesem Thema wird beschrieben, wie Sie den Halleffekt verwenden, der einer der integrierten XAudio2-Effekte ist.

So erstellen Sie eine grundlegende Effektkette, die einen Effekt auf eine Stimme anwendet

  1. Erstellen Sie den Effekt.

    In diesem Beispiel erstellt die XAudio2CreateReverb-Funktion einen Halleffekt. Eine Liste möglicher Effektquellen für die Verwendung mit XAudio2 finden Sie unter XAudio2-Audioeffekte .

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. Füllen Sie eine XAUDIO2_EFFECT_DESCRIPTOR-Struktur mit Daten auf.

    Wenn mehrere Effekte in der Kette vorhanden sind, benötigt jeder Effekt eine XAUDIO2_EFFECT_DESCRIPTOR Struktur.

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. Füllen Sie eine XAUDIO2_EFFECT_CHAIN-Struktur mit Daten auf. In diesem Fall hat die Kette nur einen Effekt. Wenn die Kette mehr als einen Effekt hat, enthält das EffectCount-Element die Anzahl der Effekte, und das pEffectDescriptors-Element zeigt auf ein Array von XAUDIO2_EFFECT_DESCRIPTOR Strukturen.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. Wenden Sie die Effektkette mit der SetEffectChain-Funktion auf eine Stimme an.

    Sie können Effektketten auf master Stimmen, Quellstimmstimden und Submixstimmstimden anwenden.

    pVoice->SetEffectChain(&chain);
    
  5. Lassen Sie den Effekt mit IUnknown::Release frei.

    Wenn Sie ein XAPO erstellen, weist er die Referenzanzahl 1 auf. Wenn das XAPO mit SetEffectChain an XAudio2 übergeben wird, erhöht XAudio2 die Verweisanzahl auf dem XAPO. Durch das Freigeben des Verweises des Clients auf das XAPO kann XAudio2 den Besitz des XAPO übernehmen. Wenn XAudio2 den einzigen Verweis auf das XAPO hat, wird es verworfen, wenn es nicht mehr von XAudio2 verwendet wird. Wenn der Clientcode einen Verweis auf das XAPO beibehalten muss , z. B. für die spätere Wiederverwendung, sollten Sie diesen Schritt überspringen.

    pXAPO->Release();
    
  6. Füllen Sie ggf. die dem Effekt zugeordnete Parameterstruktur auf. Der Halleffekt verwendet eine XAUDIO2FX_REVERB_PARAMETERS Struktur.

    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. Übergeben Sie die Effektparameterstruktur an den Effekt, indem Sie die SetEffectParameters-Funktion für die Stimme aufrufen, an die der Effekt angefügt ist.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Deaktivieren oder aktivieren Sie den Effekt, wann immer dies angebracht ist.

    Sie können DisableEffect jederzeit verwenden, um einen Effekt zu deaktivieren.

    pVoice->DisableEffect(0);
    

    Sie können einen Effekt mit EnableEffect erneut aktivieren.

    pVoice->EnableEffect(0);
    

    Die Parameter für DisableEffect und EnableEffect geben an, welche Auswirkung in der Kette aktiviert oder deaktiviert werden soll.

Audioeffekte

XAudio2-Programmieranleitung

So wird's gemacht: Erstellen eines grundlegenden Audioverarbeitungsdiagramms

XAPO–Übersicht

Vorgehensweise: Verwenden von XAOPFX in XAudio2

Vorgehensweise: Verwenden eines XAOP in XAudio2