tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

FFTConvolver.h (3348B)


      1 /*
      2 * Copyright (C) 2010 Google Inc. All rights reserved.
      3 *
      4 * Redistribution and use in source and binary forms, with or without
      5 * modification, are permitted provided that the following conditions
      6 * are met:
      7 *
      8 * 1.  Redistributions of source code must retain the above copyright
      9 *     notice, this list of conditions and the following disclaimer.
     10 * 2.  Redistributions in binary form must reproduce the above copyright
     11 *     notice, this list of conditions and the following disclaimer in the
     12 *     documentation and/or other materials provided with the distribution.
     13 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     14 *     its contributors may be used to endorse or promote products derived
     15 *     from this software without specific prior written permission.
     16 *
     17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28 
     29 #ifndef FFTConvolver_h
     30 #define FFTConvolver_h
     31 
     32 #include "mozilla/FFTBlock.h"
     33 #include "mozilla/MemoryReporting.h"
     34 #include "nsTArray.h"
     35 
     36 namespace WebCore {
     37 
     38 typedef AlignedTArray<float> AlignedAudioFloatArray;
     39 using mozilla::FFTBlock;
     40 
     41 class FFTConvolver {
     42 public:
     43  // |fftSize| must be a power of two.
     44  //
     45  // |renderPhase| is the initial offset in the initially zero input buffer.
     46  // It is coordinated with the other stages, so they don't all do their
     47  // FFTs at the same time.
     48  explicit FFTConvolver(size_t fftSize, size_t renderPhase = 0);
     49 
     50  // Process WEBAUDIO_BLOCK_SIZE elements of array |sourceP| and return a
     51  // pointer to an output array of the same size.
     52  //
     53  // |fftKernel| must be pre-scaled for FFTBlock::GetInverseWithoutScaling().
     54  //
     55  // FIXME: Later, we can do more sophisticated buffering to relax this
     56  // requirement...
     57  const float* process(FFTBlock* fftKernel, const float* sourceP);
     58 
     59  void reset();
     60 
     61  size_t fftSize() const { return m_frame.FFTSize(); }
     62 
     63  // The input to output latency is up to fftSize / 2, but alignment of the
     64  // FFTs with the blocks reduces this by one block.
     65  size_t latencyFrames() const;
     66 
     67  size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
     68  size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
     69 
     70 private:
     71  FFTBlock m_frame;
     72 
     73  // Buffer input until we get fftSize / 2 samples then do an FFT
     74  size_t m_readWriteIndex;
     75  AlignedAudioFloatArray m_inputBuffer;
     76 
     77  // Stores output which we read a little at a time
     78  AlignedAudioFloatArray m_outputBuffer;
     79 
     80  // Saves the 2nd half of the FFT buffer, so we can do an overlap-add with the
     81  // 1st half of the next one
     82  AlignedAudioFloatArray m_lastOverlapBuffer;
     83 };
     84 
     85 }  // namespace WebCore
     86 
     87 #endif  // FFTConvolver_h