SDL_audiolib 0.0.0
An audio decoding, resampling and mixing library
|
Abstract base class for audio resamplers. More...
#include <Resampler.h>
Public Member Functions | |
Resampler () | |
Constructs an audio resampler. More... | |
virtual | ~Resampler () |
Resampler (const Resampler &)=delete | |
auto | operator= (const Resampler &) -> Resampler &=delete |
void | setDecoder (std::shared_ptr< Decoder > decoder) |
Sets the decoder that is to be used as source. More... | |
auto | setSpec (int dstRate, int channels, int chunkSize) -> int |
Sets the target sample rate, channels and chuck size. More... | |
auto | currentRate () const -> int |
auto | currentChannels () const -> int |
auto | currentChunkSize () const -> int |
auto | resample (float dst[], int dstLen) -> int |
Fills an output buffer with resampled audio samples. More... | |
void | discardPendingSamples () |
Discards any samples that have not yet been retrieved with resample(). More... | |
Protected Member Functions | |
virtual auto | adjustForOutputSpec (int dstRate, int srcRate, int channels) -> int=0 |
Change sample rate and amount of channels. More... | |
virtual void | doResampling (float dst[], const float src[], int &dstLen, int &srcLen)=0 |
virtual void | doDiscardPendingSamples ()=0 |
Discard any internally held samples. More... | |
Abstract base class for audio resamplers.
This class receives audio from an Decoder and resamples it to the requested sample rate.
Aulib::Resampler::Resampler | ( | ) |
Constructs an audio resampler.
|
virtual |
|
delete |
|
protectedpure virtual |
Change sample rate and amount of channels.
This function must be implemented when subclassing. It is used to notify subclasses about changes in source and target sample rates, as well as the amount of channels in the audio.
dstRate | Target sample rate (rate being resampled to.) |
srcRate | Source sample rate (rate being resampled from.) |
channels | Amount of channels in both the source as well as the target audio buffers. |
Implemented in Aulib::ResamplerSdl, Aulib::ResamplerSox, Aulib::ResamplerSpeex, and Aulib::ResamplerSrc.
auto Aulib::Resampler::currentChannels | ( | ) | const -> int |
auto Aulib::Resampler::currentChunkSize | ( | ) | const -> int |
auto Aulib::Resampler::currentRate | ( | ) | const -> int |
void Aulib::Resampler::discardPendingSamples | ( | ) |
Discards any samples that have not yet been retrieved with resample().
This is especially useful after seeking the decoder to a different position and you want resample() to immediately give you samples from the new position rather than the ones from the old position that were previously resampled but not yet retrieved.
|
protectedpure virtual |
Discard any internally held samples.
This function must be implemented when subclassing. It should discard any internally held samples. Note that even if you don't actually buffer any samples in your subclass but are using some external resampling library that you delegate resampling to, that external resampler might be holding samples in an internal buffer. Those will need to be discarded as well.
If none of the above applies, this can be implemented as an empty function.
Implemented in Aulib::ResamplerSdl, Aulib::ResamplerSox, Aulib::ResamplerSpeex, and Aulib::ResamplerSrc.
|
protectedpure virtual |
This function must be implemented when subclassing. It must resample the audio contained in 'src' containing 'srcLen' samples, and store the resulting samples in 'dst', which has a capacity of at most 'dstLen' samples.
The 'src' buffer contains audio in either mono or stereo. Stereo is stored in interleaved format.
The source and target sample rates, as well as the amount of channels that are to be used must be those that were specified in the last call to the adjustForOutputSpec() function.
'dstLen' and 'srcLen' are both input as well as output parameters. The function must set 'dstLen' to the amount of samples that were actually stored in 'dst', and 'srcLen' to the amount of samples that were actually used from 'src'. For example, if in the following call:
dstLen = 200; srcLen = 100; doResampling(dst, src, dstLen, srcLen);
the function resamples 98 samples from 'src', resulting in 196 samples which are stored in 'dst', the function must set 'srcLen' to 98 and 'dstLen' to 196.
So when implementing this function, you do not need to worry about using up all the available samples in 'src'. Simply resample as much audio from 'src' as you can in order to fill 'dst' as much as possible, and if there's anything left at the end that cannot be resampled, simply ignore it.
Implemented in Aulib::ResamplerSdl, Aulib::ResamplerSox, Aulib::ResamplerSpeex, and Aulib::ResamplerSrc.
auto Aulib::Resampler::resample | ( | float | dst[], |
int | dstLen | ||
) | -> int |
Fills an output buffer with resampled audio samples.
dst | Output buffer. |
dstLen | Size of output buffer (amount of elements, not size in bytes.) |
void Aulib::Resampler::setDecoder | ( | std::shared_ptr< Decoder > | decoder | ) |
Sets the decoder that is to be used as source.
decoder | The decoder to use as source. Must not be null. |
auto Aulib::Resampler::setSpec | ( | int | dstRate, |
int | channels, | ||
int | chunkSize | ||
) | -> int |
Sets the target sample rate, channels and chuck size.
dstRate | Wanted sample rate. |
channels | Wanted amount of channels. |
chunkSize | Specifies how many samples per channel to resample at most in each call to the resample() function. It is recommended to set this to the same value that was used as buffer size in the call to Aulib::init(). |