XAudio2学习之MonitorAPO
来源:互联网 发布:2k17科比捏脸数据 编辑:程序博客网 时间:2024/04/28 14:37
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);//将效果链传递给voiceif (FAILED(hr))return 0; pSimpleXAPO->Release();//传给voice后,voice接管此对象。防止外部对此对象修改,释放pMpnitorAPO->Release();SimpleAPOParams simpleParams;//设置参数simpleParams.gain = 1.2f;hr = pSourceVoice->SetEffectParameters(0, &simpleParams, sizeof(SimpleAPOParams));//将设置传递给voiceif (FAILED(hr)) return 0;MonitorAPOParams monitorParams;monitorParams.pipe = new MonitorAPOPipe;hr = pSourceVoice->SetEffectParameters(1, &monitorParams, sizeof(MonitorAPOParams));//将设置传递给voiceif (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
0 0
- XAudio2学习之MonitorAPO
- XAudio2学习之SimpleAPO
- XAudio2学习之IXAudio2VoiceCallback回调
- XAudio2学习之采样率转换
- XAudio2学习之调节音量
- XAudio2学习之调节音调
- XAudio2学习之混音
- XAudio2学习之流化音频文件
- XAudio2学习
- XAudio2学习一之平台搭建
- XAudio2学习二之获取输出设备数
- XAudio2学习四之wave文件格式
- XAudio2学习六之播放WAV文件
- XAudio2学习七之工程迁移错误
- XAudio2学习之动态添加删除Voice
- XAudio2学习之循环播放音频数据
- XAudio2学习之音效相关结构体
- XAudio2学习之内置音效:混响
- Entity Framework 基本用法
- 正式赛-ZZULIOJ-1879-蛤玮买好了礼物
- iOS开发 ☞ MJRefresh
- ios uiwebview 拦截 点击事件
- FTxxxx系列-----home按键失灵(kl没有加载正确)
- XAudio2学习之MonitorAPO
- easyui给tree加个title提示
- radosgw bucket index sharding
- ScrollView隐藏滚动条
- 介绍一个轻量级iOS安全框架:SSKeyChain
- sortedArrayUsingComparator
- java 利用数组实现循环队列
- Android 百度地图打包不能使用 解决详细方法
- Android API Guides---Web Apps