You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
5.0 KiB
164 lines
5.0 KiB
//////////////////////////////////////////////////////////////////////////////// |
|
/// |
|
/// Sample rate transposer. Changes sample rate by using linear interpolation |
|
/// together with anti-alias filtering (first order interpolation with anti- |
|
/// alias filtering should be quite adequate for this application). |
|
/// |
|
/// Use either of the derived classes of 'RateTransposerInteger' or |
|
/// 'RateTransposerFloat' for corresponding integer/floating point tranposing |
|
/// algorithm implementation. |
|
/// |
|
/// Author : Copyright (c) Olli Parviainen |
|
/// Author e-mail : oparviai 'at' iki.fi |
|
/// SoundTouch WWW: http://www.surina.net/soundtouch |
|
/// |
|
//////////////////////////////////////////////////////////////////////////////// |
|
// |
|
// License : |
|
// |
|
// SoundTouch audio processing library |
|
// Copyright (c) Olli Parviainen |
|
// |
|
// This library is free software; you can redistribute it and/or |
|
// modify it under the terms of the GNU Lesser General Public |
|
// License as published by the Free Software Foundation; either |
|
// version 2.1 of the License, or (at your option) any later version. |
|
// |
|
// This library is distributed in the hope that it will be useful, |
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
// Lesser General Public License for more details. |
|
// |
|
// You should have received a copy of the GNU Lesser General Public |
|
// License along with this library; if not, write to the Free Software |
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
// |
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
|
#ifndef RateTransposer_H |
|
#define RateTransposer_H |
|
|
|
#include <stddef.h> |
|
#include "AAFilter.h" |
|
#include "FIFOSamplePipe.h" |
|
#include "FIFOSampleBuffer.h" |
|
|
|
#include "STTypes.h" |
|
|
|
namespace soundtouch |
|
{ |
|
|
|
/// Abstract base class for transposer implementations (linear, advanced vs integer, float etc) |
|
class TransposerBase |
|
{ |
|
public: |
|
enum ALGORITHM { |
|
LINEAR = 0, |
|
CUBIC, |
|
SHANNON |
|
}; |
|
|
|
protected: |
|
virtual int transposeMono(SAMPLETYPE *dest, |
|
const SAMPLETYPE *src, |
|
int &srcSamples) = 0; |
|
virtual int transposeStereo(SAMPLETYPE *dest, |
|
const SAMPLETYPE *src, |
|
int &srcSamples) = 0; |
|
virtual int transposeMulti(SAMPLETYPE *dest, |
|
const SAMPLETYPE *src, |
|
int &srcSamples) = 0; |
|
|
|
static ALGORITHM algorithm; |
|
|
|
public: |
|
double rate; |
|
int numChannels; |
|
|
|
TransposerBase(); |
|
virtual ~TransposerBase(); |
|
|
|
virtual int transpose(FIFOSampleBuffer &dest, FIFOSampleBuffer &src); |
|
virtual void setRate(double newRate); |
|
virtual void setChannels(int channels); |
|
virtual int getLatency() const = 0; |
|
|
|
virtual void resetRegisters() = 0; |
|
|
|
// static factory function |
|
static TransposerBase *newInstance(); |
|
|
|
// static function to set interpolation algorithm |
|
static void setAlgorithm(ALGORITHM a); |
|
}; |
|
|
|
|
|
/// A common linear samplerate transposer class. |
|
/// |
|
class RateTransposer final : public FIFOProcessor |
|
{ |
|
protected: |
|
/// Anti-alias filter object |
|
AAFilter *pAAFilter; |
|
TransposerBase *pTransposer; |
|
|
|
/// Buffer for collecting samples to feed the anti-alias filter between |
|
/// two batches |
|
FIFOSampleBuffer inputBuffer; |
|
|
|
/// Buffer for keeping samples between transposing & anti-alias filter |
|
FIFOSampleBuffer midBuffer; |
|
|
|
/// Output sample buffer |
|
FIFOSampleBuffer outputBuffer; |
|
|
|
bool bUseAAFilter; |
|
|
|
|
|
/// Transposes sample rate by applying anti-alias filter to prevent folding. |
|
/// Returns amount of samples returned in the "dest" buffer. |
|
/// The maximum amount of samples that can be returned at a time is set by |
|
/// the 'set_returnBuffer_size' function. |
|
void processSamples(const SAMPLETYPE *src, |
|
uint numSamples); |
|
|
|
public: |
|
RateTransposer(); |
|
virtual ~RateTransposer() override; |
|
|
|
/// Returns the output buffer object |
|
FIFOSamplePipe *getOutput() { return &outputBuffer; }; |
|
|
|
/// Return anti-alias filter object |
|
AAFilter *getAAFilter(); |
|
|
|
/// Enables/disables the anti-alias filter. Zero to disable, nonzero to enable |
|
void enableAAFilter(bool newMode); |
|
|
|
/// Returns nonzero if anti-alias filter is enabled. |
|
bool isAAFilterEnabled() const; |
|
|
|
/// Sets new target rate. Normal rate = 1.0, smaller values represent slower |
|
/// rate, larger faster rates. |
|
virtual void setRate(double newRate); |
|
|
|
/// Sets the number of channels, 1 = mono, 2 = stereo |
|
void setChannels(int channels); |
|
|
|
/// Adds 'numSamples' pcs of samples from the 'samples' memory position into |
|
/// the input of the object. |
|
void putSamples(const SAMPLETYPE *samples, uint numSamples) override; |
|
|
|
/// Clears all the samples in the object |
|
void clear() override; |
|
|
|
/// Returns nonzero if there aren't any samples available for outputting. |
|
int isEmpty() const override; |
|
|
|
/// Return approximate initial input-output latency |
|
int getLatency() const; |
|
}; |
|
|
|
} |
|
|
|
#endif
|
|
|