153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)/* Copyright (C) 2013 Google Inc. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(ANDROID) && USE(WEBAUDIO_OPENMAX_DL_FFT) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/audio/FFTFrame.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/audio/AudioArray.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/audio/VectorMath.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "dl/sp/api/armSP.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "dl/sp/api/omxSP.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/MathExtras.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)const unsigned kMaxFFTPow2Size = 15; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Normal constructor: allocates for a given fftSize. 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::FFTFrame(unsigned fftSize) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_FFTSize(fftSize) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_log2FFTSize(static_cast<unsigned>(log2(fftSize))) 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_forwardContext(0) 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_inverseContext(0) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_complexData(fftSize) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_realData(fftSize / 2) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_imagData(fftSize / 2) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We only allow power of two. 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(1UL << m_log2FFTSize == m_FFTSize); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_forwardContext = contextForSize(m_log2FFTSize); 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_inverseContext = contextForSize(m_log2FFTSize); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Creates a blank/empty frame (interpolate() must later be called). 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::FFTFrame() 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_FFTSize(0) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_log2FFTSize(0) 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_forwardContext(0) 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_inverseContext(0) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copy constructor. 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::FFTFrame(const FFTFrame& frame) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_FFTSize(frame.m_FFTSize) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_log2FFTSize(frame.m_log2FFTSize) 7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_forwardContext(0) 7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_inverseContext(0) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_complexData(frame.m_FFTSize) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_realData(frame.m_FFTSize / 2) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_imagData(frame.m_FFTSize / 2) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_forwardContext = contextForSize(m_log2FFTSize); 8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_inverseContext = contextForSize(m_log2FFTSize); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Copy/setup frame data. 8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) unsigned nbytes = sizeof(float) * (m_FFTSize / 2); 8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) memcpy(realData(), frame.realData(), nbytes); 8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) memcpy(imagData(), frame.imagData(), nbytes); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::initialize() 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::cleanup() 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::~FFTFrame() 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_forwardContext) 10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) free(m_forwardContext); 10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_inverseContext) 10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) free(m_inverseContext); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::multiply(const FFTFrame& frame) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FFTFrame& frame1 = *this; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FFTFrame& frame2 = const_cast<FFTFrame&>(frame); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float* realP1 = frame1.realData(); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float* imagP1 = frame1.imagData(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float* realP2 = frame2.realData(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float* imagP2 = frame2.imagData(); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned halfSize = fftSize() / 2; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float real0 = realP1[0]; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float imag0 = imagP1[0]; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch VectorMath::zvmul(realP1, imagP1, realP2, imagP2, realP1, imagP1, halfSize); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Multiply the packed DC/nyquist component 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) realP1[0] = real0 * realP2[0]; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) imagP1[0] = imag0 * imagP2[0]; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::doFFT(const float* data) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(m_forwardContext); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_forwardContext) { 13153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) AudioFloatArray complexFFT(m_FFTSize + 2); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) omxSP_FFTFwd_RToCCS_F32_Sfs(data, complexFFT.data(), m_forwardContext); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) unsigned len = m_FFTSize / 2; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Split FFT data into real and imaginary arrays. 138e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch const float* c = complexFFT.data(); 139e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch float* real = m_realData.data(); 140e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch float* imag = m_imagData.data(); 14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned k = 1; k < len; ++k) { 14253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int index = 2 * k; 143e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch real[k] = c[index]; 144e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch imag[k] = c[index + 1]; 14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 146e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch real[0] = c[0]; 147e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch imag[0] = c[m_FFTSize]; 14853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::doInverseFFT(float* data) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(m_inverseContext); 15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 15553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_inverseContext) { 156e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch AudioFloatArray fftDataArray(m_FFTSize + 2); 15753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 15853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) unsigned len = m_FFTSize / 2; 15953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 16053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Pack the real and imaginary data into the complex array format 161e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch float* fftData = fftDataArray.data(); 162e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch const float* real = m_realData.data(); 163e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch const float* imag = m_imagData.data(); 16453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned k = 1; k < len; ++k) { 16553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int index = 2 * k; 166e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch fftData[index] = real[k]; 167e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch fftData[index + 1] = imag[k]; 16853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch fftData[0] = real[0]; 17053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) fftData[1] = 0; 171e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch fftData[m_FFTSize] = imag[0]; 17253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) fftData[m_FFTSize + 1] = 0; 17302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 174e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch omxSP_FFTInv_CCSToR_F32_Sfs(fftData, data, m_inverseContext); 17553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float* FFTFrame::realData() const 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<float*>(m_realData.data()); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float* FFTFrame::imagData() const 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<float*>(m_imagData.data()); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)OMXFFTSpec_R_F32* FFTFrame::contextForSize(unsigned log2FFTSize) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(log2FFTSize); 19193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ASSERT(log2FFTSize <= kMaxFFTPow2Size); 19253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int bufSize; 19353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) OMXResult status = omxSP_FFTGetBufSize_R_F32(log2FFTSize, &bufSize); 19453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 19553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (status == OMX_Sts_NoErr) { 19653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) OMXFFTSpec_R_F32* context = static_cast<OMXFFTSpec_R_F32*>(malloc(bufSize)); 19753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) omxSP_FFTInit_R_F32(context, log2FFTSize); 19853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return context; 19953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 20053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 20153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return 0; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif // #if OS(ANDROID) && !USE(WEBAUDIO_OPENMAX_DL_FFT) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // ENABLE(WEB_AUDIO) 209