summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/manager.cpp16
-rw-r--r--src/audio/manager.hpp7
2 files changed, 22 insertions, 1 deletions
diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp
index 35a9c76..e025390 100644
--- a/src/audio/manager.cpp
+++ b/src/audio/manager.cpp
@@ -1,5 +1,6 @@
#ifdef WITH_VOICE
- // clang-format off
+// clang-format off
+
#ifdef _WIN32
#include <winsock2.h>
#endif
@@ -138,6 +139,10 @@ void AudioManager::SetOpusBuffer(uint8_t *ptr) {
void AudioManager::FeedMeOpus(uint32_t ssrc, const std::vector<uint8_t> &data) {
if (!m_should_playback) return;
+ {
+ std::lock_guard<std::mutex> _(m_muted_ssrc_mutex);
+ if (m_muted_ssrcs.find(ssrc) != m_muted_ssrcs.end()) return;
+ }
size_t payload_size = 0;
const auto *opus_encoded = StripRTPExtensionHeader(data.data(), static_cast<int>(data.size()), payload_size);
@@ -162,6 +167,15 @@ void AudioManager::SetPlayback(bool playback) {
m_should_playback = playback;
}
+void AudioManager::SetMuteSSRC(uint32_t ssrc, bool mute) {
+ std::lock_guard<std::mutex> _(m_muted_ssrc_mutex);
+ if (mute) {
+ m_muted_ssrcs.insert(ssrc);
+ } else {
+ m_muted_ssrcs.erase(ssrc);
+ }
+}
+
void AudioManager::OnCapturedPCM(const int16_t *pcm, ma_uint32 frames) {
if (m_opus_buffer == nullptr || !m_should_capture) return;
diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp
index 4986da6..277f2f3 100644
--- a/src/audio/manager.hpp
+++ b/src/audio/manager.hpp
@@ -8,6 +8,7 @@
#include <mutex>
#include <thread>
#include <unordered_map>
+#include <unordered_set>
#include <vector>
#include <miniaudio.h>
#include <opus.h>
@@ -29,6 +30,8 @@ public:
void SetCapture(bool capture);
void SetPlayback(bool playback);
+ void SetMuteSSRC(uint32_t ssrc, bool mute);
+
[[nodiscard]] bool OK() const;
private:
@@ -58,6 +61,10 @@ private:
std::atomic<bool> m_should_capture = true;
std::atomic<bool> m_should_playback = true;
+ std::unordered_set<uint32_t> m_muted_ssrcs;
+
+ mutable std::mutex m_muted_ssrc_mutex;
+
public:
using type_signal_opus_packet = sigc::signal<void(int payload_size)>;
type_signal_opus_packet signal_opus_packet();