/[pcsx2_0.9.7]/trunk/3rdparty/SoundTouch/SoundTouch.h
ViewVC logotype

Contents of /trunk/3rdparty/SoundTouch/SoundTouch.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (show annotations) (download)
Mon Sep 6 11:19:43 2010 UTC (9 years, 4 months ago) by william
File MIME type: text/plain
File size: 10619 byte(s)
Exported ./upsream/trunk @r3730 from http://pcsx2.googlecode.com/svn/trunk/
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: 2009-12-28 22:10:14 +0200 (Mon, 28 Dec 2009) $
45 // File revision : $Revision: 4 $
46 //
47 // $Id: SoundTouch.h 78 2009-12-28 20:10:14Z 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 ////////////////////////////////////////////////////////////////////////////////
71
72 #ifndef SoundTouch_H
73 #define SoundTouch_H
74
75 #include "FIFOSamplePipe.h"
76 #include "STTypes.h"
77
78 namespace soundtouch
79 {
80
81 /// Soundtouch library version string
82 #define SOUNDTOUCH_VERSION "1.5.0"
83
84 /// SoundTouch library version id
85 #define SOUNDTOUCH_VERSION_ID (10500)
86
87 //
88 // Available setting IDs for the 'setSetting' & 'get_setting' functions:
89
90 /// Enable/disable anti-alias filter in pitch transposer (0 = disable)
91 #define SETTING_USE_AA_FILTER 0
92
93 /// Pitch transposer anti-alias filter length (8 .. 128 taps, default = 32)
94 #define SETTING_AA_FILTER_LENGTH 1
95
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
100
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
105
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
111
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
117
118
119 class SoundTouch : public FIFOProcessor
120 {
121 private:
122 /// Rate transposer class instance
123 class RateTransposer *pRateTransposer;
124
125 /// Time-stretch class instance
126 class TDStretch *pTDStretch;
127
128 /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
129 float virtualRate;
130
131 /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
132 float virtualTempo;
133
134 /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
135 float virtualPitch;
136
137 /// Flag: Has sample rate been set?
138 BOOL bSrateSet;
139
140 /// Calculates effective rate & tempo valuescfrom 'virtualRate', 'virtualTempo' and
141 /// 'virtualPitch' parameters.
142 void calcEffectiveRateAndTempo();
143
144 protected :
145 /// Number of channels
146 uint channels;
147
148 /// Effective 'rate' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch'
149 float rate;
150
151 /// Effective 'tempo' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch'
152 float tempo;
153
154 public:
155 SoundTouch();
156 virtual ~SoundTouch();
157
158 /// Get SoundTouch library version string
159 static const char *getVersionString();
160
161 /// Get SoundTouch library version Id
162 static uint getVersionId();
163
164 /// Sets new rate control value. Normal rate = 1.0, smaller values
165 /// represent slower rate, larger faster rates.
166 void setRate(float newRate);
167
168 /// Sets new tempo control value. Normal tempo = 1.0, smaller values
169 /// represent slower tempo, larger faster tempo.
170 void setTempo(float newTempo);
171
172 /// Sets new rate control value as a difference in percents compared
173 /// to the original rate (-50 .. +100 %)
174 void setRateChange(float newRate);
175
176 /// Sets new tempo control value as a difference in percents compared
177 /// to the original tempo (-50 .. +100 %)
178 void setTempoChange(float newTempo);
179
180 /// Sets new pitch control value. Original pitch = 1.0, smaller values
181 /// represent lower pitches, larger values higher pitch.
182 void setPitch(float newPitch);
183
184 /// Sets pitch change in octaves compared to the original pitch
185 /// (-1.00 .. +1.00)
186 void setPitchOctaves(float newPitch);
187
188 /// Sets pitch change in semi-tones compared to the original pitch
189 /// (-12 .. +12)
190 void setPitchSemiTones(int newPitch);
191 void setPitchSemiTones(float newPitch);
192
193 /// Sets the number of channels, 1 = mono, 2 = stereo
194 void setChannels(uint numChannels);
195
196 /// Sets sample rate.
197 void setSampleRate(uint srate);
198
199 /// Flushes the last samples from the processing pipeline to the output.
200 /// Clears also the internal processing buffers.
201 //
202 /// Note: This function is meant for extracting the last samples of a sound
203 /// stream. This function may introduce additional blank samples in the end
204 /// of the sound stream, and thus it's not recommended to call this function
205 /// in the middle of a sound stream.
206 void flush();
207
208 /// Adds 'numSamples' pcs of samples from the 'samples' memory position into
209 /// the input of the object. Notice that sample rate _has_to_ be set before
210 /// calling this function, otherwise throws a runtime_error exception.
211 virtual void putSamples(
212 const SAMPLETYPE *samples, ///< Pointer to sample buffer.
213 uint numSamples ///< Number of samples in buffer. Notice
214 ///< that in case of stereo-sound a single sample
215 ///< contains data for both channels.
216 );
217
218 /// Clears all the samples in the object's output and internal processing
219 /// buffers.
220 virtual void clear();
221
222 /// Changes a setting controlling the processing system behaviour. See the
223 /// 'SETTING_...' defines for available setting ID's.
224 ///
225 /// \return 'TRUE' if the setting was succesfully changed
226 BOOL setSetting(int settingId, ///< Setting ID number. see SETTING_... defines.
227 int value ///< New setting value.
228 );
229
230 /// Reads a setting controlling the processing system behaviour. See the
231 /// 'SETTING_...' defines for available setting ID's.
232 ///
233 /// \return the setting value.
234 int getSetting(int settingId ///< Setting ID number, see SETTING_... defines.
235 ) const;
236
237 /// Returns number of samples currently unprocessed.
238 virtual uint numUnprocessedSamples() const;
239
240
241 /// Other handy functions that are implemented in the ancestor classes (see
242 /// classes 'FIFOProcessor' and 'FIFOSamplePipe')
243 ///
244 /// - receiveSamples() : Use this function to receive 'ready' processed samples from SoundTouch.
245 /// - numSamples() : Get number of 'ready' samples that can be received with
246 /// function 'receiveSamples()'
247 /// - isEmpty() : Returns nonzero if there aren't any 'ready' samples.
248 /// - clear() : Clears all samples from ready/processing buffers.
249 };
250
251 }
252 #endif

  ViewVC Help
Powered by ViewVC 1.1.22