tor-browser

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

PeriodicWave.h (5255B)


      1 /*
      2 * Copyright (C) 2012 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 PeriodicWave_h
     30 #define PeriodicWave_h
     31 
     32 #include <nsTArray.h>
     33 
     34 #include "AlignedTArray.h"
     35 #include "mozilla/MemoryReporting.h"
     36 #include "mozilla/UniquePtr.h"
     37 #include "mozilla/dom/OscillatorNodeBinding.h"
     38 
     39 namespace WebCore {
     40 
     41 typedef AlignedTArray<float> AlignedAudioFloatArray;
     42 typedef nsTArray<float> AudioFloatArray;
     43 
     44 using mozilla::UniquePtr;
     45 
     46 class PeriodicWave {
     47 public:
     48  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebCore::PeriodicWave);
     49 
     50  static already_AddRefed<PeriodicWave> createSine(float sampleRate);
     51  static already_AddRefed<PeriodicWave> createSquare(float sampleRate);
     52  static already_AddRefed<PeriodicWave> createSawtooth(float sampleRate);
     53  static already_AddRefed<PeriodicWave> createTriangle(float sampleRate);
     54 
     55  // Creates an arbitrary periodic wave given the frequency components
     56  // (Fourier coefficients).
     57  static already_AddRefed<PeriodicWave> create(float sampleRate,
     58                                               const float* real,
     59                                               const float* imag,
     60                                               size_t numberOfComponents,
     61                                               bool disableNormalization);
     62 
     63  // Returns pointers to the lower and higher wave data for the pitch range
     64  // containing the given fundamental frequency. These two tables are in
     65  // adjacent "pitch" ranges where the higher table will have the maximum
     66  // number of partials which won't alias when played back at this
     67  // fundamental frequency. The lower wave is the next range containing fewer
     68  // partials than the higher wave. Interpolation between these two tables
     69  // can be made according to tableInterpolationFactor. Where values
     70  // from 0 -> 1 interpolate between lower -> higher.
     71  void waveDataForFundamentalFrequency(float, float*& lowerWaveData,
     72                                       float*& higherWaveData,
     73                                       float& tableInterpolationFactor);
     74 
     75  // Returns the scalar multiplier to the oscillator frequency to calculate
     76  // wave buffer phase increment.
     77  float rateScale() const { return m_rateScale; }
     78 
     79  unsigned periodicWaveSize() const { return m_periodicWaveSize; }
     80  float sampleRate() const { return m_sampleRate; }
     81 
     82  size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
     83 
     84 private:
     85  explicit PeriodicWave(float sampleRate, size_t numberOfComponents,
     86                        bool disableNormalization);
     87  ~PeriodicWave() = default;
     88 
     89  void generateBasicWaveform(mozilla::dom::OscillatorType);
     90 
     91  float m_sampleRate;
     92  unsigned m_periodicWaveSize;
     93  unsigned m_numberOfRanges;
     94  float m_centsPerRange;
     95  unsigned m_numberOfComponents;
     96  UniquePtr<AudioFloatArray> m_realComponents;
     97  UniquePtr<AudioFloatArray> m_imagComponents;
     98 
     99  // The lowest frequency (in Hertz) where playback will include all of the
    100  // partials.  Playing back lower than this frequency will gradually lose
    101  // more high-frequency information.
    102  // This frequency is quite low (~10Hz @ // 44.1KHz)
    103  float m_lowestFundamentalFrequency;
    104 
    105  float m_rateScale;
    106 
    107  unsigned numberOfRanges() const { return m_numberOfRanges; }
    108 
    109  // Maximum possible number of partials (before culling).
    110  unsigned maxNumberOfPartials() const;
    111 
    112  unsigned numberOfPartialsForRange(unsigned rangeIndex) const;
    113 
    114  // Creates table for specified index based on fundamental frequency.
    115  void createBandLimitedTables(float fundamentalFrequency, unsigned rangeIndex);
    116  unsigned m_maxPartialsInBandLimitedTable;
    117  float m_normalizationScale;
    118  bool m_disableNormalization;
    119  nsTArray<UniquePtr<AlignedAudioFloatArray> > m_bandLimitedTables;
    120 };
    121 
    122 }  // namespace WebCore
    123 
    124 #endif  // PeriodicWave_h