SoundTouch音频处理库初始化流程剖析 2
紧接上文《SoundTouch音频处理库初始化流程剖析》
TDStretch类和基类的关系:FIFOSamplePipe -> FIFOProcessor ->TDStretch
SoundTouch类成员class TDStretch *pTDStretch变量的初始化在SoundTouch的构造函数
SoundTouch::SoundTouch()中进行。
pTDStretch = TDStretch::newInstance();
他通过调用TDStretch类成员函数newInstance()构造,代码如下:
TDStretch * TDStretch::newInstance()
{
uint uExtensions;
uExtensions = detectCPUextensions();
// Check if MMX/SSE/3DNow! instruction set extensions supported by CPU
#ifdef ALLOW_MMX
// MMX routines available only with integer sample types
if (uExtensions & SUPPORT_MMX)
{
return ::new TDStretchMMX;
}
else
#endif // ALLOW_MMX
#ifdef ALLOW_SSE
if (uExtensions & SUPPORT_SSE)
{
// SSE support
return ::new TDStretchSSE;
}
else
#endif // ALLOW_SSE
#ifdef ALLOW_3DNOW
if (uExtensions & SUPPORT_3DNOW)
{
// 3DNow! support
return ::new TDStretch3DNow;
}
else
#endif // ALLOW_3DNOW
{
// ISA optimizations not supported, use plain C version
return ::new TDStretch;
}
}
和pRateTransposer如出一辙,也是通过对cpu的增强指令集的检测,构造支持相应多媒体指令集处理的子类。针对不同的指令集,他派生了TDStretchMMX,TDStretch3DNow,TDStretchSSE针对三种不同指令集的类,主要通过override TDStretch类成员函数calcCrossCorrStereo来实现,假如都不支持,将采用TDStretch自己的类成员函数calcCrossCorrStereo进行处理,浮点处理采用double TDStretch::calcCrossCorrStereo(const float*mixingPos, const float *compare) const,定点处理采用double TDStretch::calcCrossCorrStereo(const float *mixingPos, const float *compare) const,通过宏定义#define INTEGER_SAMPLES或者#define FLOAT_SAMPLES来进行预编译处理。由于TDStretchMMX,TDStretch3DNow,TDStretchSSE只是简单的override了类成员函数calcCrossCorrStereo,并没有初始化什么,自然就没有写构造函数,因此都将采用编译器默认生成的构造函数进行构造,针对我的赛扬CPU:
if (uExtensions & SUPPORT_MMX)
{
return ::new TDStretchMMX;
}
他将构造TDStretchMMX并返回一个指向这个类的指针。实际上还是按照以下这个流程构造了TDStretchMMX:
FIFOSamplePipe->FIFOProcessor->TDStretch->TDStretchMMX
根据以上分析,我们需要的,把一个声音信号拉长压短的算法就在TDStretch类的成员函数TDStretch::calcCrossCorrStereo中实现,针对不同cpu的三种优化代码分别在源文件3dnow_win.cpp,Mmx_optimized.cpp,See_optimized.cpp中。至于calcCrossCorrStereo(const float *mixingPos, const float *compare)函数的调用参数具体什么含义,卖个关子,以后再具体分析。
再回到我们的SoundTouch类的构造函数SoundTouch::SoundTouch();
SoundTouch::SoundTouch()
{
// Initialize rate transposer and tempo changer instances
pRateTransposer = RateTransposer::newInstance();
pTDStretch = TDStretch::newInstance();
setOutPipe(pTDStretch);
rate = tempo = 0;
virtualPitch =
virtualRate =
virtualTempo = 1.0;
calcEffectiveRateAndTempo();
channels = 0;
bSrateSet = FALSE;
}
如今初始化了一个处理rate的实例pRateTransposer,还有一个对音频进行拉长压短的实例pTDStretch,剩下的事情,就是初始化一些变量。至此SoundTouch m_SoundTouch;变量实例化完成。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/suhetao/archive/2010/08/28/5846269.aspx