From: bruceperens Date: Fri, 30 May 2014 18:40:25 +0000 (+0000) Subject: Interpolator defined out until I can bring in libsoxr. X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=1140694fefeb5d20d8f52fdf213196d50efe4d67;p=freetel-svn-tracking.git Interpolator defined out until I can bring in libsoxr. git-svn-id: https://svn.code.sf.net/p/freetel/code@1619 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/freedv-server/CMakeLists.txt b/freedv-server/CMakeLists.txt index b302a61e..bb4c5725 100644 --- a/freedv-server/CMakeLists.txt +++ b/freedv-server/CMakeLists.txt @@ -136,6 +136,7 @@ set(Compile.sources source/framer_noop.cpp source/global.cpp source/interfaces.cpp + source/interpolator.cpp source/io_device.cpp source/keying.cpp source/keying_sink.cpp diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index 12ee40a4..fa39e121 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -8,6 +8,9 @@ #include #include #include +#if 0 +#include +#endif #include "platform.h" /// Portable way to use the [[unused]] C++11 attribute before all compilers @@ -1027,4 +1030,33 @@ operator << (std::ostream & stream, const DriverManager & d) { /// Global reference to the driver manager. /// extern DriverManager * driver_manager(); + +#if 0 +/// Interpolate between two sample rates. +class Interpolator16 { +private: + const std::size_t in_rate; + const std::size_t out_rate; + const unsigned int number_of_channels; + const soxr_io_spec_t io_spec; + const soxr_quality_spec_t quality_spec; + const soxr_runtime_spec_t runtime_spec; + + // Prohibit the copy constructor and operator =(). + Interpolator16(const Interpolator16 &); + Interpolator16 & + operator = (const Interpolator &); + +public + Interpolator16(std::size_t _in_rate, std::size_t _out_rate); + ~Interpolator16(); + + void process( + const std::int16_t * in, + std::int16_t * out, + std::size_t in_length, + std::size_t out_length); +} +#endif + } diff --git a/freedv-server/source/interpolate.cpp b/freedv-server/source/interpolate.cpp deleted file mode 100644 index 0c10128f..00000000 --- a/freedv-server/source/interpolate.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#if 0 -#include -#include "drivers.h" - -namespace FreeDV { - void - Interpolate16( - const std::int16_t * in, - std::int16_t * out, - std::size_t in_rate, - std::size_t out_rate, - std::size_t in_length, - std::size_t out_length) - { - std::size_t in_done = 0; - std::size_t out_done = 0; - const unsigned int number_of_channels = 1; - const soxr_io_spec_t io_spec = soxr_io_spec(SOXR_INT16_S, SOXR_INT16_S); - const soxr_quality_spec_t quality_spec = soxr_quality_spec( - SOXR_QQ, SOXR_NO_DITHER); - const soxr_runtime_spec_t runtime_spec = soxr_runtime_spec(1); - - /// The "Gibbs effect" may be seen because I don't save data from the - /// previous block. Fix this by making the resampler a class, - /// instantiate it to save state, and use the iterative rather than the - /// one-shot version. - const soxr_error_t error = soxr_oneshot( - in_rate, - out_rate, - number_of_channels, // Number of channels. - in, - in_length, - &in_done, - out, - out_length, - &out_done, - io_spec, - quality_spec, - runtime_spec); - } -}; -#endif diff --git a/freedv-server/source/interpolator.cpp b/freedv-server/source/interpolator.cpp new file mode 100644 index 00000000..15e5afc9 --- /dev/null +++ b/freedv-server/source/interpolator.cpp @@ -0,0 +1,45 @@ +#include "drivers.h" + +#if 0 +namespace FreeDV { + Interpolator16::Interpolator16(std::size_t _in_rate, std::size_t _out_rate) + : in_rate(_in_rate), out_rate(_out_rate), number_of_channels(1), + io_spec(soxr_io_spec(SOXR_INT16_S, SOXR_INT16_S), + quality_spec(SOXR_QQ, SOXR_NO_DITHER), + runtime_spec(soxr_runtime_spec(1)) + { + } + + Interpolator16::~Interpolator16() + { + }; + + void + Interpolator16::process( + const std::int16_t * in, + std::int16_t * out, + std::size_t in_length, + std::size_t out_length) + { + std::size_t in_done = 0; + std::size_t out_done = 0; + + // FIX: Use the state-saving version instead of the one-shot version, + // to prevent ringing. Is there a pipeline delay? + + const soxr_error_t error = soxr_oneshot( + in_rate, + out_rate, + number_of_channels, // Number of channels. + in, + in_length, + &in_done, + out, + out_length, + &out_done, + io_spec, + quality_spec, + runtime_spec); + } +}; +#endif