tor-browser

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

DynamicsCompressor.h (4513B)


      1 /*
      2 * Copyright (C) 2011 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 DynamicsCompressor_h
     30 #define DynamicsCompressor_h
     31 
     32 #include "DynamicsCompressorKernel.h"
     33 #include "ZeroPole.h"
     34 #include "mozilla/MemoryReporting.h"
     35 #include "mozilla/UniquePtr.h"
     36 #include "nsTArray.h"
     37 
     38 namespace mozilla {
     39 class AudioBlock;
     40 }  // namespace mozilla
     41 
     42 namespace WebCore {
     43 
     44 using mozilla::AudioBlock;
     45 using mozilla::UniquePtr;
     46 
     47 // DynamicsCompressor implements a flexible audio dynamics compression effect
     48 // such as is commonly used in musical production and game audio. It lowers the
     49 // volume of the loudest parts of the signal and raises the volume of the
     50 // softest parts, making the sound richer, fuller, and more controlled.
     51 
     52 class DynamicsCompressor {
     53 public:
     54  enum {
     55    ParamThreshold,
     56    ParamKnee,
     57    ParamRatio,
     58    ParamAttack,
     59    ParamRelease,
     60    ParamPreDelay,
     61    ParamReleaseZone1,
     62    ParamReleaseZone2,
     63    ParamReleaseZone3,
     64    ParamReleaseZone4,
     65    ParamPostGain,
     66    ParamFilterStageGain,
     67    ParamFilterStageRatio,
     68    ParamFilterAnchor,
     69    ParamEffectBlend,
     70    ParamReduction,
     71    ParamLast
     72  };
     73 
     74  DynamicsCompressor(float sampleRate, unsigned numberOfChannels);
     75 
     76  void process(const AudioBlock* sourceChunk, AudioBlock* destinationChunk,
     77               unsigned framesToProcess);
     78  void reset();
     79  void setNumberOfChannels(unsigned);
     80  unsigned numberOfChannels() const { return m_numberOfChannels; }
     81 
     82  void setParameterValue(unsigned parameterID, float value);
     83  float parameterValue(unsigned parameterID);
     84 
     85  float sampleRate() const { return m_sampleRate; }
     86  float nyquist() const { return m_sampleRate / 2; }
     87 
     88  double tailTime() const { return 0; }
     89  double latencyTime() const {
     90    return m_compressor.latencyFrames() / static_cast<double>(sampleRate());
     91  }
     92 
     93  size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
     94 
     95 protected:
     96  unsigned m_numberOfChannels;
     97 
     98  // m_parameters holds the tweakable compressor parameters.
     99  float m_parameters[ParamLast];
    100  void initializeParameters();
    101 
    102  float m_sampleRate;
    103 
    104  // Emphasis filter controls.
    105  float m_lastFilterStageRatio;
    106  float m_lastAnchor;
    107  float m_lastFilterStageGain;
    108 
    109  struct ZeroPoleFilterPack4 {
    110    ZeroPole filters[4];
    111    size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
    112      return aMallocSizeOf(this);
    113    }
    114  };
    115 
    116  // Per-channel emphasis filters.
    117  nsTArray<UniquePtr<ZeroPoleFilterPack4> > m_preFilterPacks;
    118  nsTArray<UniquePtr<ZeroPoleFilterPack4> > m_postFilterPacks;
    119 
    120  mozilla::UniquePtr<const float*[]> m_sourceChannels;
    121  mozilla::UniquePtr<float*[]> m_destinationChannels;
    122 
    123  void setEmphasisStageParameters(unsigned stageIndex, float gain,
    124                                  float normalizedFrequency /* 0 -> 1 */);
    125  void setEmphasisParameters(float gain, float anchorFreq,
    126                             float filterStageRatio);
    127 
    128  // The core compressor.
    129  DynamicsCompressorKernel m_compressor;
    130 };
    131 
    132 }  // namespace WebCore
    133 
    134 #endif  // DynamicsCompressor_h