mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-24 22:55:41 +00:00
165 lines
5 KiB
C
165 lines
5 KiB
C
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
///
|
||
|
/// 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 : 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
|