From ed8479873c02f36eefb7d3b5f0c53e06c71aabd4 Mon Sep 17 00:00:00 2001 From: badaix Date: Sun, 12 Jan 2020 14:29:46 +0100 Subject: [PATCH] Use soxr_process instead of soxr_oneshot --- client/stream.cpp | 62 ++++++++++++++++++++++++++++++++--------------- client/stream.hpp | 3 ++- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/client/stream.cpp b/client/stream.cpp index 85e86a8a..44218865 100644 --- a/client/stream.cpp +++ b/client/stream.cpp @@ -38,6 +38,7 @@ Stream::Stream(const SampleFormat& sampleFormat) input_rate_ = format_.rate; format_.rate = 48000; + output_rate_ = static_cast(format_.rate); /* 48000 x ------- = ----- @@ -47,12 +48,14 @@ Stream::Stream(const SampleFormat& sampleFormat) */ // setRealSampleRate(format_.rate); - // double const irate = 48000.; - // double const orate = 44100.; - // soxr_error_t error; - // soxr_io_spec_t iospec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I); - // soxr_t soxr = soxr_create(static_cast(format_.rate), orate, format_.channels, &error, /* To report any error during creation. */ - // &iospec, NULL, NULL); + soxr_error_t error; + soxr_io_spec_t iospec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I); + soxr_quality_spec_t q_spec = soxr_quality_spec(SOXR_HQ, 0); + soxr_ = soxr_create(static_cast(input_rate_), static_cast(format_.rate), format_.channels, &error, &iospec, &q_spec, NULL); + if (error) + { + LOG(ERROR) << "Error soxr_create: " << error << "\n"; + } } @@ -86,20 +89,39 @@ void Stream::addChunk(msg::PcmChunk* chunk) while (chunks_.size() * chunk->duration().count() > 10000) chunks_.pop(); - size_t idone; - size_t odone; - auto out = new msg::PcmChunk(format_, 0); - out->timestamp = chunk->timestamp; - out->payloadSize = ceil(chunk->payloadSize * static_cast(format_.rate) / static_cast(input_rate_)); - out->payload = (char*)malloc(out->payloadSize); - soxr_io_spec_t iospec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I); - soxr_quality_spec_t q_spec = soxr_quality_spec(SOXR_HQ, 0); - auto error = soxr_oneshot(static_cast(input_rate_), static_cast(format_.rate), format_.channels, chunk->payload, chunk->getFrameCount(), &idone, out->payload, out->payloadSize, &odone, &iospec, &q_spec, nullptr); - out->payloadSize = odone * out->format.frameSize; - //LOG(INFO) << "Resample idone: " << idone << "/" << chunk->getFrameCount() << ", odone: " << odone << "/" << out->payloadSize / out->format.frameSize << "\n"; - delete chunk; - chunks_.push(shared_ptr(out)); - // LOG(DEBUG) << "new chunk: " << chunk->duration().count() << ", Chunks: " << chunks_.size() << "\n"; + if (std::abs(input_rate_ - output_rate_) <= 0.0000001) + { + chunks_.push(shared_ptr(chunk)); + } + else + { + size_t idone; + size_t odone; + auto out = new msg::PcmChunk(format_, 0); + out->timestamp = chunk->timestamp; + out->payloadSize = ceil(chunk->payloadSize * static_cast(output_rate_) / static_cast(input_rate_)); + out->payload = (char*)malloc(out->payloadSize); + + soxr_io_spec_t iospec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I); + soxr_quality_spec_t q_spec = soxr_quality_spec(SOXR_HQ, 0); + // auto error = soxr_oneshot(static_cast(input_rate_), output_rate_, format_.channels, chunk->payload, chunk->getFrameCount(), &idone, + // out->payload, out->payloadSize, &odone, &iospec, &q_spec, nullptr); + auto error = soxr_process(soxr_, chunk->payload, chunk->getFrameCount(), &idone, out->payload, out->getFrameCount(), &odone); + if (error) + { + LOG(ERROR) << "Error soxr_process: " << error << "\n"; + delete out; + } + else + { + out->payloadSize = odone * out->format.frameSize; + LOG(TRACE) << "Resample idone: " << idone << "/" << chunk->getFrameCount() << ", odone: " << odone << "/" + << out->payloadSize / out->format.frameSize << "\n"; + chunks_.push(shared_ptr(out)); + } + delete chunk; + } + LOG(TRACE) << "new chunk: " << chunk->duration().count() << ", Chunks: " << chunks_.size() << "\n"; } diff --git a/client/stream.hpp b/client/stream.hpp index 2b5bb631..74d0924e 100644 --- a/client/stream.hpp +++ b/client/stream.hpp @@ -85,7 +85,8 @@ private: long correctAfterXFrames_; chronos::msec bufferMs_; size_t input_rate_; - //soxr_t soxr_; + double output_rate_; + soxr_t soxr_; };