=== modified file 'mixxx/src/engine/enginefilterblock.cpp' --- mixxx/src/engine/enginefilterblock.cpp 2012-05-01 14:17:19 +0000 +++ mixxx/src/engine/enginefilterblock.cpp 2013-01-01 00:06:57 +0000 @@ -23,6 +23,7 @@ #include "engine/enginefilter.h" #include "engine/enginefilterbutterworth8.h" #include "sampleutil.h" +#include "util/timer.h" ControlPotmeter* EngineFilterBlock::s_loEqFreq = NULL; ControlPotmeter* EngineFilterBlock::s_hiEqFreq = NULL; @@ -88,6 +89,10 @@ memset(m_pTemp1, 0, sizeof(CSAMPLE) * MAX_BUFFER_LEN); memset(m_pTemp2, 0, sizeof(CSAMPLE) * MAX_BUFFER_LEN); memset(m_pTemp3, 0, sizeof(CSAMPLE) * MAX_BUFFER_LEN); + + m_lowCur = filterpotLow->get(); + m_midCur = filterpotMid->get(); + m_highCur = filterpotHigh->get(); } EngineFilterBlock::~EngineFilterBlock() @@ -158,17 +163,36 @@ if (filterKillHigh->get()==0.) fHigh = filterpotHigh->get(); //*1.2; + #ifndef __LOFI__ setFilters(); #endif + low->process(pIn, m_pTemp1, iBufferSize); band->process(pIn, m_pTemp2, iBufferSize); high->process(pIn, m_pTemp3, iBufferSize); - SampleUtil::copy3WithGain(pOutput, - m_pTemp1, fLow, - m_pTemp2, fMid, - m_pTemp3, fHigh, iBufferSize); + fLow = fLow > 0 ? 0 : 1; + fMid = fMid > 0 ? 0 : 1; + fHigh = fHigh > 0 ? 0 : 1; + + for (int i = 0; i < iBufferSize; ++i) { + pOutput[i] = m_pTemp1[i] * fLow + m_pTemp2[i] * fMid + m_pTemp3[i] * fHigh; + } + { + ScopedTimer t("EngineFilterBlock SampleUtil::rampCopy3WithGain"); + SampleUtil::rampCopy3WithGain(pOutput, + m_pTemp1, &m_lowCur, fLow, + m_pTemp2, &m_midCur, fMid, + m_pTemp3, &m_highCur, fHigh, iBufferSize); + } + { + ScopedTimer t("EngineFilterBlock SampleUtil::copy3WithGain"); + SampleUtil::copy3WithGain(pOutput, + m_pTemp1, fLow, + m_pTemp2, fMid, + m_pTemp3, fHigh, iBufferSize); + } } === modified file 'mixxx/src/engine/enginefilterblock.h' --- mixxx/src/engine/enginefilterblock.h 2011-08-11 13:26:39 +0000 +++ mixxx/src/engine/enginefilterblock.h 2012-12-31 23:57:33 +0000 @@ -54,6 +54,8 @@ int ilowFreq, ihighFreq; bool blofi; + + CSAMPLE m_lowCur, m_midCur, m_highCur; }; #endif === modified file 'mixxx/src/sampleutil.cpp' --- mixxx/src/sampleutil.cpp 2011-12-08 11:47:54 +0000 +++ mixxx/src/sampleutil.cpp 2013-01-01 00:01:09 +0000 @@ -423,19 +423,19 @@ const CSAMPLE* pSrc2, CSAMPLE gain2, const CSAMPLE* pSrc3, CSAMPLE gain3, int iNumSamples) { - if (gain1 == 0.0f) { - return copy2WithGain(pDest, pSrc2, gain2, pSrc3, gain3, iNumSamples); - } - if (gain2 == 0.0f) { - return copy2WithGain(pDest, pSrc1, gain1, pSrc3, gain3, iNumSamples); - } - if (gain3 == 0.0f) { - return copy2WithGain(pDest, pSrc1, gain1, pSrc2, gain2, iNumSamples); - } - if (m_sOptimizationsOn) { - return sseCopy3WithGain(pDest, pSrc1, gain1, pSrc2, gain2, - pSrc3, gain3, iNumSamples); - } + // if (gain1 == 0.0f) { + // return copy2WithGain(pDest, pSrc2, gain2, pSrc3, gain3, iNumSamples); + // } + // if (gain2 == 0.0f) { + // return copy2WithGain(pDest, pSrc1, gain1, pSrc3, gain3, iNumSamples); + // } + // if (gain3 == 0.0f) { + // return copy2WithGain(pDest, pSrc1, gain1, pSrc2, gain2, iNumSamples); + // } + // if (m_sOptimizationsOn) { + // return sseCopy3WithGain(pDest, pSrc1, gain1, pSrc2, gain2, + // pSrc3, gain3, iNumSamples); + // } for (int i = 0; i < iNumSamples; ++i) { pDest[i] = pSrc1[i] * gain1 + pSrc2[i] * gain2 + pSrc3[i] * gain3; @@ -443,6 +443,34 @@ } // static +void SampleUtil::rampCopy3WithGain(CSAMPLE* pDest, + const CSAMPLE* pSrc1, CSAMPLE* oldGain1, CSAMPLE gain1, + const CSAMPLE* pSrc2, CSAMPLE* oldGain2, CSAMPLE gain2, + const CSAMPLE* pSrc3, CSAMPLE* oldGain3, CSAMPLE gain3, + int iNumSamples) { + + CSAMPLE a = *oldGain1; + const CSAMPLE da = (gain1 - a)/iNumSamples; + + CSAMPLE b = *oldGain2; + const CSAMPLE db = (gain2 - b)/iNumSamples; + + CSAMPLE c = *oldGain3; + const CSAMPLE dc = (gain3 - c)/iNumSamples; + + + for (int i = 0; i < iNumSamples; ++i) { + a += da; b += db; c += dc; + pDest[i] = pSrc1[i] * a + pSrc2[i] * b + pSrc3[i] * c; + } + + // update current gain of the calling instance + *oldGain1 = a; + *oldGain1 = b; + *oldGain1 = c; +} + +// static void SampleUtil::sseCopy3WithGain(CSAMPLE* pDest, const CSAMPLE* pSrc1, CSAMPLE gain1, const CSAMPLE* pSrc2, CSAMPLE gain2, === modified file 'mixxx/src/sampleutil.h' --- mixxx/src/sampleutil.h 2012-04-08 02:31:42 +0000 +++ mixxx/src/sampleutil.h 2012-12-31 23:57:09 +0000 @@ -87,6 +87,12 @@ const CSAMPLE* pSrc3, CSAMPLE gain3, int iNumSamples); + static void rampCopy3WithGain(CSAMPLE* pDest, + const CSAMPLE* pSrc1, CSAMPLE* oldGain1, CSAMPLE gain1, + const CSAMPLE* pSrc2, CSAMPLE* oldGain2, CSAMPLE gain2, + const CSAMPLE* pSrc3, CSAMPLE* oldGain3, CSAMPLE gain3, + int iNumSamples); + // Copies the sum of each channel, multiplied by its gain into pDest static void copy4WithGain(CSAMPLE* pDest, const CSAMPLE* pSrc1, CSAMPLE gain1,