From e993a0b9289ff7fb1c07a3ba153d92e5e025b836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Smoczy=C5=84ski?= Date: Wed, 27 Oct 2021 15:04:29 +0200 Subject: [PATCH] [EGD-6857] Fix HSP audio quality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed HSP sound quality issues: - fixed HF caused by invalid output block size during interpolation of the bluetooth input, - increased block size to increase time send interval to 8ms Fixed issue with error handling when writing to overflowed stream. Signed-off-by: Marcin SmoczyƄski --- module-audio/Audio/StreamFactory.cpp | 2 +- module-audio/Audio/StreamFactory.hpp | 2 +- .../Audio/test/unittest_transcode.cpp | 6 +++-- .../Audio/transcode/BasicInterpolator.hpp | 8 +++++-- .../Audio/transcode/InputTranscodeProxy.cpp | 22 ++++++++++++++----- .../Bluetooth/audio/BluetoothAudioDevice.cpp | 2 +- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/module-audio/Audio/StreamFactory.cpp b/module-audio/Audio/StreamFactory.cpp index 942ead7ab2e7994ca9207e8be451ad7d72600a50..bc2e48bfe6a755b36390b56f76086308590afd45 100644 --- a/module-audio/Audio/StreamFactory.cpp +++ b/module-audio/Audio/StreamFactory.cpp @@ -84,7 +84,7 @@ auto StreamFactory::makeStream(Source &source, Sink &sink, AudioFormat streamFor auto StreamFactory::makeInputTranscodingStream(Source &source, Sink &sink, AudioFormat streamFormat, - std::shared_ptr(transform)) + std::shared_ptr transform) -> std::unique_ptr { auto sourceTraits = source.getTraits(); diff --git a/module-audio/Audio/StreamFactory.hpp b/module-audio/Audio/StreamFactory.hpp index e9ca223b030c439bfd6326f0954ee8bffa761787..70250dcd177114657546abd4461bad78bda4af2d 100644 --- a/module-audio/Audio/StreamFactory.hpp +++ b/module-audio/Audio/StreamFactory.hpp @@ -26,7 +26,7 @@ namespace audio auto makeInputTranscodingStream(Source &source, Sink &sink, AudioFormat streamFormat, - std::shared_ptr(transform)) + std::shared_ptr transform) -> std::unique_ptr; private: diff --git a/module-audio/Audio/test/unittest_transcode.cpp b/module-audio/Audio/test/unittest_transcode.cpp index c3bc064d5951fb15b27b00c66beec3f74219323c..9b68c653a08b170df14968f489dda7aa6cc0a196 100644 --- a/module-audio/Audio/test/unittest_transcode.cpp +++ b/module-audio/Audio/test/unittest_transcode.cpp @@ -347,9 +347,11 @@ TEST(Transform, BasicInterpolator) std::uint16_t inputBuffer[8] = {1, 2, 3, 4, 0, 0, 0, 0}; static const uint16_t expectBuffer[8] = {1, 2, 1, 2, 3, 4, 3, 4}; - auto inputSpan = ::audio::AbstractStream::Span{.data = reinterpret_cast(inputBuffer), + auto inputSpan = ::audio::AbstractStream::Span{.data = reinterpret_cast(inputBuffer), .dataSize = 4 * sizeof(std::uint16_t)}; - auto outputSpan = interp2.transform(inputSpan, inputSpan); + auto transformSpace = ::audio::AbstractStream::Span{.data = reinterpret_cast(inputBuffer), + .dataSize = 8 * sizeof(std::uint16_t)}; + auto outputSpan = interp2.transform(inputSpan, transformSpace); EXPECT_EQ(outputSpan.dataSize, sizeof(uint16_t) * 8); EXPECT_EQ(memcmp(outputSpan.data, expectBuffer, outputSpan.dataSize), 0); diff --git a/module-audio/Audio/transcode/BasicInterpolator.hpp b/module-audio/Audio/transcode/BasicInterpolator.hpp index de746c07acef5a32cbfce22960799241a5417013..789fd8f7128be967299e8a672b7bd8d4a41db00c 100644 --- a/module-audio/Audio/transcode/BasicInterpolator.hpp +++ b/module-audio/Audio/transcode/BasicInterpolator.hpp @@ -9,6 +9,7 @@ #include +#include #include namespace audio::transcode @@ -33,8 +34,9 @@ namespace audio::transcode /** * @brief Integer type to be used to read and write data from/to a buffer. */ - using IntegerType = typename decltype( - utils::integer::getIntegerType())::type; + using IntegerType = + typename decltype(utils::integer::getIntegerType())::type; public: auto transformBlockSize(std::size_t blockSize) const noexcept -> std::size_t override @@ -64,6 +66,8 @@ namespace audio::transcode IntegerType *input = reinterpret_cast(inputSpan.data); IntegerType *output = reinterpret_cast(outputSpan.data); + assert(outputSpan.dataSize <= transformSpace.dataSize); + for (unsigned i = inputSpan.dataSize / sizeof(IntegerType); i > 0; i--) { for (unsigned j = 1; j <= Ratio; j++) { output[i * Ratio - j] = input[i - 1]; diff --git a/module-audio/Audio/transcode/InputTranscodeProxy.cpp b/module-audio/Audio/transcode/InputTranscodeProxy.cpp index 1d88525a88e6cf6c605ada2f0cf12e7cc132fc39..f13c8f74bc4c5dda2a6e7199f5a5772819fe36d3 100644 --- a/module-audio/Audio/transcode/InputTranscodeProxy.cpp +++ b/module-audio/Audio/transcode/InputTranscodeProxy.cpp @@ -20,7 +20,16 @@ InputTranscodeProxy::InputTranscodeProxy(std::shared_ptr wrapped bool InputTranscodeProxy::push(const Span &span) { - return getWrappedStream().push(transform->transform(span, transcodingSpaceSpan)); + Span outputSpan; + + if (!getWrappedStream().reserve(outputSpan)) { + return false; + } + + transform->transform(span, outputSpan); + getWrappedStream().commit(); + + return true; } bool InputTranscodeProxy::push(void *data, std::size_t dataSize) @@ -38,13 +47,16 @@ void InputTranscodeProxy::commit() } } -bool InputTranscodeProxy::reserve(Span &span) +bool InputTranscodeProxy::reserve(Span &inputSpan) { + Span span; auto result = getWrappedStream().reserve(span); - reservedSpan = span; - span = transcodingSpaceSpan; - isReserved = true; + if (result) { + reservedSpan = span; + inputSpan = transcodingSpaceSpan; + isReserved = true; + } return result; } diff --git a/module-bluetooth/Bluetooth/audio/BluetoothAudioDevice.cpp b/module-bluetooth/Bluetooth/audio/BluetoothAudioDevice.cpp index 9f481ae293741c63a6f4761c6470c3f703d2e44b..cf18c8b12e336b658e8d7a3bd7fbdc316d21b833 100644 --- a/module-bluetooth/Bluetooth/audio/BluetoothAudioDevice.cpp +++ b/module-bluetooth/Bluetooth/audio/BluetoothAudioDevice.cpp @@ -266,7 +266,7 @@ auto A2DPAudioDevice::getTraits() const -> ::audio::Endpoint::Traits auto CVSDAudioDevice::getTraits() const -> ::audio::Endpoint::Traits { - return Traits{.usesDMA = false, .blockSizeConstraint = 32U, .timeConstraint = 16ms}; + return Traits{.usesDMA = false, .blockSizeConstraint = 128U, .timeConstraint = 16ms}; } auto A2DPAudioDevice::getSourceFormat() -> ::audio::AudioFormat