@@ -1,27 +1,27 @@
// ////////////////////////////////////////////////////////////////////////////
// /
// / SoundTouch - main class for tempo/pitch/rate adjusting routines.
// / SoundTouch - main class for tempo/pitch/rate adjusting routines.
// /
// / Notes:
// / - Initialize the SoundTouch object instance by setting up the sound stream
// / parameters with functions 'setSampleRate' and 'setChannels', then set
// / - Initialize the SoundTouch object instance by setting up the sound stream
// / parameters with functions 'setSampleRate' and 'setChannels', then set
// / desired tempo/pitch/rate settings with the corresponding functions.
// /
// / - The SoundTouch class behaves like a first-in-first-out pipeline: The
// / - The SoundTouch class behaves like a first-in-first-out pipeline: The
// / samples that are to be processed are fed into one of the pipe by calling
// / function 'putSamples', while the ready processed samples can be read
// / function 'putSamples', while the ready processed samples can be read
// / from the other end of the pipeline with function 'receiveSamples'.
// /
// / - The SoundTouch processing classes require certain sized 'batches' of
// / samples in order to process the sound. For this reason the classes buffer
// / incoming samples until there are enough of samples available for
// /
// / - The SoundTouch processing classes require certain sized 'batches' of
// / samples in order to process the sound. For this reason the classes buffer
// / incoming samples until there are enough of samples available for
// / processing, then they carry out the processing step and consequently
// / make the processed samples available for outputting.
// /
// / - For the above reason, the processing routines introduce a certain
// /
// / - For the above reason, the processing routines introduce a certain
// / 'latency' between the input and output, so that the samples input to
// / SoundTouch may not be immediately available in the output, and neither
// / the amount of outputtable samples may not immediately be in direct
// / SoundTouch may not be immediately available in the output, and neither
// / the amount of outputtable samples may not immediately be in direct
// / relationship with the amount of previously input samples.
// /
// / - The tempo/pitch/rate control parameters can be altered during processing.
Expand All
@@ -30,8 +30,8 @@
// / required.
// /
// / - This class utilizes classes 'TDStretch' for tempo change (without modifying
// / pitch) and 'RateTransposer' for changing the playback rate (that is, both
// / tempo and pitch in the same ratio) of the sound. The third available control
// / pitch) and 'RateTransposer' for changing the playback rate (that is, both
// / tempo and pitch in the same ratio) of the sound. The third available control
// / 'pitch' (change pitch but maintain tempo) is produced by a combination of
// / combining the two other controls.
// /
Expand All
@@ -41,13 +41,6 @@
// /
// //////////////////////////////////////////////////////////////////////////////
//
// Last changed : $Date: 2015-09-20 10:38:32 +0300 (Sun, 20 Sep 2015) $
// File revision : $Revision: 4 $
//
// $Id: SoundTouch.h 230 2015-09-20 07:38:32Z oparviai $
//
// //////////////////////////////////////////////////////////////////////////////
//
// License :
//
// SoundTouch audio processing library
Expand Down
Expand Up
@@ -79,10 +72,10 @@ namespace soundtouch
{
// / Soundtouch library version string
#define SOUNDTOUCH_VERSION " 1.9 .2"
#define SOUNDTOUCH_VERSION " 2.3 .2"
// / SoundTouch library version id
#define SOUNDTOUCH_VERSION_ID (10902 )
#define SOUNDTOUCH_VERSION_ID (20302 )
//
// Available setting IDs for the 'setSetting' & 'get_setting' functions:
Expand All
@@ -98,48 +91,79 @@ namespace soundtouch
// / quality compromising)
#define SETTING_USE_QUICKSEEK 2
// / Time-stretch algorithm single processing sequence length in milliseconds. This determines
// / to how long sequences the original sound is chopped in the time-stretch algorithm.
// / Time-stretch algorithm single processing sequence length in milliseconds. This determines
// / to how long sequences the original sound is chopped in the time-stretch algorithm.
// / See "STTypes.h" or README for more information.
#define SETTING_SEQUENCE_MS 3
// / Time-stretch algorithm seeking window length in milliseconds for algorithm that finds the
// / best possible overlapping location. This determines from how wide window the algorithm
// / may look for an optimal joining location when mixing the sound sequences back together.
// / Time-stretch algorithm seeking window length in milliseconds for algorithm that finds the
// / best possible overlapping location. This determines from how wide window the algorithm
// / may look for an optimal joining location when mixing the sound sequences back together.
// / See "STTypes.h" or README for more information.
#define SETTING_SEEKWINDOW_MS 4
// / Time-stretch algorithm overlap length in milliseconds. When the chopped sound sequences
// / are mixed back together, to form a continuous sound stream, this parameter defines over
// / how long period the two consecutive sequences are let to overlap each other.
// / Time-stretch algorithm overlap length in milliseconds. When the chopped sound sequences
// / are mixed back together, to form a continuous sound stream, this parameter defines over
// / how long period the two consecutive sequences are let to overlap each other.
// / See "STTypes.h" or README for more information.
#define SETTING_OVERLAP_MS 5
// / Call "getSetting" with this ID to query nominal average processing sequence
// / size in samples. This value tells approcimate value how many input samples
// / SoundTouch needs to gather before it does DSP processing run for the sample batch.
// / Call "getSetting" with this ID to query processing sequence size in samples.
// / This value gives approximate value of how many input samples you'll need to
// / feed into SoundTouch after initial buffering to get out a new batch of
// / output samples.
// /
// / Notices:
// / This value does not include initial buffering at beginning of a new processing
// / stream, use SETTING_INITIAL_LATENCY to get the initial buffering size.
// /
// / Notices:
// / - This is read-only parameter, i.e. setSetting ignores this parameter
// / - Returned value is approximate average value, exact processing batch
// / size may wary from time to time
// / - This parameter value is not constant but may change depending on
// / - This parameter value is not constant but change depending on
// / tempo/pitch/rate/samplerate settings.
#define SETTING_NOMINAL_INPUT_SEQUENCE 6
#define SETTING_NOMINAL_INPUT_SEQUENCE 6
// / Call "getSetting" with this ID to query nominal average processing output
// / size in samples. This value tells approcimate value how many output samples
// / Call "getSetting" with this ID to query nominal average processing output
// / size in samples. This value tells approcimate value how many output samples
// / SoundTouch outputs once it does DSP processing run for a batch of input samples.
// /
// / Notices:
// /
// / Notices:
// / - This is read-only parameter, i.e. setSetting ignores this parameter
// / - Returned value is approximate average value, exact processing batch
// / size may wary from time to time
// / - This parameter value is not constant but may change depending on
// / - This parameter value is not constant but change depending on
// / tempo/pitch/rate/samplerate settings.
#define SETTING_NOMINAL_OUTPUT_SEQUENCE 7
#define SETTING_NOMINAL_OUTPUT_SEQUENCE 7
// / Call "getSetting" with this ID to query initial processing latency, i.e.
// / approx. how many samples you'll need to enter to SoundTouch pipeline before
// / you can expect to get first batch of ready output samples out.
// /
// / After the first output batch, you can then expect to get approx.
// / SETTING_NOMINAL_OUTPUT_SEQUENCE ready samples out for every
// / SETTING_NOMINAL_INPUT_SEQUENCE samples that you enter into SoundTouch.
// /
// / Example:
// / processing with parameter -tempo=5
// / => initial latency = 5509 samples
// / input sequence = 4167 samples
// / output sequence = 3969 samples
// /
// / Accordingly, you can expect to feed in approx. 5509 samples at beginning of
// / the stream, and then you'll get out the first 3969 samples. After that, for
// / every approx. 4167 samples that you'll put in, you'll receive again approx.
// / 3969 samples out.
// /
// / This also means that average latency during stream processing is
// / INITIAL_LATENCY-OUTPUT_SEQUENCE/2, in the above example case 5509-3969/2
// / = 3524 samples
// /
// / Notices:
// / - This is read-only parameter, i.e. setSetting ignores this parameter
// / - This parameter value is not constant but change depending on
// / tempo/pitch/rate/samplerate settings.
#define SETTING_INITIAL_LATENCY 8
class SoundTouch : public FIFOProcessor
{
Expand Down
Expand Up
@@ -169,7 +193,7 @@ class SoundTouch : public FIFOProcessor
// / Accumulator for how many samples in total have been read out from the processing so far
long samplesOutput;
// / Calculates effective rate & tempo valuescfrom 'virtualRate', 'virtualTempo' and
// / Calculates effective rate & tempo valuescfrom 'virtualRate', 'virtualTempo' and
// / 'virtualPitch' parameters.
void calcEffectiveRateAndTempo ();
Expand All
@@ -185,7 +209,7 @@ protected :
public:
SoundTouch ();
virtual ~SoundTouch ();
virtual ~SoundTouch () override ;
// / Get SoundTouch library version string
static const char *getVersionString ();
Expand Down
Expand Up
@@ -213,7 +237,7 @@ protected :
// / represent lower pitches, larger values higher pitch.
void setPitch (double newPitch);
// / Sets pitch change in octaves compared to the original pitch
// / Sets pitch change in octaves compared to the original pitch
// / (-1.00 .. +1.00)
void setPitchOctaves (double newPitch);
Expand All
@@ -228,6 +252,24 @@ protected :
// / Sets sample rate.
void setSampleRate (uint srate);
// / Get ratio between input and output audio durations, useful for calculating
// / processed output duration: if you'll process a stream of N samples, then
// / you can expect to get out N * getInputOutputSampleRatio() samples.
// /
// / This ratio will give accurate target duration ratio for a full audio track,
// / given that the the whole track is processed with same processing parameters.
// /
// / If this ratio is applied to calculate intermediate offsets inside a processing
// / stream, then this ratio is approximate and can deviate +- some tens of milliseconds
// / from ideal offset, yet by end of the audio stream the duration ratio will become
// / exact.
// /
// / Example: if processing with parameters "-tempo=15 -pitch=-3", the function
// / will return value 0.8695652... Now, if processing an audio stream whose duration
// / is exactly one million audio samples, then you can expect the processed
// / output duration be 0.869565 * 1000000 = 869565 samples.
double getInputOutputSampleRatio ();
// / Flushes the last samples from the processing pipeline to the output.
// / Clears also the internal processing buffers.
//
Expand All
@@ -245,33 +287,33 @@ protected :
uint numSamples // /< Number of samples in buffer. Notice
// /< that in case of stereo-sound a single sample
// /< contains data for both channels.
);
) override ;
// / Output samples from beginning of the sample buffer. Copies requested samples to
// / output buffer and removes them from the sample buffer. If there are less than
// / Output samples from beginning of the sample buffer. Copies requested samples to
// / output buffer and removes them from the sample buffer. If there are less than
// / 'numsample' samples in the buffer, returns all that available.
// /
// / \return Number of samples returned.
virtual uint receiveSamples (SAMPLETYPE *output, // /< Buffer where to copy output samples.
uint maxSamples // /< How many samples to receive at max.
);
) override ;
// / Adjusts book-keeping so that given number of samples are removed from beginning of the
// / sample buffer without copying them anywhere.
// / Adjusts book-keeping so that given number of samples are removed from beginning of the
// / sample buffer without copying them anywhere.
// /
// / Used to reduce the number of samples in the buffer when accessing the sample buffer directly
// / with 'ptrBegin' function.
virtual uint receiveSamples (uint maxSamples // /< Remove this many samples from the beginning of pipe.
);
) override ;
// / Clears all the samples in the object's output and internal processing
// / buffers.
virtual void clear ();
virtual void clear () override ;
// / Changes a setting controlling the processing system behaviour. See the
// / 'SETTING_...' defines for available setting ID's.
// /
// / \return 'true' if the setting was succesfully changed
// /
// / \return 'true' if the setting was successfully changed
bool setSetting (int settingId, // /< Setting ID number. see SETTING_... defines.
int value // /< New setting value.
);
Expand All
@@ -286,12 +328,17 @@ protected :
// / Returns number of samples currently unprocessed.
virtual uint numUnprocessedSamples () const ;
// / Return number of channels
uint numChannels () const
{
return channels;
}
// / Other handy functions that are implemented in the ancestor classes (see
// / classes 'FIFOProcessor' and 'FIFOSamplePipe')
// /
// / - receiveSamples() : Use this function to receive 'ready' processed samples from SoundTouch.
// / - numSamples() : Get number of 'ready' samples that can be received with
// / - numSamples() : Get number of 'ready' samples that can be received with
// / function 'receiveSamples()'
// / - isEmpty() : Returns nonzero if there aren't any 'ready' samples.
// / - clear() : Clears all samples from ready/processing buffers.
Expand Down