Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 //////////////////////////////////////////////////////////////////////////////
2 ///
3 /// SoundTouch - main class for tempo/pitch/rate adjusting routines.
4 ///
5 /// Notes:
6 /// - Initialize the SoundTouch object instance by setting up the sound stream
7 /// parameters with functions 'setSampleRate' and 'setChannels', then set
8 /// desired tempo/pitch/rate settings with the corresponding functions.
9 ///
10 /// - The SoundTouch class behaves like a first-in-first-out pipeline: The
11 /// samples that are to be processed are fed into one of the pipe by calling
12 /// function 'putSamples', while the ready processed samples can be read
13 /// from the other end of the pipeline with function 'receiveSamples'.
14 ///
15 /// - The SoundTouch processing classes require certain sized 'batches' of
16 /// samples in order to process the sound. For this reason the classes buffer
17 /// incoming samples until there are enough of samples available for
18 /// processing, then they carry out the processing step and consequently
19 /// make the processed samples available for outputting.
20 ///
21 /// - For the above reason, the processing routines introduce a certain
22 /// 'latency' between the input and output, so that the samples input to
23 /// SoundTouch may not be immediately available in the output, and neither
24 /// the amount of outputtable samples may not immediately be in direct
25 /// relationship with the amount of previously input samples.
26 ///
27 /// - The tempo/pitch/rate control parameters can be altered during processing.
28 /// Please notice though that they aren't currently protected by semaphores,
29 /// so in multi-thread application external semaphore protection may be
30 /// required.
31 ///
32 /// - This class utilizes classes 'TDStretch' for tempo change (without modifying
33 /// pitch) and 'RateTransposer' for changing the playback rate (that is, both
34 /// tempo and pitch in the same ratio) of the sound. The third available control
35 /// 'pitch' (change pitch but maintain tempo) is produced by a combination of
36 /// combining the two other controls.
37 ///
38 /// Author : Copyright (c) Olli Parviainen
39 /// Author e-mail : oparviai 'at' iki.fi
40 /// SoundTouch WWW: http://www.surina.net/soundtouch
41 ///
42 ////////////////////////////////////////////////////////////////////////////////
43 //
44 // Last changed : $Date: 2014-04-06 10:57:21 -0500 (Sun, 06 Apr 2014) $
45 // File revision : $Revision: 4 $
46 //
47 // $Id: SoundTouch.h 195 2014-04-06 15:57:21Z oparviai $
48 //
49 ////////////////////////////////////////////////////////////////////////////////
50 //
51 // License :
52 //
53 // SoundTouch audio processing library
54 // Copyright (c) Olli Parviainen
55 //
56 // This library is free software; you can redistribute it and/or
57 // modify it under the terms of the GNU Lesser General Public
58 // License as published by the Free Software Foundation; either
59 // version 2.1 of the License, or (at your option) any later version.
60 //
61 // This library is distributed in the hope that it will be useful,
62 // but WITHOUT ANY WARRANTY; without even the implied warranty of
63 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
64 // Lesser General Public License for more details.
65 //
66 // You should have received a copy of the GNU Lesser General Public
67 // License along with this library; if not, write to the Free Software
68 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
69 //
70 ////////////////////////////////////////////////////////////////////////////////
72 #ifndef SoundTouch_H
73 #define SoundTouch_H
75 #include "FIFOSamplePipe.h"
76 #include "STTypes.h"
78 namespace soundtouch
79 {
81 /// Soundtouch library version string
82 #define SOUNDTOUCH_VERSION "1.8.0"
84 /// SoundTouch library version id
85 #define SOUNDTOUCH_VERSION_ID (10800)
87 //
88 // Available setting IDs for the 'setSetting' & 'get_setting' functions:
90 /// Enable/disable anti-alias filter in pitch transposer (0 = disable)
91 #define SETTING_USE_AA_FILTER 0
93 /// Pitch transposer anti-alias filter length (8 .. 128 taps, default = 32)
94 #define SETTING_AA_FILTER_LENGTH 1
96 /// Enable/disable quick seeking algorithm in tempo changer routine
97 /// (enabling quick seeking lowers CPU utilization but causes a minor sound
98 /// quality compromising)
99 #define SETTING_USE_QUICKSEEK 2
101 /// Time-stretch algorithm single processing sequence length in milliseconds. This determines
102 /// to how long sequences the original sound is chopped in the time-stretch algorithm.
103 /// See "STTypes.h" or README for more information.
104 #define SETTING_SEQUENCE_MS 3
106 /// Time-stretch algorithm seeking window length in milliseconds for algorithm that finds the
107 /// best possible overlapping location. This determines from how wide window the algorithm
108 /// may look for an optimal joining location when mixing the sound sequences back together.
109 /// See "STTypes.h" or README for more information.
110 #define SETTING_SEEKWINDOW_MS 4
112 /// Time-stretch algorithm overlap length in milliseconds. When the chopped sound sequences
113 /// are mixed back together, to form a continuous sound stream, this parameter defines over
114 /// how long period the two consecutive sequences are let to overlap each other.
115 /// See "STTypes.h" or README for more information.
116 #define SETTING_OVERLAP_MS 5
119 /// Call "getSetting" with this ID to query nominal average processing sequence
120 /// size in samples. This value tells approcimate value how many input samples
121 /// SoundTouch needs to gather before it does DSP processing run for the sample batch.
122 ///
123 /// Notices:
124 /// - This is read-only parameter, i.e. setSetting ignores this parameter
125 /// - Returned value is approximate average value, exact processing batch
126 /// size may wary from time to time
127 /// - This parameter value is not constant but may change depending on
128 /// tempo/pitch/rate/samplerate settings.
129 #define SETTING_NOMINAL_INPUT_SEQUENCE 6
132 /// Call "getSetting" with this ID to query nominal average processing output
133 /// size in samples. This value tells approcimate value how many output samples
134 /// SoundTouch outputs once it does DSP processing run for a batch of input samples.
135 ///
136 /// Notices:
137 /// - This is read-only parameter, i.e. setSetting ignores this parameter
138 /// - Returned value is approximate average value, exact processing batch
139 /// size may wary from time to time
140 /// - This parameter value is not constant but may change depending on
141 /// tempo/pitch/rate/samplerate settings.
142 #define SETTING_NOMINAL_OUTPUT_SEQUENCE 7
144 class EXPORT SoundTouch : public FIFOProcessor
145 {
146 private:
147 /// Rate transposer class instance
148 class RateTransposer *pRateTransposer;
150 /// Time-stretch class instance
151 class TDStretch *pTDStretch;
153 /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
154 float virtualRate;
156 /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
157 float virtualTempo;
159 /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
160 float virtualPitch;
162 /// Flag: Has sample rate been set?
163 bool bSrateSet;
165 /// Calculates effective rate & tempo valuescfrom 'virtualRate', 'virtualTempo' and
166 /// 'virtualPitch' parameters.
167 void calcEffectiveRateAndTempo();
169 protected :
170 /// Number of channels
171 uint channels;
173 /// Effective 'rate' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch'
174 float rate;
176 /// Effective 'tempo' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch'
177 float tempo;
179 public:
180 SoundTouch();
181 virtual ~SoundTouch();
183 /// Get SoundTouch library version string
184 static const char *getVersionString();
186 /// Get SoundTouch library version Id
187 static uint getVersionId();
189 /// Sets new rate control value. Normal rate = 1.0, smaller values
190 /// represent slower rate, larger faster rates.
191 void setRate(float newRate);
193 /// Sets new tempo control value. Normal tempo = 1.0, smaller values
194 /// represent slower tempo, larger faster tempo.
195 void setTempo(float newTempo);
197 /// Sets new rate control value as a difference in percents compared
198 /// to the original rate (-50 .. +100 %)
199 void setRateChange(float newRate);
201 /// Sets new tempo control value as a difference in percents compared
202 /// to the original tempo (-50 .. +100 %)
203 void setTempoChange(float newTempo);
205 /// Sets new pitch control value. Original pitch = 1.0, smaller values
206 /// represent lower pitches, larger values higher pitch.
207 void setPitch(float newPitch);
209 /// Sets pitch change in octaves compared to the original pitch
210 /// (-1.00 .. +1.00)
211 void setPitchOctaves(float newPitch);
213 /// Sets pitch change in semi-tones compared to the original pitch
214 /// (-12 .. +12)
215 void setPitchSemiTones(int newPitch);
216 void setPitchSemiTones(float newPitch);
218 /// Sets the number of channels, 1 = mono, 2 = stereo
219 void setChannels(uint numChannels);
221 /// Sets sample rate.
222 void setSampleRate(uint srate);
224 /// Flushes the last samples from the processing pipeline to the output.
225 /// Clears also the internal processing buffers.
226 //
227 /// Note: This function is meant for extracting the last samples of a sound
228 /// stream. This function may introduce additional blank samples in the end
229 /// of the sound stream, and thus it's not recommended to call this function
230 /// in the middle of a sound stream.
231 void flush();
233 /// Adds 'numSamples' pcs of samples from the 'samples' memory position into
234 /// the input of the object. Notice that sample rate _has_to_ be set before
235 /// calling this function, otherwise throws a runtime_error exception.
236 virtual void putSamples(
237 const SAMPLETYPE *samples, ///< Pointer to sample buffer.
238 uint numSamples ///< Number of samples in buffer. Notice
239 ///< that in case of stereo-sound a single sample
240 ///< contains data for both channels.
241 );
243 /// Clears all the samples in the object's output and internal processing
244 /// buffers.
245 virtual void clear();
247 /// Changes a setting controlling the processing system behaviour. See the
248 /// 'SETTING_...' defines for available setting ID's.
249 ///
250 /// \return 'true' if the setting was succesfully changed
251 bool setSetting(int settingId, ///< Setting ID number. see SETTING_... defines.
252 int value ///< New setting value.
253 );
255 /// Reads a setting controlling the processing system behaviour. See the
256 /// 'SETTING_...' defines for available setting ID's.
257 ///
258 /// \return the setting value.
259 int getSetting(int settingId ///< Setting ID number, see SETTING_... defines.
260 ) const;
262 /// Returns number of samples currently unprocessed.
263 virtual uint numUnprocessedSamples() const;
266 /// Other handy functions that are implemented in the ancestor classes (see
267 /// classes 'FIFOProcessor' and 'FIFOSamplePipe')
268 ///
269 /// - receiveSamples() : Use this function to receive 'ready' processed samples from SoundTouch.
270 /// - numSamples() : Get number of 'ready' samples that can be received with
271 /// function 'receiveSamples()'
272 /// - isEmpty() : Returns nonzero if there aren't any 'ready' samples.
273 /// - clear() : Clears all samples from ready/processing buffers.
274 };
276 }
277 #endif