Aracılığıyla paylaş


Nasıl yapılır: Efekt Zinciri Oluşturma

Bu konu başlığında, söz konusu ses için ses verilerinin özel olarak işlenmesine izin vermek için bir sese nasıl efekt zinciri uygulayabileceğiniz gösterilmektedir. Bu konuda, yerleşik XAudio2 efektlerinden biri olan reverb efektinin nasıl kullanılacağı açıklanmaktadır.

Bir sese efekt uygulayan temel bir efekt zinciri oluşturmak için

  1. Efekti oluşturun.

    Bu örnekte XAudio2CreateReverb işlevi bir reverb etkisi oluşturur. XAudio2 ile kullanım için olası efekt kaynaklarının listesi için bkz. XAudio2 Ses Efektleri.

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. XAUDIO2_EFFECT_DESCRIPTOR yapısını verilerle doldurun.

    Zincirde birden çok etki varsa, her efektin bir XAUDIO2_EFFECT_DESCRIPTOR yapısı gerekir.

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. XAUDIO2_EFFECT_CHAIN yapısını verilerle doldurun. Bu durumda zincir yalnızca bir etkiye sahiptir. Zincirin birden fazla etkisi varsa, EffectCount üyesi efektlerin sayısını içerir ve pEffectDescriptors üyesi XAUDIO2_EFFECT_DESCRIPTOR yapı dizisine işaret eder.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. SetEffectChain işleviyle efekt zincirini bir sese uygulayın.

    Ana seslere, kaynak seslere ve alt seslere efekt zincirleri uygulayabilirsiniz.

    pVoice->SetEffectChain(&chain);
    
  5. Etkiyi IUnknown::Release ile serbest bırakın.

    XAPO oluşturduğunuzda referans sayısı 1 olur. XAPO, SetEffectChainile XAudio2'ye geçirildiğinde XAudio2, XAPO'da başvuru sayısını artırır. İstemcinin XAPO referansının serbest bırakılması, XAudio2'nin XAPO'nun sahipliğini almasını sağlar. XAudio2, XAPO'ya tek referans ise, artık XAudio2 tarafından kullanılmadığında yok edilir. İstemci kodunun XAPO'ya bir başvuru tutması gerekiyorsa (örneğin, daha sonra yeniden kullanmak için) bu adımı atlamalısınız.

    pXAPO->Release();
    
  6. Etkiyle ilişkili parametre yapısını (varsa) doldurun. Reverb etkisi, bir XAUDIO2FX_REVERB_PARAMETERS yapısı kullanır.

    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. Efektin eklendiği seste SetEffectParameters işlevini çağırarak efekt parametresi yapısını efekte geçirin.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Uygun olduğunda efekti devre dışı bırakın veya etkinleştirin.

    Bir efekti kapatmak için DisableEffect istediğiniz zaman kullanabilirsiniz.

    pVoice->DisableEffect(0);
    

    EnableEffectile bir efekti yeniden açabilirsiniz.

    pVoice->EnableEffect(0);
    

    DisableEffect ve EnableEffect parametreleri zincirdeki hangi efektin etkinleştirileceğini veya devre dışı bırakılacağını belirtir.

Ses Efektleri

XAudio2 Programlama Kılavuzu

Nasıl yapılır: Temel Ses İşleme Grafı oluşturma

XAPO'ya Genel Bakış

Nasıl yapılır: XAudio2'de XAOPFX Kullanma

Nasıl yapılır: XAudio2'de XAOP Kullanma