From 10e46cbbbc2351c99da9b60dd253dce5b46bcd15 Mon Sep 17 00:00:00 2001 From: Hubert Chrzaniuk Date: Tue, 22 Dec 2020 17:22:15 +0100 Subject: [PATCH] [EGD-5061] Fix lack of audio during call Audio might have not work if audio streams were reused. This was fixed by introducing proper cleaning procedures. --- changelog.md | 1 + module-audio/Audio/Operation/PlaybackOperation.cpp | 3 +++ module-audio/Audio/Operation/RouterOperation.cpp | 2 ++ module-audio/Audio/Stream.cpp | 13 +++++++++++++ module-audio/Audio/Stream.hpp | 2 ++ .../board/rt1051/bsp/audio/RT1051Audiocodec.cpp | 6 ++++++ .../board/rt1051/bsp/audio/RT1051CellularAudio.cpp | 6 ++++++ 7 files changed, 33 insertions(+) diff --git a/changelog.md b/changelog.md index 19c0d57ab01866dc22ce16f1bbf510a8e4cee7fa..184116177326eea8150cb9bf9f94832bef63aa9b 100644 --- a/changelog.md +++ b/changelog.md @@ -17,6 +17,7 @@ * Fix auto unlock screen on idle * Fix missing texts for ApplicationDesktop windows +* Fix no audio during call ### Changed diff --git a/module-audio/Audio/Operation/PlaybackOperation.cpp b/module-audio/Audio/Operation/PlaybackOperation.cpp index 4a9edca0b20e46ec0461fdbdda9e45826ce35518..df31c58b33b5360456dea18f1c9196688cfd0914 100644 --- a/module-audio/Audio/Operation/PlaybackOperation.cpp +++ b/module-audio/Audio/Operation/PlaybackOperation.cpp @@ -58,6 +58,7 @@ namespace audio operationToken = token; assert(dataStreamOut); + dec->startDecodingWorker(*dataStreamOut, endOfFileCallback); if (!tags) { @@ -196,6 +197,8 @@ namespace audio PlaybackOperation::~PlaybackOperation() { Stop(); + dataStreamOut->reset(); + dataStreamIn->reset(); } } // namespace audio diff --git a/module-audio/Audio/Operation/RouterOperation.cpp b/module-audio/Audio/Operation/RouterOperation.cpp index e17a83f71b683f64c4b9700cb39b72613f1c9035..8fa8f716a0209f9bee4e6badb607d081ffe56fea 100644 --- a/module-audio/Audio/Operation/RouterOperation.cpp +++ b/module-audio/Audio/Operation/RouterOperation.cpp @@ -88,6 +88,8 @@ namespace audio state = State::Idle; audioDevice->Stop(); audioDeviceCellular->Stop(); + dataStreamOut->reset(); + dataStreamIn->reset(); return RetCode::Success; } diff --git a/module-audio/Audio/Stream.cpp b/module-audio/Audio/Stream.cpp index e0b12b3d11aa4e96018cb6271a04a6fa348f15b3..72d18f0844132d33d3a3233882fc1f548225dd69 100644 --- a/module-audio/Audio/Stream.cpp +++ b/module-audio/Audio/Stream.cpp @@ -245,6 +245,19 @@ bool Stream::blocksAvailable() const noexcept return !isEmpty(); } +void Stream::reset() +{ + _dataStart = {_buffer.get(), _blockSize * _blockCount, _buffer.get(), _blockSize}; + _dataEnd = _dataStart; + _peekPosition = _dataStart; + _writeReservationPosition = _dataStart; + std::fill(_emptyBuffer.get(), _emptyBuffer.get() + _blockSize, 0); + + _blocksUsed = 0; + _peekCount = 0; + _reserveCount = 0; +} + Stream::UniqueStreamBuffer StandardStreamAllocator::allocate(std::size_t size) { return std::make_unique(size); diff --git a/module-audio/Audio/Stream.hpp b/module-audio/Audio/Stream.hpp index 082054ebe3d348b5d486171058aa0d09224eefcf..18d3b93fd7c429ce9451d6b562dd2bf8b1907671 100644 --- a/module-audio/Audio/Stream.hpp +++ b/module-audio/Audio/Stream.hpp @@ -101,6 +101,8 @@ namespace audio /// get empty data span Span getNullSpan() const noexcept; + void reset(); + [[nodiscard]] std::size_t getBlockSize() const noexcept; [[nodiscard]] std::size_t getBlockCount() const noexcept; [[nodiscard]] std::size_t getUsedBlockCount() const noexcept; diff --git a/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp b/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp index 32f88b03b5421b0c44df47644751cacd3a893f7c..fef3c532bec56bfad2d83f167f26d6c95185f55f 100644 --- a/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp +++ b/module-bsp/board/rt1051/bsp/audio/RT1051Audiocodec.cpp @@ -297,6 +297,9 @@ namespace bsp SAI_TransferTerminateSendEDMA(BOARD_AUDIOCODEC_SAIx, &txHandle); } memset(&txHandle, 0, sizeof(txHandle)); + if (sink.isConnected()) { + sink.getStream()->unpeek(); + } } void RT1051Audiocodec::InStop() @@ -306,6 +309,9 @@ namespace bsp SAI_TransferAbortReceiveEDMA(BOARD_AUDIOCODEC_SAIx, &rxHandle); } memset(&rxHandle, 0, sizeof(rxHandle)); + if (source.isConnected()) { + source.getStream()->release(); + } } void rxAudioCodecCallback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData) diff --git a/module-bsp/board/rt1051/bsp/audio/RT1051CellularAudio.cpp b/module-bsp/board/rt1051/bsp/audio/RT1051CellularAudio.cpp index 1199ad0c22d063f7966ddbce1f7f3153749365d1..d422b2b6500a07743a7827d7f4eb5702e14254d9 100644 --- a/module-bsp/board/rt1051/bsp/audio/RT1051CellularAudio.cpp +++ b/module-bsp/board/rt1051/bsp/audio/RT1051CellularAudio.cpp @@ -259,6 +259,9 @@ namespace bsp SAI_TransferTerminateSendEDMA(BOARD_CELLULAR_AUDIO_SAIx, &txHandle); } memset(&txHandle, 0, sizeof(txHandle)); + if (sink.isConnected()) { + sink.getStream()->unpeek(); + } } void RT1051CellularAudio::InStop() @@ -268,6 +271,9 @@ namespace bsp SAI_TransferAbortReceiveEDMA(BOARD_CELLULAR_AUDIO_SAIx, &rxHandle); } memset(&rxHandle, 0, sizeof(rxHandle)); + if (source.isConnected()) { + source.getStream()->release(); + } } void rxCellularCallback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData)