15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Intel Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FFTFrame implementation using Intel IPP's DFT algorithm, 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// suitable for use on Linux. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if USE(WEBAUDIO_IPP) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/audio/FFTFrame.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/audio/VectorMath.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/MathExtras.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const unsigned maximumFFTPower2Size = 24; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Normal constructor: allocates for a given fftSize. 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::FFTFrame(unsigned fftSize) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_FFTSize(fftSize) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_log2FFTSize(static_cast<unsigned>(log2(fftSize))) 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) ASSERT(m_log2FFTSize <= maximumFFTPower2Size); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTInitAlloc_R_32f(&m_DFTSpec, m_FFTSize, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int bufferSize = 0; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTGetBufSize_R_32f(m_DFTSpec, &bufferSize); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer = ippsMalloc_8u(bufferSize); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Creates a blank/empty frame (interpolate() must later be called). 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::FFTFrame() 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_FFTSize(0) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_log2FFTSize(0) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copy constructor. 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::FFTFrame(const FFTFrame& frame) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_FFTSize(frame.m_FFTSize) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_log2FFTSize(frame.m_log2FFTSize) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_complexData(frame.m_FFTSize) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_realData(frame.m_FFTSize / 2) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_imagData(frame.m_FFTSize / 2) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTInitAlloc_R_32f(&m_DFTSpec, m_FFTSize, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int bufferSize = 0; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTGetBufSize_R_32f(m_DFTSpec, &bufferSize); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer = ippsMalloc_8u(bufferSize); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Copy/setup frame data. 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned numberOfBytes = sizeof(float) * m_FFTSize; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) memcpy(realData(), frame.realData(), numberOfBytes); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) memcpy(imagData(), frame.imagData(), numberOfBytes); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::initialize() 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::cleanup() 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FFTFrame::~FFTFrame() 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsFree(m_buffer); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTFree_R_32f(m_DFTSpec); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::multiply(const FFTFrame& frame) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FFTFrame& frame1 = *this; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FFTFrame& frame2 = const_cast<FFTFrame&>(frame); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float* realP1 = frame1.realData(); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float* imagP1 = frame1.imagData(); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float* realP2 = frame2.realData(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float* imagP2 = frame2.imagData(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned halfSize = fftSize() / 2; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float real0 = realP1[0]; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float imag0 = imagP1[0]; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch VectorMath::zvmul(realP1, imagP1, realP2, imagP2, realP1, imagP1, halfSize); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Multiply the packed DC/nyquist component 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) realP1[0] = real0 * realP2[0]; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) imagP1[0] = imag0 * imagP2[0]; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Scale accounts the peculiar scaling of vecLib on the Mac. 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This ensures the right scaling all the way back to inverse FFT. 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: if we change the scaling on the Mac then this scale 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // factor will need to change too. 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float scale = 0.5f; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VectorMath::vsmul(realP1, 1, &scale, realP1, 1, halfSize); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VectorMath::vsmul(imagP1, 1, &scale, imagP1, 1, halfSize); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::doFFT(const float* data) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32f* complexP = m_complexData.data(); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Compute Forward transform to perm format. 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTFwd_RToPerm_32f(reinterpret_cast<Ipp32f*>(const_cast<float*>(data)), complexP, m_DFTSpec, m_buffer); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Ipp32f scale = 2.0f; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsMulC_32f_I(scale, complexP, m_FFTSize); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32f* realP = m_realData.data(); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32f* imagP = m_imagData.data(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsCplxToReal_32fc(reinterpret_cast<Ipp32fc*>(complexP), realP, imagP, m_FFTSize >> 1); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FFTFrame::doInverseFFT(float* data) 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32f* complexP = getUpToDateComplexData(); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Compute inverse transform. 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsDFTInv_PermToR_32f(complexP, reinterpret_cast<Ipp32f*>(data), m_DFTSpec, m_buffer); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Scale so that a forward then inverse FFT yields exactly the original data. 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float scale = 1.0 / (2 * m_FFTSize); 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsMulC_32f_I(scale, reinterpret_cast<Ipp32f*>(data), m_FFTSize); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float* FFTFrame::realData() const 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<float*>(m_realData.data()); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float* FFTFrame::imagData() const 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<float*>(m_imagData.data()); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float* FFTFrame::getUpToDateComplexData() 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int len = m_FFTSize >> 1; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Merge the real and imagimary vectors to complex vector. 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32f* realP = m_realData.data(); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32f* imagP = m_imagData.data(); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Ipp32fc* complexP = reinterpret_cast<Ipp32fc*>(m_complexData.data()); 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ippsRealToCplx_32f(realP, imagP, complexP, len); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<float*>(m_complexData.data()); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // USE(WEBAUDIO_IPP) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // ENABLE(WEB_AUDIO) 190