diff --git a/src/conference.cpp b/src/conference.cpp index c625f7144c91ffe98ecf6645ba877286f9b18ab7..911ba03fc37185981e1dce1e3525ad4202e28dee 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 1eafdb754095722b9941e548e0287cd51716a35e..2d3cf2b0db85bd2629d825ed1958c256fcad9cc6 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 815b705a60d483666ad3c4eca7304d91d2e9e343..0ddfd12a1c7bd59b4145847f6bac150c85d6c082 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 1a2cc3d0049ef503c488b24970729d4f9f34ee37..9ce8f847d0d3faa1b845ab1b7d06743e1f6fdb0d 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 a5cebac9438e599f52ca83b73ca91f7ef44282be..ef3aed3407553d5835358e8784d5b6cc10533c46 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);