Mercurial > hg > svcore
changeset 1318:f830a10bfbd6 3.0-integration
Start pruning other resampler logic than bqresample
author | Chris Cannam |
---|---|
date | Mon, 05 Dec 2016 16:54:19 +0000 |
parents | ea28ee929034 |
children | 12a1da4719c7 |
files | base/Resampler.h base/ResamplerSV.cpp data/fileio/CodedAudioFileReader.cpp data/fileio/CodedAudioFileReader.h files.pri |
diffstat | 5 files changed, 11 insertions(+), 255 deletions(-) [+] |
line wrap: on
line diff
--- a/base/Resampler.h Mon Dec 05 16:39:03 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Sonic Visualiser - An audio file viewer and annotation editor. - Centre for Digital Music, Queen Mary, University of London. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -/* - This is a modified version of a source file from the - Rubber Band audio timestretcher library. - This file copyright 2007 Chris Cannam. -*/ - -#ifndef _RESAMPLER_H_ -#define _RESAMPLER_H_ - -#include "BaseTypes.h" - -#include <sys/types.h> - -class Resampler -{ -public: - enum Quality { Best, FastestTolerable, Fastest }; - - Resampler(Quality quality, int channels, sv_frame_t chunkSize = 0); - ~Resampler(); - - sv_frame_t resample(float **in, float **out, - sv_frame_t incount, double ratio, - bool final = false); - - sv_frame_t resampleInterleaved(float *in, float *out, - sv_frame_t incount, double ratio, - bool final = false); - - void reset(); - -protected: - class D; - D *m_d; -}; - -#endif
--- a/base/ResamplerSV.cpp Mon Dec 05 16:39:03 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,196 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ -/* - Sonic Visualiser - An audio file viewer and annotation editor. - Centre for Digital Music, Queen Mary, University of London. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -/* - This is a modified version of a source file from the - Rubber Band audio timestretcher library. - This file copyright 2007 Chris Cannam. -*/ - -#include "Resampler.h" - -#include <cstdlib> -#include <cmath> - -#include <iostream> - -#include <samplerate.h> - -#include "Debug.h" - -class Resampler::D -{ -public: - D(Quality quality, int channels, sv_frame_t chunkSize); - ~D(); - - sv_frame_t resample(float **in, float **out, - sv_frame_t incount, double ratio, - bool final); - - sv_frame_t resampleInterleaved(float *in, float *out, - sv_frame_t incount, double ratio, - bool final); - - void reset(); - -protected: - SRC_STATE *m_src; - float *m_iin; - float *m_iout; - int m_channels; - sv_frame_t m_iinsize; - sv_frame_t m_ioutsize; -}; - -Resampler::D::D(Quality quality, int channels, sv_frame_t chunkSize) : - m_src(0), - m_iin(0), - m_iout(0), - m_channels(channels), - m_iinsize(0), - m_ioutsize(0) -{ - int err = 0; - m_src = src_new(quality == Best ? SRC_SINC_BEST_QUALITY : - quality == Fastest ? SRC_LINEAR : - SRC_SINC_FASTEST, - channels, &err); - - //!!! check err, throw - - if (chunkSize > 0 && m_channels > 1) { - //!!! alignment? - m_iinsize = chunkSize * m_channels; - m_ioutsize = chunkSize * m_channels * 2; - m_iin = (float *)malloc(m_iinsize * sizeof(float)); - m_iout = (float *)malloc(m_ioutsize * sizeof(float)); - } -} - -Resampler::D::~D() -{ - src_delete(m_src); - if (m_iinsize > 0) { - free(m_iin); - } - if (m_ioutsize > 0) { - free(m_iout); - } -} - -sv_frame_t -Resampler::D::resample(float **in, float **out, - sv_frame_t incount, double ratio, - bool final) -{ - if (m_channels == 1) { - return resampleInterleaved(*in, *out, incount, ratio, final); - } - - sv_frame_t outcount = lrint(ceil(double(incount) * ratio)); - - if (incount * m_channels > m_iinsize) { - m_iinsize = incount * m_channels; - m_iin = (float *)realloc(m_iin, m_iinsize * sizeof(float)); - } - if (outcount * m_channels > m_ioutsize) { - m_ioutsize = outcount * m_channels; - m_iout = (float *)realloc(m_iout, m_ioutsize * sizeof(float)); - } - for (sv_frame_t i = 0; i < incount; ++i) { - for (int c = 0; c < m_channels; ++c) { - m_iin[i * m_channels + c] = in[c][i]; - } - } - - sv_frame_t gen = resampleInterleaved(m_iin, m_iout, incount, ratio, final); - - for (sv_frame_t i = 0; i < gen; ++i) { - for (int c = 0; c < m_channels; ++c) { - out[c][i] = m_iout[i * m_channels + c]; - } - } - - return gen; -} - -sv_frame_t -Resampler::D::resampleInterleaved(float *in, float *out, - sv_frame_t incount, double ratio, - bool final) -{ - SRC_DATA data; - - sv_frame_t outcount = lrint(ceil(double(incount) * ratio)); - - data.data_in = in; - data.data_out = out; - data.input_frames = incount; - data.output_frames = outcount; - data.src_ratio = ratio; - data.end_of_input = (final ? 1 : 0); - - int err = src_process(m_src, &data); - - if (err) { - cerr << "Resampler: ERROR: src_process returned error: " << - src_strerror(err) << endl; - return 0; - } - - if (data.input_frames_used != incount) { - cerr << "Resampler: NOTE: input_frames_used == " << data.input_frames_used << " (while incount = " << incount << ")" << endl; - } - - return data.output_frames_gen; -} - -void -Resampler::D::reset() -{ - src_reset(m_src); -} - -Resampler::Resampler(Quality quality, int channels, sv_frame_t chunkSize) -{ - m_d = new D(quality, channels, chunkSize); -} - -Resampler::~Resampler() -{ - delete m_d; -} - -sv_frame_t -Resampler::resample(float **in, float **out, - sv_frame_t incount, double ratio, - bool final) -{ - return m_d->resample(in, out, incount, ratio, final); -} - -sv_frame_t -Resampler::resampleInterleaved(float *in, float *out, - sv_frame_t incount, double ratio, - bool final) -{ - return m_d->resampleInterleaved(in, out, incount, ratio, final); -} - -void -Resampler::reset() -{ - m_d->reset(); -} -
--- a/data/fileio/CodedAudioFileReader.cpp Mon Dec 05 16:39:03 2016 +0000 +++ b/data/fileio/CodedAudioFileReader.cpp Mon Dec 05 16:54:19 2016 +0000 @@ -20,9 +20,10 @@ #include "base/Exceptions.h" #include "base/Profiler.h" #include "base/Serialiser.h" -#include "base/Resampler.h" #include "base/StorageAdviser.h" +#include <bqresample/Resampler.h> + #include <stdint.h> #include <iostream> #include <QDir> @@ -142,9 +143,10 @@ } if (m_fileRate != m_sampleRate) { SVDEBUG << "CodedAudioFileReader: resampling " << m_fileRate << " -> " << m_sampleRate << endl; - m_resampler = new Resampler(Resampler::FastestTolerable, - m_channelCount, - m_cacheWriteBufferSize); + m_resampler = new breakfastquay::Resampler + (breakfastquay::Resampler::FastestTolerable, + m_channelCount, + m_cacheWriteBufferSize); double ratio = m_sampleRate / m_fileRate; m_resampleBuffer = new float [lrint(ceil(double(m_cacheWriteBufferSize) * m_channelCount * ratio + 1))];
--- a/data/fileio/CodedAudioFileReader.h Mon Dec 05 16:39:03 2016 +0000 +++ b/data/fileio/CodedAudioFileReader.h Mon Dec 05 16:54:19 2016 +0000 @@ -24,7 +24,10 @@ class WavFileReader; class Serialiser; -class Resampler; + +namespace breakfastquay { + class Resampler; +} class CodedAudioFileReader : public AudioFileReader { @@ -105,7 +108,7 @@ sv_frame_t m_cacheWriteBufferIndex; // samples sv_frame_t m_cacheWriteBufferSize; // frames - Resampler *m_resampler; + breakfastquay::Resampler *m_resampler; float *m_resampleBuffer; sv_frame_t m_fileFrameCount;
--- a/files.pri Mon Dec 05 16:39:03 2016 +0000 +++ b/files.pri Mon Dec 05 16:54:19 2016 +0000 @@ -23,7 +23,6 @@ base/RangeMapper.h \ base/RealTime.h \ base/RecentFiles.h \ - base/Resampler.h \ base/ResourceFinder.h \ base/RingBuffer.h \ base/Scavenger.h \ @@ -159,7 +158,6 @@ base/RangeMapper.cpp \ base/RealTimeSV.cpp \ base/RecentFiles.cpp \ - base/ResamplerSV.cpp \ base/ResourceFinder.cpp \ base/Selection.cpp \ base/Serialiser.cpp \