Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Instrukcje: tworzenie łańcucha efektu

W tym temacie pokazano, jak można zastosować łańcuch efektu do głosu, aby umożliwić niestandardowe przetwarzanie danych dźwiękowych dla tego głosu. W tym temacie opisano sposób używania efektu reverb, który jest jednym z wbudowanych efektów XAudio2.

Aby utworzyć podstawowy łańcuch efektu, który stosuje efekt do głosu

  1. Utwórz efekt.

    W tym przykładzie funkcja XAudio2CreateReverb tworzy efekt reverb. Zobacz XAudio2 Audio Effects, aby uzyskać listę możliwych źródeł efektów do użycia z XAudio2.

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. Wypełnij strukturę XAUDIO2_EFFECT_DESCRIPTOR danymi.

    Jeśli w łańcuchu istnieje wiele efektów, każdy efekt będzie potrzebował struktury XAUDIO2_EFFECT_DESCRIPTOR.

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. Wypełnij strukturę XAUDIO2_EFFECT_CHAIN danymi. W tym przypadku łańcuch ma tylko jeden efekt. Jeśli łańcuch ma więcej niż jeden efekt, element członkowski EffectCount będzie zawierać liczbę efektów, a element członkowski pEffectDescriptors wskaże tablicę struktur XAUDIO2_EFFECT_DESCRIPTOR.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. Zastosuj łańcuch efektu do głosu za pomocą funkcji SetEffectChain.

    Łańcuchy efektów można stosować do głosów głównych, głosów źródłowych i głosów podrzędnych.

    pVoice->SetEffectChain(&chain);
    
  5. Zwolnij efekt używając IUnknown::Release.

    Podczas tworzenia obiektu XAPO będzie on miał liczbę odwołań wynoszącą 1. Po przekazaniu obiektu XAPO do klasy XAudio2 z SetEffectChainXAudio2 zwiększa liczbę odwołań dla obiektu XAPO. Zwolnienie odwołania klienta do obiektu XAPO umożliwia XAudio2 przejęcie na własność obiektu XAPO. Jeśli XAudio2 ma jedyne odwołanie do obiektu XAPO, zostanie on usunięty, gdy nie jest już używany przez XAudio2. Jeśli kod klienta musi zachować odwołanie do obiektu XAPO — na przykład w celu późniejszego ponownego użycia — należy pominąć ten krok.

    pXAPO->Release();
    
  6. Wypełnij strukturę parametrów, jeśli istnieje, skojarzona z efektem. Efekt reverb używa struktury 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. Przekaż strukturę parametrów efektu do efektu, wywołując funkcję SetEffectParameters na głosie, do którego jest dołączony efekt.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Wyłącz lub włącz efekt, jeśli jest to odpowiednie.

    Możesz użyć DisableEffect w dowolnym momencie, aby wyłączyć efekt.

    pVoice->DisableEffect(0);
    

    Możesz ponownie włączyć efekt za pomocą EnableEffect.

    pVoice->EnableEffect(0);
    

    Parametry DisableEffect i EnableEffect określają, który efekt w łańcuchu ma być włączony lub wyłączony.

efekty dźwiękowe

przewodnik programowania XAudio2

Instrukcje: tworzenie podstawowego grafu przetwarzania dźwięku

XAPO — omówienie

Jak używać XAOPFX w XAudio2

Jak: korzystanie z XAOP w XAudio2