diff options
author | Joerg Mueller <nexyon@gmail.com> | 2011-06-22 00:25:48 +0400 |
---|---|---|
committer | Joerg Mueller <nexyon@gmail.com> | 2011-06-22 00:25:48 +0400 |
commit | d5eaffda23274271e28bf499bd8d4555b0077079 (patch) | |
tree | aeea31ffdddc329474cc62a6c5bd1371daf12f9a /intern/audaspace/SRC | |
parent | c89b4e4b665757e0a164e98985d2f5d1c6843fa0 (diff) |
3D Audio GSoC:
Dynamic resampling for libsamplerate and linear resampling.
Diffstat (limited to 'intern/audaspace/SRC')
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleFactory.cpp | 7 | ||||
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleReader.cpp | 57 | ||||
-rw-r--r-- | intern/audaspace/SRC/AUD_SRCResampleReader.h | 17 |
3 files changed, 52 insertions, 29 deletions
diff --git a/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp b/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp index 15e96f6ff1d..3ae2c4fbd06 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp +++ b/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp @@ -40,10 +40,5 @@ AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_Reference<AUD_IFactory> facto AUD_Reference<AUD_IReader> AUD_SRCResampleFactory::createReader() { - AUD_Reference<AUD_IReader> reader = getReader(); - - if(reader->getSpecs().rate != m_specs.rate) - reader = new AUD_SRCResampleReader(reader, m_specs.specs); - - return reader; + return new AUD_SRCResampleReader(getReader(), m_specs.specs); } diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp index 59854a7a2c4..cd6b0ef8c50 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp +++ b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp @@ -46,17 +46,14 @@ static const char* state_error = "AUD_SRCResampleReader: SRC State couldn't be " AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_Reference<AUD_IReader> reader, AUD_Specs specs) : AUD_EffectReader(reader), - m_sspecs(reader->getSpecs()), - m_factor(double(specs.rate) / double(m_sspecs.rate)), - m_tspecs(specs), + m_rate(specs.rate), + m_channels(reader->getSpecs().channels), m_position(0) { - m_tspecs.channels = m_sspecs.channels; - int error; m_src = src_callback_new(src_callback, SRC_SINC_MEDIUM_QUALITY, - m_sspecs.channels, + m_channels, &error, this); @@ -74,7 +71,11 @@ AUD_SRCResampleReader::~AUD_SRCResampleReader() long AUD_SRCResampleReader::doCallback(float** data) { - int length = m_buffer.getSize() / AUD_SAMPLE_SIZE(m_tspecs); + AUD_Specs specs; + specs.channels = m_channels; + specs.rate = m_rate; + + int length = m_buffer.getSize() / AUD_SAMPLE_SIZE(specs); *data = m_buffer.getBuffer(); m_reader->read(length, m_eos, *data); @@ -84,14 +85,18 @@ long AUD_SRCResampleReader::doCallback(float** data) void AUD_SRCResampleReader::seek(int position) { - m_reader->seek(position / m_factor); + AUD_Specs specs = m_reader->getSpecs(); + double factor = double(m_rate) / double(specs.rate); + m_reader->seek(position / factor); src_reset(m_src); m_position = position; } int AUD_SRCResampleReader::getLength() const { - return m_reader->getLength() * m_factor; + AUD_Specs specs = m_reader->getSpecs(); + double factor = double(m_rate) / double(specs.rate); + return m_reader->getLength() * factor; } int AUD_SRCResampleReader::getPosition() const @@ -101,18 +106,46 @@ int AUD_SRCResampleReader::getPosition() const AUD_Specs AUD_SRCResampleReader::getSpecs() const { - return m_tspecs; + AUD_Specs specs = m_reader->getSpecs(); + specs.rate = m_rate; + return specs; } void AUD_SRCResampleReader::read(int& length, bool& eos, sample_t* buffer) { + AUD_Specs specs = m_reader->getSpecs(); + + double factor = double(m_rate) / double(specs.rate); + + specs.rate = m_rate; + int size = length; - m_buffer.assureSize(length * AUD_SAMPLE_SIZE(m_tspecs)); + m_buffer.assureSize(length * AUD_SAMPLE_SIZE(specs)); + + if(specs.channels != m_channels) + { + src_delete(m_src); + + m_channels = specs.channels; + + int error; + m_src = src_callback_new(src_callback, + SRC_SINC_MEDIUM_QUALITY, + m_channels, + &error, + this); + + if(!m_src) + { + // XXX printf("%s\n", src_strerror(error)); + AUD_THROW(AUD_ERROR_SRC, state_error); + } + } m_eos = false; - length = src_callback_read(m_src, m_factor, length, buffer); + length = src_callback_read(m_src, factor, length, buffer); m_position += length; diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.h b/intern/audaspace/SRC/AUD_SRCResampleReader.h index 5b210a61e70..896a742356b 100644 --- a/intern/audaspace/SRC/AUD_SRCResampleReader.h +++ b/intern/audaspace/SRC/AUD_SRCResampleReader.h @@ -44,24 +44,19 @@ class AUD_SRCResampleReader : public AUD_EffectReader { private: /** - * The sample specification of the source. - */ - const AUD_Specs m_sspecs; - - /** - * The resampling factor. + * The sound output buffer. */ - const double m_factor; + AUD_Buffer m_buffer; /** - * The sound output buffer. + * The target sampling rate. */ - AUD_Buffer m_buffer; + AUD_SampleRate m_rate; /** - * The target specification. + * The reader channels. */ - AUD_Specs m_tspecs; + AUD_Channels m_channels; /** * The src state structure. |