15ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/* 25ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved. 35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 45ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Redistribution and use in source and binary forms, with or without 55ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * modification, are permitted provided that the following conditions 65ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * are met: 75ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 85ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 1. Redistributions of source code must retain the above copyright 95ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * notice, this list of conditions and the following disclaimer. 105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright 115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * notice, this list of conditions and the following disclaimer in the 125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * documentation and/or other materials provided with the distribution. 135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * its contributors may be used to endorse or promote products derived 155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * from this software without specific prior written permission. 165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */ 285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#ifndef FFTConvolver_h 305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#define FFTConvolver_h 315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 32e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "AudioArray.h" 335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "FFTFrame.h" 345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace WebCore { 365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenclass FFTConvolver { 385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenpublic: 395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // fftSize must be a power of two 405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen FFTConvolver(size_t fftSize); 415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // For now, with multiple calls to Process(), framesToProcess MUST add up EXACTLY to fftSize / 2 435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // 445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: Later, we can do more sophisticated buffering to relax this requirement... 455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // The input to output latency is equal to fftSize / 2 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // 485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Processing in-place is allowed... 495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen void process(FFTFrame* fftKernel, float* sourceP, float* destP, size_t framesToProcess); 505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen void reset(); 525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen size_t fftSize() const { return m_frame.fftSize(); } 545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenprivate: 565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen FFTFrame m_frame; 575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Buffer input until we get fftSize / 2 samples then do an FFT 595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen size_t m_readWriteIndex; 605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen AudioFloatArray m_inputBuffer; 615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Stores output which we read a little at a time 635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen AudioFloatArray m_outputBuffer; 645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Saves the 2nd half of the FFT buffer, so we can do an overlap-add with the 1st half of the next one 665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen AudioFloatArray m_lastOverlapBuffer; 675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}; 685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} // namespace WebCore 705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif // FFTConvolver_h 72