Bagikan melalui


Cara: Membuat Rantai Efek

Topik ini menunjukkan kepada Anda bagaimana Anda dapat menerapkan rantai efek ke suara untuk memungkinkan pemrosesan kustom data audio untuk suara tersebut. Topik ini menjelaskan cara menggunakan efek gaung, yang merupakan salah satu efek XAudio2 bawaan.

Untuk membuat rantai efek dasar yang menerapkan efek pada suara

  1. Buat efeknya.

    Dalam contoh ini, fungsi XAudio2CreateReverb membuat efek gaung. Lihat Efek Audio XAudio2 untuk daftar kemungkinan sumber efek untuk digunakan dengan XAudio2.

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. Isi struktur XAUDIO2_EFFECT_DESCRIPTOR dengan data.

    Jika ada beberapa efek dalam rantai, setiap efek akan membutuhkan struktur XAUDIO2_EFFECT_DESCRIPTOR .

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. Isi struktur XAUDIO2_EFFECT_CHAIN dengan data. Dalam hal ini, rantai hanya memiliki satu efek. Jika rantai memiliki lebih dari satu efek, anggota EffectCount akan berisi jumlah efek, dan anggota pEffectDescriptors akan menunjuk ke array struktur XAUDIO2_EFFECT_DESCRIPTOR.

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. Terapkan rantai efek ke suara dengan fungsi SetEffectChain .

    Anda dapat menerapkan rantai efek ke suara master, suara sumber, dan suara submix.

    pVoice->SetEffectChain(&chain);
    
  5. Rilis efek dengan IUnknown::Release.

    Ketika Anda membuat XAPO, itu akan memiliki jumlah referensi 1. Ketika XAPO diteruskan ke XAudio2 dengan SetEffectChain, XAudio2 menaikkan jumlah referensi pada XAPO. Merilis referensi klien ke XAPO memungkinkan XAudio2 untuk mengambil kepemilikan XAPO. Jika XAudio2 memiliki satu-satunya referensi ke XAPO, XAudio2 akan dibuang ketika tidak lagi digunakan oleh XAudio2. Jika kode klien perlu mempertahankan referensi ke XAPO—misalnya untuk digunakan kembali nanti—Anda harus melewati langkah ini.

    pXAPO->Release();
    
  6. Isi struktur parameter, jika ada, yang terkait dengan efeknya. Efek reverb menggunakan struktur 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. Teruskan struktur parameter efek ke efek dengan memanggil fungsi SetEffectParameters pada suara tempat efek dilampirkan.

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. Nonaktifkan atau aktifkan efek, kapan pun sesuai.

    Anda dapat menggunakan DisableEffect kapan saja untuk menonaktifkan efek.

    pVoice->DisableEffect(0);
    

    Anda dapat mengaktifkan efek lagi dengan EnableEffect.

    pVoice->EnableEffect(0);
    

    Parameter untuk DisableEffect dan EnableEffect menentukan efek mana dalam rantai yang akan diaktifkan atau dinonaktifkan.

Efek Audio

Panduan Pemrograman XAudio2

Cara: Membangun Grafik Pemrosesan Audio Dasar

Gambaran Umum XAPO

Cara: Menggunakan XAOPFX di XAudio2

Cara: Menggunakan XAOP di XAudio2