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