现在的位置: 首页 > 综合 > 正文

SoundTouch音频处理库源码分析及算法提取(3)

2013年08月15日 ⁄ 综合 ⁄ 共 2458字 ⁄ 字号 评论关闭

SoundTouch音频处理库源码分析及算法提取(3)

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;变量实例化完成。

抱歉!评论已关闭.