DirectConvolver.cpp [plain text]
#include "config.h"
#if ENABLE(WEB_AUDIO)
#include "DirectConvolver.h"
#if OS(DARWIN)
#include <Accelerate/Accelerate.h>
#endif
#include "VectorMath.h"
namespace WebCore {
using namespace VectorMath;
DirectConvolver::DirectConvolver(size_t inputBlockSize)
: m_inputBlockSize(inputBlockSize)
, m_buffer(inputBlockSize * 2)
{
}
void DirectConvolver::process(AudioFloatArray* convolutionKernel, const float* sourceP, float* destP, size_t framesToProcess)
{
ASSERT(framesToProcess == m_inputBlockSize);
if (framesToProcess != m_inputBlockSize)
return;
size_t kernelSize = convolutionKernel->size();
ASSERT(kernelSize <= m_inputBlockSize);
if (kernelSize > m_inputBlockSize)
return;
float* kernelP = convolutionKernel->data();
bool isCopyGood = kernelP && sourceP && destP && m_buffer.data();
ASSERT(isCopyGood);
if (!isCopyGood)
return;
float* inputP = m_buffer.data() + m_inputBlockSize;
memcpy(inputP, sourceP, sizeof(float) * framesToProcess);
#if USE(ACCELERATE)
#if defined(__ppc__) || defined(__i386__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
conv(inputP - kernelSize + 1, 1, kernelP + kernelSize - 1, -1, destP, 1, framesToProcess, kernelSize);
#pragma clang diagnostic pop
#else
vDSP_conv(inputP - kernelSize + 1, 1, kernelP + kernelSize - 1, -1, destP, 1, framesToProcess, kernelSize);
#endif // defined(__ppc__) || defined(__i386__)
#else
#define CONVOLVE_ONE_SAMPLE \
sum += inputP[i - j] * kernelP[j]; \
j++;
size_t i = 0;
while (i < framesToProcess) {
size_t j = 0;
float sum = 0;
if (kernelSize == 32) {
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
} else if (kernelSize == 64) {
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
} else if (kernelSize == 128) {
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE
CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE CONVOLVE_ONE_SAMPLE } else {
while (j < kernelSize) {
CONVOLVE_ONE_SAMPLE
}
}
destP[i++] = sum;
}
#endif // USE(ACCELERATE)
memcpy(m_buffer.data(), inputP, sizeof(float) * framesToProcess);
}
void DirectConvolver::reset()
{
m_buffer.zero();
}
}
#endif // ENABLE(WEB_AUDIO)