From e3073efd46e17fc0eb74d62f56e5a9fd16cc920c Mon Sep 17 00:00:00 2001 From: Pierre Nicolas <pierre.nicolas@savoirfairelinux.com> Date: Thu, 19 Dec 2024 16:46:52 -0500 Subject: [PATCH] call: fix mute participant GitLab: #1089 Change-Id: I7f16e0ac1daca8a85770e778f350725fe54d2431 --- src/conference.cpp | 6 +++--- src/media/audio/ringbuffer.cpp | 8 ++++++++ src/media/audio/ringbuffer.h | 6 ++++++ src/media/audio/ringbufferpool.cpp | 11 +++++++++++ src/media/audio/ringbufferpool.h | 1 + 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/conference.cpp b/src/conference.cpp index c625f7144..911ba03fc 100644 --- a/src/conference.cpp +++ b/src/conference.cpp @@ -1813,7 +1813,7 @@ Conference::unbindHostAudio() } // Unbind audio if (source.label_ == sip_utils::DEFAULT_AUDIO_STREAMID) { - Manager::instance().getRingBufferPool().unBindAllHalfDuplexOut(RingBufferPool::DEFAULT_ID); + Manager::instance().getRingBufferPool().unBindAllHalfDuplexIn(RingBufferPool::DEFAULT_ID); } else { auto buffer = source.sourceUri_; static const std::string& sep = libjami::Media::VideoProtocolPrefix::SEPARATOR; @@ -1821,7 +1821,7 @@ Conference::unbindHostAudio() if (pos != std::string::npos) buffer = source.sourceUri_.substr(pos + sep.size()); - Manager::instance().getRingBufferPool().unBindAllHalfDuplexOut(buffer); + Manager::instance().getRingBufferPool().unBindAllHalfDuplexIn(buffer); } } } @@ -1874,7 +1874,7 @@ Conference::unbindSubCallAudio(const std::string& callId) auto medias = call->getAudioStreams(); auto& rbPool = Manager::instance().getRingBufferPool(); for (const auto& [id, muted] : medias) { - rbPool.unBindAllHalfDuplexOut(id); + rbPool.unBindAllHalfDuplexIn(id); } } } diff --git a/src/media/audio/ringbuffer.cpp b/src/media/audio/ringbuffer.cpp index 1eafdb754..2d3cf2b0d 100644 --- a/src/media/audio/ringbuffer.cpp +++ b/src/media/audio/ringbuffer.cpp @@ -65,6 +65,14 @@ RingBuffer::flushAll() offset.second.offset = endPos_; } +std::vector<std::string> RingBuffer::getSubscribers() { + std::vector<std::string> subscribers; + for (const auto &offset: readoffsets_) { + subscribers.push_back(offset.first); + } + return subscribers; +} + size_t RingBuffer::putLength() const { diff --git a/src/media/audio/ringbuffer.h b/src/media/audio/ringbuffer.h index 815b705a6..0ddfd12a1 100644 --- a/src/media/audio/ringbuffer.h +++ b/src/media/audio/ringbuffer.h @@ -61,6 +61,12 @@ public: void flushAll(); + /** + * Return the list of subscribers (Ring buffers Id that are reading this ring buffer). + */ + std::vector<std::string> + getSubscribers(); + inline AudioFormat getFormat() const { return format_; } inline void setFormat(const AudioFormat& format) diff --git a/src/media/audio/ringbufferpool.cpp b/src/media/audio/ringbufferpool.cpp index 1a2cc3d00..9ce8f847d 100644 --- a/src/media/audio/ringbufferpool.cpp +++ b/src/media/audio/ringbufferpool.cpp @@ -252,6 +252,17 @@ RingBufferPool::unBindAllHalfDuplexOut(const std::string& ringbufferId) } } +void +RingBufferPool::unBindAllHalfDuplexIn(const std::string &audioToDelete) { + + std::lock_guard lk(stateLock_); + const std::shared_ptr<RingBuffer> &ringBuffer = getRingBuffer(audioToDelete); + const std::vector<std::string> &subscribers = ringBuffer->getSubscribers(); + for (const auto &subscriber: subscribers) { + removeReaderFromRingBuffer(ringBuffer, subscriber); + } +} + void RingBufferPool::unBindAll(const std::string& ringbufferId) { diff --git a/src/media/audio/ringbufferpool.h b/src/media/audio/ringbufferpool.h index a5cebac94..ef3aed340 100644 --- a/src/media/audio/ringbufferpool.h +++ b/src/media/audio/ringbufferpool.h @@ -69,6 +69,7 @@ public: void unBindHalfDuplexOut(const std::string& process_id, const std::string& ringbufferId); void unBindAllHalfDuplexOut(const std::string& ringbufferId); + void unBindAllHalfDuplexIn(const std::string& ringbufferId); void unBindAll(const std::string& ringbufferId); -- GitLab