XAudio2学习之音频特效库XAPOFX

XAPOFX是一个继承自XAPO接口的音频效果集合,用于XAudio2。XAPOFX包含了几种效果以及一个通用的创建音效实例的机制。

XAPOFX中包含的效果如下表:

Effect Description Parameter Structure Parameter Constants Requirements
FXECHO An echo effect. FXECHO_PARAMETERS FXECHO
Constants
Only supports FLOAT32 audio formats.
FXEQ A four band equalizer. FXEQ_PARAMETERS FXEQ
Constants
Only supports FLOAT32 audio formats. The sample rate must be between 22,000 Hz and 48,000 Hz.
FXMasteringLimiter A volume limiter. FXMASTERINGLIMITER_PARAMETERS FXMASTERINGLIMIT
Constants
Only supports FLOAT32 audio formats.
FXReverb
A simple reverb effect.

XAudio2 also provides an effect implementing Princeton Digital Reverb that can be instantiated withXAudio2CreateReverb.

FXREVERB_PARAMETERS FXREVERB
Constants
Only supports FLOAT32 audio formats. Also, it only supports mono input to mono output, and stereo input to stereo output.

使用CreateFX接口作为通用机制来创建效果实例。此接口需要每个音效对应的CLSID来返回不同的效果实例。

HRESULT CreateFX(
         CLSID clsid,
         IUnknown **pEffect
)

每个XAudio2 voice拥有一条效果链,效果链中包含0或者多个音频效果。输送给voice的音频数据,在输出到目的voice之前,需要通过效果链中的每个效果。voice拥有每个效果的输出,输入给效果链中的下一个效果,直到效果链中没有剩余的效果为止。

使用XAPOFX中的效果,步骤如下:

1.实例化一个效果;

2.填充XAUDIO2_EFFECT_DESCRIPTOR结构体;

3.填充XAUDIO2_EFFECT_CHAIN结构体;

4.将对象传递给XAudio2;

5.释放对象;

6.填充参数结构体;

7.将参数结构体传递给XAudio2.

XAPOFX相关的宏定义以及每个音效的CLSID:

// FX class IDs
class __declspec(uuid("F5E01117-D6C4-485A-A3F5-695196F3DBFA")) FXEQ;
class __declspec(uuid("C4137916-2BE1-46FD-8599-441536F49856")) FXMasteringLimiter;
class __declspec(uuid("7D9ACA56-CB68-4807-B632-B137352E8596")) FXReverb;
class __declspec(uuid("5039D740-F736-449A-84D3-A56202557B87")) FXEcho;

    // EQ parameter bounds (inclusive), used with FXEQ:
    #define FXEQ_MIN_FRAMERATE 22000
    #define FXEQ_MAX_FRAMERATE 48000

    #define FXEQ_MIN_FREQUENCY_CENTER       20.0f
    #define FXEQ_MAX_FREQUENCY_CENTER       20000.0f
    #define FXEQ_DEFAULT_FREQUENCY_CENTER_0 100.0f   // band 0
    #define FXEQ_DEFAULT_FREQUENCY_CENTER_1 800.0f   // band 1
    #define FXEQ_DEFAULT_FREQUENCY_CENTER_2 2000.0f  // band 2
    #define FXEQ_DEFAULT_FREQUENCY_CENTER_3 10000.0f // band 3

    #define FXEQ_MIN_GAIN     0.126f // -18dB
    #define FXEQ_MAX_GAIN     7.94f  // +18dB
    #define FXEQ_DEFAULT_GAIN 1.0f   // 0dB change, all bands

    #define FXEQ_MIN_BANDWIDTH     0.1f
    #define FXEQ_MAX_BANDWIDTH     2.0f
    #define FXEQ_DEFAULT_BANDWIDTH 1.0f // all bands

    // Mastering limiter parameter bounds (inclusive), used with FXMasteringLimiter:
    #define FXMASTERINGLIMITER_MIN_RELEASE     1
    #define FXMASTERINGLIMITER_MAX_RELEASE     20
    #define FXMASTERINGLIMITER_DEFAULT_RELEASE 6

    #define FXMASTERINGLIMITER_MIN_LOUDNESS     1
    #define FXMASTERINGLIMITER_MAX_LOUDNESS     1800
    #define FXMASTERINGLIMITER_DEFAULT_LOUDNESS 1000

    // Reverb parameter bounds (inclusive), used with FXReverb:
    #define FXREVERB_MIN_DIFFUSION     0.0f
    #define FXREVERB_MAX_DIFFUSION     1.0f
    #define FXREVERB_DEFAULT_DIFFUSION 0.9f

    #define FXREVERB_MIN_ROOMSIZE     0.0001f
    #define FXREVERB_MAX_ROOMSIZE     1.0f
    #define FXREVERB_DEFAULT_ROOMSIZE 0.6f

    // Echo initialization data/parameter bounds (inclusive), used with FXEcho:
    #define FXECHO_MIN_WETDRYMIX     0.0f
    #define FXECHO_MAX_WETDRYMIX     1.0f
    #define FXECHO_DEFAULT_WETDRYMIX 0.5f

    #define FXECHO_MIN_FEEDBACK     0.0f
    #define FXECHO_MAX_FEEDBACK     1.0f
    #define FXECHO_DEFAULT_FEEDBACK 0.5f

    #define FXECHO_MIN_DELAY     1.0f
    #define FXECHO_MAX_DELAY     2000.0f
    #define FXECHO_DEFAULT_DELAY 500.0f

每个音效对应的参数结构体如下:

  // EQ parameters (4 bands), used with IXAPOParameters::SetParameters:
    // The EQ supports only FLOAT32 audio foramts.
    // The framerate must be within [22000, 48000] Hz.
    typedef struct FXEQ_PARAMETERS {
        float FrequencyCenter0; // center frequency in Hz, band 0
        float Gain0;            // boost/cut
        float Bandwidth0;       // bandwidth, region of EQ is center frequency +/- bandwidth/2
        float FrequencyCenter1; // band 1
        float Gain1;
        float Bandwidth1;
        float FrequencyCenter2; // band 2
        float Gain2;
        float Bandwidth2;
        float FrequencyCenter3; // band 3
        float Gain3;
        float Bandwidth3;
    } FXEQ_PARAMETERS;

    // Mastering limiter parameters, used with IXAPOParameters::SetParameters:
    // The mastering limiter supports only FLOAT32 audio formats.
    typedef struct FXMASTERINGLIMITER_PARAMETERS {
        UINT32 Release;  // release time (tuning factor with no specific units)
        UINT32 Loudness; // loudness target (threshold)
    } FXMASTERINGLIMITER_PARAMETERS;

    // Reverb parameters, used with IXAPOParameters::SetParameters:
    // The reverb supports only FLOAT32 audio formats with the following
    // channel configurations:
    //     Input: Mono   Output: Mono
    //     Input: Stereo Output: Stereo
    typedef struct FXREVERB_PARAMETERS {
        float Diffusion; // diffusion
        float RoomSize;  // room size
    } FXREVERB_PARAMETERS;

    // Echo initialization data, used with CreateFX:
    // Use of this structure is optional, the default MaxDelay is FXECHO_DEFAULT_DELAY.
    typedef struct FXECHO_INITDATA {
        float MaxDelay;  // maximum delay (all channels) in milliseconds, must be within [FXECHO_MIN_DELAY, FXECHO_MAX_DELAY]
    } FXECHO_INITDATA;

    // Echo parameters, used with IXAPOParameters::SetParameters:
    // The echo supports only FLOAT32 audio formats.
    typedef struct FXECHO_PARAMETERS {
        float WetDryMix; // ratio of wet (processed) signal to dry (original) signal
        float Feedback;  // amount of output fed back into input
        float Delay;     // delay (all channels) in milliseconds, must be within [FXECHO_MIN_DELAY, FXECHO_PARAMETERS.MaxDelay]
    } FXECHO_PARAMETERS;

下面是如何使用XAPOFX库中音频效果的实例,使用方式类似于XAudio2内置音效:

#pragma once
#include "WaveFile.h"
#include "XAudio2.h"
#include <xapofx.h>

#pragma comment(lib,"XAPOFX.lib")

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;
	hr = CreateFX(__uuidof(FXReverb), &pXAPO);//创建FXReverb特效。还有另外三个:FXEQ;FXMasteringLimiter;FXEcho。
	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);//将效果链传递给voice
	if (FAILED(hr))
		return 0;

	pXAPO->Release();//传给voice后,voice接管此对象。防止外部对此对象修改,释放

	FXREVERB_PARAMETERS XAPOParameters;
	XAPOParameters.Diffusion = FXREVERB_DEFAULT_DIFFUSION;
	XAPOParameters.RoomSize = FXREVERB_DEFAULT_ROOMSIZE;

	int effectIndex = 0;
	hr = pSourceVoice->SetEffectParameters(effectIndex, &XAPOParameters, sizeof(XAPOParameters));//将设置传递给voice
	if (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 <xapofx.h>

#pragma comment(lib,"XAPOFX.lib")

才可以使用XAPOFX特效。

交流QQ:1245178753

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

时间: 2024-10-11 01:08:23

XAudio2学习之音频特效库XAPOFX的相关文章

XAudio2学习之自定义音频特效

XAPO API允许创建跨平台音频处理对象(XAPO)以及微软跨平台音频创建工具(XACT)在Windows和Xbox 360上给XAudio2使用. XAPO API提供了IXAPO接口和CXAPOBase类,可以用来创建新的XAPO类型.IXAPO接口包含了创建一个新的XAPO所需要实现的所有方法.CXAPOBase类简单的继承实现了IXAPO接口,除了IXAPO::Process方法,因为对于每一个XAPO来说,这个方法是唯一的. XAPO实例以IUnknown接口的形式传递给XAudio

XAudio2音频特效

An audio effect is an object that takes incoming audio data, and performs some operation on the data before passing it on. You can use an effect to perform a variety of tasks, including adding reverb to an audio stream and monitoring peak volume leve

XAudio2学习之IXAudio2VoiceCallback回调

使用IXAudio2VoiceCallback回调的好处是,在音频数据播放完的时候,可以通知外部程序进行其他操作. 使用IXAudio2VoiceCallback需要继承此接口,然后重新实现,因为内部所有函数都是纯虚函数.所有函数中使用比较多的是OnStreamEnd函数,当音频数据播放完成的时候,OnStreamEnd会触发一个事件. 继承实现IXAudio2VoiceCallback接口: class VoiceCallback : public IXAudio2VoiceCallback

XAudio2学习之采样率转换

使用IXAduio2SubmixVoice可以对wave文件进行采样率转换,以满足设备对波形音频采样率的要求.在XAudio2学习三之获取音频输出设备信息可以看到音频播放设备是有自己支持播放的wave文件的格式的. 以将2通道/44.1k采样率的wave转为2通道/48k的wave为例: 首先,初始化COM组件: HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);;//com初始化 if (FAILED(hr)) return 0;

XAudio2学习之内置音效:混响

XAudio2提供了两种内置音频特效,这两种音频特效以及它们的创建方式如下: Effect Creation Method Reverb XAudio2CreateReverb Volume Meter XAudio2CreateVolumeMeter 如何使用内置音频特效呢?大致步骤如下: 1.创建XAPO对象: 2.创建XAPO对象描述结构体对象,用于对XAPO信息进行描述: 3.创建效果链结构体对象,用于持有描述结构体对象:包括两个成员变量:一个是持有的对象个数,一个是所有对象的数组: 4

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

Google之Chromium浏览器源码学习——base公共通用库(二)

上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池:此外在windows下使用可使用其自带的内存分配方式:具体的第三方库可以参阅:http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml:目前我们主要的精力尽可能在Chromium浏览器中base公共通用库的主要内容上,所以不再详

IOS学习:常用第三方库(GDataXMLNode:xml解析库)

IOS学习:常用第三方库(GDataXMLNode:xml解析库) 分类: ios开发学习2013-05-30 09:45 4443人阅读 评论(0) 收藏 举报 iOSXMLGDataXMLNode 一.GDataXMLNode说明 GDataXMLNode是Google提供的用于XML数据处理的类集.该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法. 使用方法: 1.获取GDataXMLNode.h/m文件,将GDataXMLNo

[学习笔记] Python标准库的学习准备 [转]

Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了解基本的计算机各个组成部分的性能. 操作系统 在了解操作系统时,下面是重点: 1) 操作系统的进程管理,比如什么是UID, PID, daemon 2) 进程之间