summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-10-18 01:47:43 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2022-10-18 01:47:43 -0400
commit5a3bce7498aea568cb6eb83d04313f8d777e8c94 (patch)
tree10705b9279e50b952a7213421ac7b1b03704beb9 /src
parent621beb13444eb3ca16a756bfb8fdc6b4f79723f5 (diff)
downloadabaddon-portaudio-5a3bce7498aea568cb6eb83d04313f8d777e8c94.tar.gz
abaddon-portaudio-5a3bce7498aea568cb6eb83d04313f8d777e8c94.zip
basic voice gate
Diffstat (limited to 'src')
-rw-r--r--src/abaddon.cpp4
-rw-r--r--src/audio/manager.cpp6
-rw-r--r--src/audio/manager.hpp4
-rw-r--r--src/windows/voicewindow.cpp12
-rw-r--r--src/windows/voicewindow.hpp5
5 files changed, 31 insertions, 0 deletions
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<std::mutex> _(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<unsigned char *>(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<bool> m_should_capture = true;
std::atomic<bool> m_should_playback = true;
+ std::atomic<double> m_capture_gate = 0.0;
+
std::unordered_set<uint32_t> m_muted_ssrcs;
std::unordered_map<uint32_t, double> 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 <gtkmm/checkbutton.h>
#include <gtkmm/listbox.h>
#include <gtkmm/progressbar.h>
+#include <gtkmm/scale.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/window.h>
#include <unordered_set>
@@ -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<void(bool)>;
using type_signal_deafen = sigc::signal<void(bool)>;
+ using type_signal_gate = sigc::signal<void(double)>;
using type_signal_mute_user_cs = sigc::signal<void(Snowflake, bool)>;
using type_signal_user_volume_changed = sigc::signal<void(Snowflake, double)>;
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;
};