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