XAudio2学习之SimpleAPO
2016-04-20 16:36
363 查看
SimpleAPO通过与处理的样本数据相乘,应用一个简单的增益因子到音频数据。DirectX SDK中带了示例,我将其中的实例进行拆分后,来分开进行说明,也是将代码分离开。
CSimpleAPO派生自一个模板类CSampleXAPOBase,位于文件SampleAPOBase.h中。模板类实例化时需要提供XAPO类和参数类:APOClass和ParameterClass。参数类可以是结构体。
模板类实现了静态实例化函数CreateInstance,以及LockForProcess和Process接口函数。并预留了一个纯虚函数DoProcess来让子类实现不同的需求。
LockForProcess函数只是进行了获取格式:
memcpy( &m_wfx, pInputLockedParameters[0].pFormat, sizeof( WAVEFORMATEX ) );Process函数实现了如果输入缓冲区的标志位是XAPO_BUFFER_SILENT,将缓冲区置为0.如果为XAPO_BUFFER_VALID,表示数据有效,调用DoProcess来将数据进行增益:
ParameterClass* pParams;
pParams = (ParameterClass*)BeginProcess();
if ( pInputProcessParameters[0].BufferFlags == XAPO_BUFFER_SILENT )
{
memset( pInputProcessParameters[0].pBuffer, 0,
pInputProcessParameters[0].ValidFrameCount * m_wfx.nChannels * sizeof(FLOAT32) );
DoProcess(
*pParams,
(FLOAT32* __restrict)pInputProcessParameters[0].pBuffer,
pInputProcessParameters[0].ValidFrameCount,
m_wfx.nChannels );
}
else if( pInputProcessParameters[0].BufferFlags == XAPO_BUFFER_VALID )
{
DoProcess(
*pParams,
(FLOAT32* __restrict)pInputProcessParameters[0].pBuffer,
pInputProcessParameters[0].ValidFrameCount,
m_wfx.nChannels );
}
EndProcess();其中BeginProcess接口可以获取最新的通过SetEffectParameters设置的参数。XAPO只能在Process函数内调用这个方法。
EndProcess告诉CXAPOParametersBase,XAPO已经完成了接收设置的最新的参数。此方法也必须在Process方法内调用。
交流QQ:1245178753
本文地址:http://blog.csdn.net/u011417605/article/details/51201686
示例代码下载:http://download.csdn.net/detail/u011417605/9497124
struct SimpleAPOParams { float gain; }; class __declspec( uuid("{5EB8D611-FF96-429d-8365-2DDF89A7C1CD}")) CSimpleAPO : public CSampleXAPOBase<CSimpleAPO, SimpleAPOParams> { public: CSimpleAPO(); ~CSimpleAPO(); void DoProcess( const SimpleAPOParams&, FLOAT32* __restrict pData, UINT32 cFrames, UINT32 cChannels ); };
CSimpleAPO派生自一个模板类CSampleXAPOBase,位于文件SampleAPOBase.h中。模板类实例化时需要提供XAPO类和参数类:APOClass和ParameterClass。参数类可以是结构体。
模板类实现了静态实例化函数CreateInstance,以及LockForProcess和Process接口函数。并预留了一个纯虚函数DoProcess来让子类实现不同的需求。
LockForProcess函数只是进行了获取格式:
memcpy( &m_wfx, pInputLockedParameters[0].pFormat, sizeof( WAVEFORMATEX ) );Process函数实现了如果输入缓冲区的标志位是XAPO_BUFFER_SILENT,将缓冲区置为0.如果为XAPO_BUFFER_VALID,表示数据有效,调用DoProcess来将数据进行增益:
ParameterClass* pParams;
pParams = (ParameterClass*)BeginProcess();
if ( pInputProcessParameters[0].BufferFlags == XAPO_BUFFER_SILENT )
{
memset( pInputProcessParameters[0].pBuffer, 0,
pInputProcessParameters[0].ValidFrameCount * m_wfx.nChannels * sizeof(FLOAT32) );
DoProcess(
*pParams,
(FLOAT32* __restrict)pInputProcessParameters[0].pBuffer,
pInputProcessParameters[0].ValidFrameCount,
m_wfx.nChannels );
}
else if( pInputProcessParameters[0].BufferFlags == XAPO_BUFFER_VALID )
{
DoProcess(
*pParams,
(FLOAT32* __restrict)pInputProcessParameters[0].pBuffer,
pInputProcessParameters[0].ValidFrameCount,
m_wfx.nChannels );
}
EndProcess();其中BeginProcess接口可以获取最新的通过SetEffectParameters设置的参数。XAPO只能在Process函数内调用这个方法。
EndProcess告诉CXAPOParametersBase,XAPO已经完成了接收设置的最新的参数。此方法也必须在Process方法内调用。
交流QQ:1245178753
本文地址:http://blog.csdn.net/u011417605/article/details/51201686
示例代码下载:http://download.csdn.net/detail/u011417605/9497124
相关文章推荐
- windows环境下Redis+Spring缓存实例讲解
- 嵌入式工程师该如何选择合适的开发系统
- 嵌入式工程师该如何选择合适的开发系统
- Axis2c开发Webservice时,接口参数不支持中文字符
- json 特殊字符 javascript 特殊字符处理(转载)
- CHAPTER 2 How the backpropagation algorithm works
- mysql游戏服务器配置
- 40岁销售员的悲哀
- java.lang.IllegalStateException问题的发现与解决
- 自恢复保险丝的选用
- JS设置cookie、读取cookie、删除cookie
- 工具利用
- python 函数/列表的应用
- HttpClient
- 个人工作总结2
- 我的屌丝giser成长记-研二篇
- 团队第一阶段站立会议02
- Qt重要几点记录
- eclipse svn项目路径改变
- 财务模块的一些基础概念