XAudio2學習之內建音效:混響

來源:互聯網
上載者:User

標籤:

XAudio2提供了兩種內建音頻特效,這兩種音頻特效以及它們的建立方式如下:

Effect Creation Method
Reverb XAudio2CreateReverb
Volume Meter XAudio2CreateVolumeMeter
如何使用內建音頻特效呢?大致步驟如下:

1.建立XAPO對象;

2.建立XAPO對象描述結構體對象,用於對XAPO資訊進行描述;

3.建立效果鏈結構體對象,用於持有描述結構體對象:包括兩個成員變數:一個是持有的對象個數,一個是所有對象的數組;

4.將效果鏈傳遞給XAudio2;

5.釋放XAPO對象;

6.建立音效參數結構體對象,並設定需要的值;

7.將參數結構體對象傳遞給XAudio2對象;

8.啟用或者禁用效果。

對於參數結構體各個成員變數,上一篇文章也有說明,如果覺得我表達的不準確,可以去查看MSDN或者DirectX 手冊。對於每個結構體成員變數的取值,都是有範圍的,XAduio2也提供了預設值,具體如下:

// XAUDIO2FX_REVERB_PARAMETERS: Native parameter set for the reverb effecttypedef struct XAUDIO2FX_REVERB_PARAMETERS{    // ratio of wet (processed) signal to dry (original) signal    float WetDryMix;            // [0, 100] (percentage)    // Delay times    UINT32 ReflectionsDelay;    // [0, 300] in ms    BYTE ReverbDelay;           // [0, 85] in ms    BYTE RearDelay;             // [0, 5] in ms    // Indexed parameters    BYTE PositionLeft;          // [0, 30] no units    BYTE PositionRight;         // [0, 30] no units, ignored when configured to mono    BYTE PositionMatrixLeft;    // [0, 30] no units    BYTE PositionMatrixRight;   // [0, 30] no units, ignored when configured to mono    BYTE EarlyDiffusion;        // [0, 15] no units    BYTE LateDiffusion;         // [0, 15] no units    BYTE LowEQGain;             // [0, 12] no units    BYTE LowEQCutoff;           // [0, 9] no units    BYTE HighEQGain;            // [0, 8] no units    BYTE HighEQCutoff;          // [0, 14] no units    // Direct parameters    float RoomFilterFreq;       // [20, 20000] in Hz    float RoomFilterMain;       // [-100, 0] in dB    float RoomFilterHF;         // [-100, 0] in dB    float ReflectionsGain;      // [-100, 20] in dB    float ReverbGain;           // [-100, 20] in dB    float DecayTime;            // [0.1, inf] in seconds    float Density;              // [0, 100] (percentage)    float RoomSize;             // [1, 100] in feet    // component control    BOOL DisableLateField;      // TRUE to disable late field reflections} XAUDIO2FX_REVERB_PARAMETERS;// Maximum, minimum and default values for the parameters above#define XAUDIO2FX_REVERB_MIN_WET_DRY_MIX            0.0f#define XAUDIO2FX_REVERB_MIN_REFLECTIONS_DELAY      0#define XAUDIO2FX_REVERB_MIN_REVERB_DELAY           0#define XAUDIO2FX_REVERB_MIN_REAR_DELAY             0#define XAUDIO2FX_REVERB_MIN_POSITION               0#define XAUDIO2FX_REVERB_MIN_DIFFUSION              0#define XAUDIO2FX_REVERB_MIN_LOW_EQ_GAIN            0#define XAUDIO2FX_REVERB_MIN_LOW_EQ_CUTOFF          0#define XAUDIO2FX_REVERB_MIN_HIGH_EQ_GAIN           0#define XAUDIO2FX_REVERB_MIN_HIGH_EQ_CUTOFF         0#define XAUDIO2FX_REVERB_MIN_ROOM_FILTER_FREQ       20.0f#define XAUDIO2FX_REVERB_MIN_ROOM_FILTER_MAIN       -100.0f#define XAUDIO2FX_REVERB_MIN_ROOM_FILTER_HF         -100.0f#define XAUDIO2FX_REVERB_MIN_REFLECTIONS_GAIN       -100.0f#define XAUDIO2FX_REVERB_MIN_REVERB_GAIN            -100.0f#define XAUDIO2FX_REVERB_MIN_DECAY_TIME             0.1f#define XAUDIO2FX_REVERB_MIN_DENSITY                0.0f#define XAUDIO2FX_REVERB_MIN_ROOM_SIZE              0.0f#define XAUDIO2FX_REVERB_MAX_WET_DRY_MIX            100.0f#define XAUDIO2FX_REVERB_MAX_REFLECTIONS_DELAY      300#define XAUDIO2FX_REVERB_MAX_REVERB_DELAY           85#define XAUDIO2FX_REVERB_MAX_REAR_DELAY             5#define XAUDIO2FX_REVERB_MAX_POSITION               30#define XAUDIO2FX_REVERB_MAX_DIFFUSION              15#define XAUDIO2FX_REVERB_MAX_LOW_EQ_GAIN            12#define XAUDIO2FX_REVERB_MAX_LOW_EQ_CUTOFF          9#define XAUDIO2FX_REVERB_MAX_HIGH_EQ_GAIN           8#define XAUDIO2FX_REVERB_MAX_HIGH_EQ_CUTOFF         14#define XAUDIO2FX_REVERB_MAX_ROOM_FILTER_FREQ       20000.0f#define XAUDIO2FX_REVERB_MAX_ROOM_FILTER_MAIN       0.0f#define XAUDIO2FX_REVERB_MAX_ROOM_FILTER_HF         0.0f#define XAUDIO2FX_REVERB_MAX_REFLECTIONS_GAIN       20.0f#define XAUDIO2FX_REVERB_MAX_REVERB_GAIN            20.0f#define XAUDIO2FX_REVERB_MAX_DENSITY                100.0f#define XAUDIO2FX_REVERB_MAX_ROOM_SIZE              100.0f#define XAUDIO2FX_REVERB_DEFAULT_WET_DRY_MIX        100.0f#define XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_DELAY  5#define XAUDIO2FX_REVERB_DEFAULT_REVERB_DELAY       5#define XAUDIO2FX_REVERB_DEFAULT_REAR_DELAY         5#define XAUDIO2FX_REVERB_DEFAULT_POSITION           6#define XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX    27#define XAUDIO2FX_REVERB_DEFAULT_EARLY_DIFFUSION    8#define XAUDIO2FX_REVERB_DEFAULT_LATE_DIFFUSION     8#define XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_GAIN        8#define XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_CUTOFF      4#define XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_GAIN       8#define XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_CUTOFF     4#define XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_FREQ   5000.0f#define XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_MAIN   0.0f#define XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_HF     0.0f#define XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_GAIN   0.0f#define XAUDIO2FX_REVERB_DEFAULT_REVERB_GAIN        0.0f#define XAUDIO2FX_REVERB_DEFAULT_DECAY_TIME         1.0f#define XAUDIO2FX_REVERB_DEFAULT_DENSITY            100.0f#define XAUDIO2FX_REVERB_DEFAULT_ROOM_SIZE          100.0f#define XAUDIO2FX_REVERB_DEFAULT_DISABLE_LATE_FIELD FALSE

本篇主要是展示如何使用內建混響音頻特效,具體實現代碼如下:

#pragma once#include "WaveFile.h"#include "XAudio2.h"#include <XAudio2fx.h>class VoiceCallBack : public IXAudio2VoiceCallback{public:HANDLE hBufferEndEvent;VoiceCallBack() : hBufferEndEvent(CreateEvent(NULL, FALSE, FALSE, NULL)){}~VoiceCallBack(){ CloseHandle(hBufferEndEvent); }void OnStreamEnd() { /*SetEvent(hBufferEndEvent);*/ }void OnVoiceProcessingPassEnd() { }void OnVoiceProcessingPassStart(UINT32 SamplesRequired) {    }//Called when the voice has just finished playing an audio buffer.void OnBufferEnd(void * pBufferContext)    { SetEvent(hBufferEndEvent); }void OnBufferStart(void * pBufferContext) {    }void OnLoopEnd(void * pBufferContext) { /*SetEvent(hBufferEndEvent);*/ }void OnVoiceError(void * pBufferContext, HRESULT Error) { }}; int main(int argc, char *argv[]) { HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);;//com初始化 if (FAILED(hr)) return 0;  IXAudio2 *pEngine = NULL; hr = XAudio2Create(&pEngine);//建立引擎 if (FAILED(hr)) return 0;  IXAudio2MasteringVoice *pMasterVoice = NULL; hr = pEngine->CreateMasteringVoice(&pMasterVoice);//建立主聲音,預設是輸出當前擴音器 if (FAILED(hr)) return 0;  CWaveFile waveFile; hr = waveFile.Open(L"F:\\案頭\\24bit-48khz.wav", NULL, WAVEFILE_READ);//負載檔案 if (FAILED(hr)) return 0;  WAVEFORMATEX *waveFormat = waveFile.GetFormat();//擷取檔案格式VoiceCallBack callBack; IXAudio2SourceVoice *pSourceVoice = NULL;hr = pEngine->CreateSourceVoice(&pSourceVoice, waveFormat, 0, 1.0f, &callBack);//建立源聲音,用來提交資料 if (FAILED(hr)) return 0;IUnknown *pXAPO = NULL;hr = XAudio2CreateReverb(&pXAPO);//建立混響對象if (FAILED(hr))return 0;XAUDIO2_EFFECT_DESCRIPTOR descriptor;//效果描述,包含了一個XAPO的資訊descriptor.InitialState = true;descriptor.OutputChannels = 2;descriptor.pEffect = pXAPO;XAUDIO2_EFFECT_CHAIN eChain;//效果鏈,包含了含有幾個效果對象eChain.EffectCount = 1;eChain.pEffectDescriptors = &descriptor;hr = pSourceVoice->SetEffectChain(&eChain);//將效果鏈傳遞給voiceif (FAILED(hr))return 0; pXAPO->Release();//傳給voice後,voice接管此對象。防止外部對此對象修改,釋放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;int effectIndex = 0;hr = pSourceVoice->SetEffectParameters(effectIndex, &reverbParameters, sizeof(reverbParameters));//將設定傳遞給voiceif (FAILED(hr))return 0;hr = pSourceVoice->EnableEffect(effectIndex);//啟動音效。禁止音效是DisableEffect(effectIndex);if (FAILED(hr))return 0; DWORD size = waveFile.GetSize();//擷取檔案的大小 BYTE *pData = new BYTE[size];//申請記憶體空間,用於儲存資料 hr = waveFile.Read(pData, size, &size);//讀取檔案內容 if (FAILED(hr)) return 0; XAUDIO2_BUFFER buffer = {0};//將讀取的檔案資料,賦值XAUDIO2_BUFFER buffer.AudioBytes = size; buffer.pAudioData = pData;//buffer.Flags = XAUDIO2_END_OF_STREAM;  hr = pSourceVoice->SubmitSourceBuffer(&buffer);//提交記憶體資料 if (FAILED(hr)) return 0;  hr = pSourceVoice->Start(0);//啟動源聲音 if (FAILED(hr)) return 0; XAUDIO2_VOICE_STATE state;while (pSourceVoice->GetState(&state), state.BuffersQueued > 0)//等待隊列中的資料播放完成,退出線程{WaitForSingleObject(callBack.hBufferEndEvent, INFINITE);}  pMasterVoice->DestroyVoice();//釋放資源 pSourceVoice->DestroyVoice();//釋放資源 pEngine->Release();//釋放資源 CoUninitialize();//釋放資源delete []pData;//釋放資源pData = NULL; return 0; }
需要注意的是,需要包含標頭檔:

#include <XAudio2fx.h>才可以使用內建音效混響。

交流QQ:1245178753

本文地址:http://blog.csdn.net/u011417605/article/details/51178625

XAudio2學習之內建音效:混響

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.