Line data Source code
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 DynamicsCompressorKernel_h
30 : #define DynamicsCompressorKernel_h
31 :
32 : #include "nsTArray.h"
33 : #include "mozilla/MemoryReporting.h"
34 : #include "mozilla/UniquePtr.h"
35 :
36 : namespace WebCore {
37 :
38 0 : class DynamicsCompressorKernel {
39 : public:
40 : DynamicsCompressorKernel(float sampleRate, unsigned numberOfChannels);
41 :
42 : void setNumberOfChannels(unsigned);
43 :
44 : // Performs stereo-linked compression.
45 : void process(float* sourceChannels[],
46 : float* destinationChannels[],
47 : unsigned numberOfChannels,
48 : unsigned framesToProcess,
49 :
50 : float dbThreshold,
51 : float dbKnee,
52 : float ratio,
53 : float attackTime,
54 : float releaseTime,
55 : float preDelayTime,
56 : float dbPostGain,
57 : float effectBlend,
58 :
59 : float releaseZone1,
60 : float releaseZone2,
61 : float releaseZone3,
62 : float releaseZone4
63 : );
64 :
65 : void reset();
66 :
67 : unsigned latencyFrames() const { return m_lastPreDelayFrames; }
68 :
69 0 : float sampleRate() const { return m_sampleRate; }
70 :
71 0 : float meteringGain() const { return m_meteringGain; }
72 :
73 : size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
74 :
75 : protected:
76 : float m_sampleRate;
77 :
78 : float m_detectorAverage;
79 : float m_compressorGain;
80 :
81 : // Metering
82 : float m_meteringReleaseK;
83 : float m_meteringGain;
84 :
85 : // Lookahead section.
86 : enum { MaxPreDelayFrames = 1024 };
87 : enum { MaxPreDelayFramesMask = MaxPreDelayFrames - 1 };
88 : enum { DefaultPreDelayFrames = 256 }; // setPreDelayTime() will override this initial value
89 : unsigned m_lastPreDelayFrames;
90 : void setPreDelayTime(float);
91 :
92 : nsTArray<mozilla::UniquePtr<float[]>> m_preDelayBuffers;
93 : int m_preDelayReadIndex;
94 : int m_preDelayWriteIndex;
95 :
96 : float m_maxAttackCompressionDiffDb;
97 :
98 : // Static compression curve.
99 : float kneeCurve(float x, float k);
100 : float saturate(float x, float k);
101 : float slopeAt(float x, float k);
102 : float kAtSlope(float desiredSlope);
103 :
104 : float updateStaticCurveParameters(float dbThreshold, float dbKnee, float ratio);
105 :
106 : // Amount of input change in dB required for 1 dB of output change.
107 : // This applies to the portion of the curve above m_kneeThresholdDb (see below).
108 : float m_ratio;
109 : float m_slope; // Inverse ratio.
110 :
111 : // The input to output change below the threshold is linear 1:1.
112 : float m_linearThreshold;
113 : float m_dbThreshold;
114 :
115 : // m_dbKnee is the number of dB above the threshold before we enter the "ratio" portion of the curve.
116 : // m_kneeThresholdDb = m_dbThreshold + m_dbKnee
117 : // The portion between m_dbThreshold and m_kneeThresholdDb is the "soft knee" portion of the curve
118 : // which transitions smoothly from the linear portion to the ratio portion.
119 : float m_dbKnee;
120 : float m_kneeThreshold;
121 : float m_kneeThresholdDb;
122 : float m_ykneeThresholdDb;
123 :
124 : // Internal parameter for the knee portion of the curve.
125 : float m_K;
126 : };
127 :
128 : } // namespace WebCore
129 :
130 : #endif // DynamicsCompressorKernel_h
|