diff options
-rw-r--r-- | src/abaddon.cpp | 4 | ||||
-rw-r--r-- | src/audio/manager.cpp | 16 | ||||
-rw-r--r-- | src/audio/manager.hpp | 2 | ||||
-rw-r--r-- | src/windows/voicewindow.cpp | 13 | ||||
-rw-r--r-- | src/windows/voicewindow.hpp | 4 |
5 files changed, 37 insertions, 2 deletions
diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 45fca80..664c0bd 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -434,6 +434,10 @@ void Abaddon::OnVoiceConnected() { m_audio->SetCaptureGate(gate); }); + wnd->signal_gain().connect([this](double gain) { + m_audio->SetCaptureGain(gain); + }); + 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 60969cc..0461ee8 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -180,6 +180,10 @@ void AudioManager::SetCaptureGate(double gate) { m_capture_gate = gate * 0.01; } +void AudioManager::SetCaptureGain(double gain) { + m_capture_gain = gain; +} + void AudioManager::SetMuteSSRC(uint32_t ssrc, bool mute) { std::lock_guard<std::mutex> _(m_mutex); if (mute) { @@ -199,11 +203,19 @@ void AudioManager::SetVolumeSSRC(uint32_t ssrc, double volume) { void AudioManager::OnCapturedPCM(const int16_t *pcm, ma_uint32 frames) { if (m_opus_buffer == nullptr || !m_should_capture) return; - UpdateCaptureVolume(pcm, frames); + const double gain = m_capture_gain; + // i have a suspicion i can cast the const away... but i wont + std::vector<int16_t> new_pcm(pcm, pcm + frames * 2); + for (auto &val : new_pcm) { + const int32_t unclamped = static_cast<int32_t>(val * gain); + val = std::clamp(unclamped, INT16_MIN, INT16_MAX); + } + + UpdateCaptureVolume(new_pcm.data(), 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); + int payload_len = opus_encode(m_encoder, new_pcm.data(), 480, static_cast<unsigned char *>(m_opus_buffer), 1275); if (payload_len < 0) { printf("encoding error: %d\n", payload_len); } else { diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp index 67241fb..13dbfa4 100644 --- a/src/audio/manager.hpp +++ b/src/audio/manager.hpp @@ -31,6 +31,7 @@ public: void SetPlayback(bool playback); void SetCaptureGate(double gate); + void SetCaptureGain(double gain); void SetMuteSSRC(uint32_t ssrc, bool mute); void SetVolumeSSRC(uint32_t ssrc, double volume); @@ -74,6 +75,7 @@ private: std::atomic<bool> m_should_playback = true; std::atomic<double> m_capture_gate = 0.0; + std::atomic<double> m_capture_gain = 1.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 80a388e..9f53638 100644 --- a/src/windows/voicewindow.cpp +++ b/src/windows/voicewindow.cpp @@ -113,12 +113,21 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) m_capture_volume.SetTick(val / 100.0); }); + m_capture_gain.set_range(0.0, 200.0); + m_capture_gain.set_value_pos(Gtk::POS_LEFT); + m_capture_gain.set_value(100.0); + m_capture_gain.signal_value_changed().connect([this]() { + const double val = m_capture_gain.get_value(); + m_signal_gain.emit(val / 100.0); + }); + 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_capture_gain); m_main.add(m_scroll); add(m_main); show_all_children(); @@ -193,6 +202,10 @@ VoiceWindow::type_signal_gate VoiceWindow::signal_gate() { return m_signal_gate; } +VoiceWindow::type_signal_gate VoiceWindow::signal_gain() { + return m_signal_gain; +} + 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 86cedb8..8eb02f3 100644 --- a/src/windows/voicewindow.hpp +++ b/src/windows/voicewindow.hpp @@ -43,6 +43,7 @@ private: VolumeMeter m_capture_volume; Gtk::Scale m_capture_gate; + Gtk::Scale m_capture_gain; Snowflake m_channel_id; @@ -52,12 +53,14 @@ 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_gain = 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_gain signal_gain(); type_signal_mute_user_cs signal_mute_user_cs(); type_signal_user_volume_changed signal_user_volume_changed(); @@ -65,6 +68,7 @@ private: type_signal_mute m_signal_mute; type_signal_deafen m_signal_deafen; type_signal_gate m_signal_gate; + type_signal_gain m_signal_gain; type_signal_mute_user_cs m_signal_mute_user_cs; type_signal_user_volume_changed m_signal_user_volume_changed; }; |