From 5a3bce7498aea568cb6eb83d04313f8d777e8c94 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 18 Oct 2022 01:47:43 -0400 Subject: basic voice gate --- src/abaddon.cpp | 4 ++++ src/audio/manager.cpp | 6 ++++++ src/audio/manager.hpp | 4 ++++ src/windows/voicewindow.cpp | 12 ++++++++++++ src/windows/voicewindow.hpp | 5 +++++ 5 files changed, 31 insertions(+) (limited to 'src') diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 701a3f1..45fca80 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -430,6 +430,10 @@ void Abaddon::OnVoiceConnected() { m_audio->SetPlayback(!is_deaf); }); + wnd->signal_gate().connect([this](double gate) { + m_audio->SetCaptureGate(gate); + }); + wnd->signal_mute_user_cs().connect([this](Snowflake id, bool is_mute) { if (const auto ssrc = m_discord.GetSSRCOfUser(id); ssrc.has_value()) { m_audio->SetMuteSSRC(*ssrc, is_mute); diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp index 5bcc3bb..7416ff7 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -176,6 +176,10 @@ void AudioManager::SetPlayback(bool playback) { m_should_playback = playback; } +void AudioManager::SetCaptureGate(double gate) { + m_capture_gate = gate * 0.01; +} + void AudioManager::SetMuteSSRC(uint32_t ssrc, bool mute) { std::lock_guard _(m_mutex); if (mute) { @@ -197,6 +201,8 @@ void AudioManager::OnCapturedPCM(const int16_t *pcm, ma_uint32 frames) { UpdateCaptureVolume(pcm, frames); + if (m_capture_peak_meter / 32768.0 < m_capture_gate) return; + int payload_len = opus_encode(m_encoder, pcm, 480, static_cast(m_opus_buffer), 1275); if (payload_len < 0) { printf("encoding error: %d\n", payload_len); diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp index 43d8a1e..67241fb 100644 --- a/src/audio/manager.hpp +++ b/src/audio/manager.hpp @@ -30,6 +30,8 @@ public: void SetCapture(bool capture); void SetPlayback(bool playback); + void SetCaptureGate(double gate); + void SetMuteSSRC(uint32_t ssrc, bool mute); void SetVolumeSSRC(uint32_t ssrc, double volume); @@ -71,6 +73,8 @@ private: std::atomic m_should_capture = true; std::atomic m_should_playback = true; + std::atomic m_capture_gate = 0.0; + std::unordered_set m_muted_ssrcs; std::unordered_map m_volume_ssrc; diff --git a/src/windows/voicewindow.cpp b/src/windows/voicewindow.cpp index 0e42f32..596f502 100644 --- a/src/windows/voicewindow.cpp +++ b/src/windows/voicewindow.cpp @@ -101,11 +101,19 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) m_scroll.set_hexpand(true); m_scroll.set_vexpand(true); + m_capture_gate.set_range(0.0, 100.0); + m_capture_gate.set_value_pos(Gtk::POS_LEFT); + m_capture_gate.set_value(0.0); + m_capture_gate.signal_value_changed().connect([this]() { + m_signal_gate.emit(m_capture_gate.get_value()); + }); + m_scroll.add(m_user_list); m_controls.add(m_mute); m_controls.add(m_deafen); m_main.add(m_controls); m_main.add(m_capture_volume); + m_main.add(m_capture_gate); m_main.add(m_scroll); add(m_main); show_all_children(); @@ -176,6 +184,10 @@ VoiceWindow::type_signal_deafen VoiceWindow::signal_deafen() { return m_signal_deafen; } +VoiceWindow::type_signal_gate VoiceWindow::signal_gate() { + return m_signal_gate; +} + VoiceWindow::type_signal_mute_user_cs VoiceWindow::signal_mute_user_cs() { return m_signal_mute_user_cs; } diff --git a/src/windows/voicewindow.hpp b/src/windows/voicewindow.hpp index d28a0cd..5f5436b 100644 --- a/src/windows/voicewindow.hpp +++ b/src/windows/voicewindow.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,7 @@ private: Gtk::ListBox m_user_list; Gtk::ProgressBar m_capture_volume; + Gtk::Scale m_capture_gate; Snowflake m_channel_id; @@ -48,17 +50,20 @@ private: public: using type_signal_mute = sigc::signal; using type_signal_deafen = sigc::signal; + using type_signal_gate = sigc::signal; using type_signal_mute_user_cs = sigc::signal; using type_signal_user_volume_changed = sigc::signal; type_signal_mute signal_mute(); type_signal_deafen signal_deafen(); + type_signal_gate signal_gate(); type_signal_mute_user_cs signal_mute_user_cs(); type_signal_user_volume_changed signal_user_volume_changed(); private: type_signal_mute m_signal_mute; type_signal_deafen m_signal_deafen; + type_signal_gate m_signal_gate; type_signal_mute_user_cs m_signal_mute_user_cs; type_signal_user_volume_changed m_signal_user_volume_changed; }; -- cgit v1.2.3