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