XAudio2学习之MonitorAPO

MonitorAPO 通过一种锁无关由应用程序初始化的通讯通道的方式来将音频数据传递给主线程。将MonitorAPO添加到上一篇的源码中,给一个source voice添加了两个特效。

主要是使用管道,在APO中的DoProcess函数中将数据写入,然后在主线程中就可以读出来了。

#include "DXUTLockFreePipe.h"
typedef DXUTLockFreePipe<MONITOR_APO_PIPE_LEN> MonitorAPOPipe;

struct MonitorAPOParams
{
    MonitorAPOPipe *pipe;
};

class __declspec( uuid("{A4945B8A-EB14-4c96-8067-DF726B528091}"))
CMonitorAPO
: public CSampleXAPOBase<CMonitorAPO, MonitorAPOParams>
{
public:
    CMonitorAPO();
    ~CMonitorAPO();

    void DoProcess( const MonitorAPOParams&, FLOAT32* __restrict pData, UINT32 cFrames, UINT32 cChannels );
};

需要使用到模板类DXUTLockFreePipe和模板类CSampleXAPOBase,前者是管道,用来获取数据。后者是XAPO用来完成特效。

CSimpleAPO *pSimpleXAPO = NULL;
	CSimpleAPO::CreateInstance(NULL, 0, &pSimpleXAPO);//创建XAPO实例

	CMonitorAPO *pMpnitorAPO = NULL;
	CMonitorAPO::CreateInstance(NULL, 0, &pMpnitorAPO);

	XAUDIO2_EFFECT_DESCRIPTOR descriptor[2];//效果描述,包含了一个XAPO的信息
	descriptor[0].InitialState = true;
	descriptor[0].OutputChannels = 2;
	descriptor[0].pEffect = dynamic_cast<IXAPO*>(pSimpleXAPO);//强制转换
	descriptor[1].InitialState = true;
	descriptor[1].OutputChannels = 2;
	descriptor[1].pEffect = dynamic_cast<IXAPO*>(pMpnitorAPO);//强制转换

	XAUDIO2_EFFECT_CHAIN eChain;//效果链,包含了含有几个效果对象
	eChain.EffectCount = 2;
	eChain.pEffectDescriptors = descriptor;

	hr = pSourceVoice->SetEffectChain(&eChain);//将效果链传递给voice
	if (FAILED(hr))
		return 0;

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

	SimpleAPOParams simpleParams;//设置参数
	simpleParams.gain = 1.2f;

	hr = pSourceVoice->SetEffectParameters(0, &simpleParams, sizeof(SimpleAPOParams));//将设置传递给voice
	if (FAILED(hr))
	 	return 0;

	MonitorAPOParams monitorParams;
	monitorParams.pipe = new MonitorAPOPipe;

	hr = pSourceVoice->SetEffectParameters(1, &monitorParams, sizeof(MonitorAPOParams));//将设置传递给voice
	if (FAILED(hr))
		return 0;

CMonitorAPO派生自一个模板类CSampleXAPOBase,位于文件SampleAPOBase.h中。模板类实例化时需要提供XAPO类和参数类:APOClass和ParameterClass。参数类可以是结构体。

模板类实现了静态实例化函数CreateInstance,以及LockForProcess和Process接口函数。并预留了一个纯虚函数DoProcess来让子类实现不同的需求。

Process函数实现了如果输入缓冲区的标志位是XAPO_BUFFER_SILENT,将缓冲区置为0.如果为XAPO_BUFFER_VALID,表示数据有效,调用DoProcess来将数据进行写入管道:

void CMonitorAPO::DoProcess( const MonitorAPOParams& params, FLOAT32* __restrict pData, UINT32 cFrames, UINT32 cChannels )
{
    if( cFrames )
    {
        MonitorAPOPipe* pipe = params.pipe;
        if( pipe )
            pipe->Write( pData, cFrames * cChannels * (WaveFormat().wBitsPerSample >> 3) );
    }
}

其中BeginProcess接口可以获取最新的通过SetEffectParameters设置的参数。XAPO只能在Process函数内调用这个方法。

EndProcess告诉CXAPOParametersBase,XAPO已经完成了接收设置的最新的参数。此方法也必须在Process方法内调用。

交流QQ:1245178753

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

源码下载:http://download.csdn.net/detail/u011417605/9497187

时间: 2024-12-07 04:52:34

XAudio2学习之MonitorAPO的相关文章

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学习之自定义音频特效

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

XAudio2学习之调节音量

XAudio2音量调节分为全局和声道调节以及连接音量调节.所谓全局就是说设置了音量后会影响整个音频流的声音大小:声道调节就是说只调节某一个声道的音量大小:连接音量设置是说设置voice与其输出voice之间的声道映射音量.举个例子来说明: IXAudio2SourceVoice->IXAudio2SubmixVoice->IXAudio2MasteringVoice 由三个voice组成的音频图.IXAudio2SourceVoice为2声道,IXAudio2SubmixVoice和IXAud

XAudio2学习之音效相关结构体

任何XAudio2 voice都可以持有一个音频效果链.你可以使用XAUDIO2_EFFECT_DESCRIPTOR数组来指定效果链.每个描述因子都包含了由客户端提供的指向音效对象的指针.这些对象必须实现APO接口. 结构体定义为: typedef struct XAUDIO2_EFFECT_DESCRIPTOR { IUnknown *pEffect; BOOL InitialState; UINT32 OutputChannels; } XAUDIO2_EFFECT_DESCRIPTOR;

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.

XAudio2学习之流化音频文件

流化是一个过程,在这个过程中,我们只需要在内存中维护一小块内存来播放音频文件.这样我们就可以使用很大的音频文件作为背景音乐,而不占用很大的内存.当我们流化一个音频文件的时候,音频数据是从硬盘上一块一块的读取,而不是将整个文件一次性全部加载.流化是通过异步读取音频数据到硬盘缓冲区队列来完成的.当一个缓冲区填充好数据后,提交给source voice.当source voice播放完成一个缓冲区后,这个缓冲区就可以再次用来读取文件中的数据.通过这种方式循环使用缓冲区,允许我们只加载一部分文件的数据就

XAudio2学习之内置音效:混响

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

XAudio2学习之SimpleAPO

SimpleAPO通过与处理的样本数据相乘,应用一个简单的增益因子到音频数据.DirectX SDK中带了示例,我将其中的实例进行拆分后,来分开进行说明,也是将代码分离开. struct SimpleAPOParams { float gain; }; class __declspec( uuid("{5EB8D611-FF96-429d-8365-2DDF89A7C1CD}")) CSimpleAPO : public CSampleXAPOBase<CSimpleAPO, S