標籤:
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學習之內建音效:混響