Share via


方法: エフェクト チェーンの作成

このトピックでは、音声にエフェクト チェーンを適用して、その音声のオーディオ データをカスタム処理できるようにする方法について説明します。 このトピックでは、組み込みの XAudio2 効果の 1 つであるリバーブ効果を使用する方法について説明します。

音声にエフェクトを適用する基本的なエフェクト チェーンを作成するには

  1. 効果を作成します。

    この例では、 XAudio2CreateReverb 関数によってリバーブ効果が作成されます。 XAudio2 で使用できる効果のソースの一覧については、「XAudio2 Audio Effects」を参照してください。

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. XAUDIO2_EFFECT_DESCRIPTOR構造体にデータを設定します。

    チェーンに複数の効果がある場合、各効果には XAUDIO2_EFFECT_DESCRIPTOR 構造が必要です。

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. XAUDIO2_EFFECT_CHAIN構造体にデータを設定します。 この場合、チェーンの効果は 1 つだけです。 チェーンに複数の効果がある場合、EffectCount メンバーには効果の数が含まれます。pEffectDescriptors メンバーは、XAUDIO2_EFFECT_DESCRIPTOR構造体の配列を指します。

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. SetEffectChain 関数を使用して、エフェクト チェーンを音声に適用します。

    エフェクト チェーンは、マスターボイス、ソースボイス、サブミックスボイスに適用できます。

    pVoice->SetEffectChain(&chain);
    
  5. IUnknown::Release を使用して効果を解放します。

    XAPO を作成すると、参照カウントは 1 になります。 SetEffectChain を使用して XAudio2 に XAPO が渡されると、XAudio2 は XAPO の参照カウントをインクリメントします。 クライアントの XAPO への参照を解放すると、XAudio2 は XAPO の所有権を取得できます。 XAudio2 が XAPO への唯一の参照を持っている場合、XAudio2 で使用されなくなったときに破棄されます。 クライアント コードで XAPO への参照を維持する必要がある場合 (後で再利用する場合など)、この手順は省略する必要があります。

    pXAPO->Release();
    
  6. 効果に関連付けられているパラメーター構造 (存在する場合) を設定します。 リバーブエフェクトは 、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. 効果がアタッチされている音声で SetEffectParameters 関数を呼び出して、効果パラメーター構造を効果に渡します。

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. 必要に応じて、効果を無効または有効にします。

    効果をオフにするには、いつでも DisableEffect を使用できます。

    pVoice->DisableEffect(0);
    

    EnableEffect を使用して、もう一度効果を有効にすることができます。

    pVoice->EnableEffect(0);
    

    DisableEffect および EnableEffect のパラメーターは、チェーン内で有効または無効にする効果を指定します。

オーディオ効果

XAudio2 プログラミング ガイド

方法: 基本的なオーディオ処理グラフの作成

XAPO 概要

方法: XAudio2 で XAOPFX を使用する

方法: XAudio2 で XAOP を使用する