summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2023-10-21 03:03:19 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2023-10-21 03:03:19 -0400
commit9a5e820f6d781fe003b5a8111906f9a3519bad2b (patch)
treef449dea695e9a35de4685f5acc4d98cf1b8df81c /src
parent893c9b5241220e89a8864476c90cc78bf2ca87bf (diff)
downloadabaddon-portaudio-9a5e820f6d781fe003b5a8111906f9a3519bad2b.tar.gz
abaddon-portaudio-9a5e820f6d781fe003b5a8111906f9a3519bad2b.zip
add mix mono option to voice window (closes #238)
Diffstat (limited to 'src')
-rw-r--r--src/audio/manager.cpp20
-rw-r--r--src/audio/manager.hpp4
-rw-r--r--src/windows/voicewindow.cpp7
-rw-r--r--src/windows/voicewindow.hpp1
4 files changed, 31 insertions, 1 deletions
diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp
index 739e835..0336699 100644
--- a/src/audio/manager.cpp
+++ b/src/audio/manager.cpp
@@ -419,13 +419,23 @@ void AudioManager::OnCapturedPCM(const int16_t *pcm, ma_uint32 frames) {
if (m_opus_buffer == nullptr || !m_should_capture) return;
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);
}
+ if (m_mix_mono) {
+ for (size_t i = 0; i < frames * 2; i += 2) {
+ const int sample_L = new_pcm[i];
+ const int sample_R = new_pcm[i + 1];
+ const int16_t mixed = static_cast<int16_t>((sample_L + sample_R) / 2);
+ new_pcm[i] = mixed;
+ new_pcm[i + 1] = mixed;
+ }
+ }
+
UpdateCaptureVolume(new_pcm.data(), frames);
static std::array<float, 480> denoised_L;
@@ -629,6 +639,14 @@ bool AudioManager::GetSuppressNoise() const {
}
#endif
+void AudioManager::SetMixMono(bool value) {
+ m_mix_mono = value;
+}
+
+bool AudioManager::GetMixMono() const {
+ return m_mix_mono;
+}
+
AudioManager::type_signal_opus_packet AudioManager::signal_opus_packet() {
return m_signal_opus_packet;
}
diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp
index 80a2542..5321cb5 100644
--- a/src/audio/manager.hpp
+++ b/src/audio/manager.hpp
@@ -87,6 +87,9 @@ public:
bool GetSuppressNoise() const;
#endif
+ void SetMixMono(bool value);
+ bool GetMixMono() const;
+
private:
void OnCapturedPCM(const int16_t *pcm, ma_uint32 frames);
@@ -144,6 +147,7 @@ private:
std::atomic<double> m_prob_threshold = 0.5;
std::atomic<float> m_vad_prob = 0.0;
std::atomic<bool> m_enable_noise_suppression = false;
+ std::atomic<bool> m_mix_mono = false;
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 73a09c2..16a9fed 100644
--- a/src/windows/voicewindow.cpp
+++ b/src/windows/voicewindow.cpp
@@ -89,6 +89,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
, m_mute("Mute")
, m_deafen("Deafen")
, m_noise_suppression("Suppress Noise")
+ , m_mix_mono("Mix Mono")
, m_channel_id(channel_id)
, m_menu_view("View")
, m_menu_view_settings("More _Settings", true) {
@@ -178,6 +179,11 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
Abaddon::Get().GetAudio().SetSuppressNoise(m_noise_suppression.get_active());
});
+ m_mix_mono.set_active(audio.GetMixMono());
+ m_mix_mono.signal_toggled().connect([this]() {
+ Abaddon::Get().GetAudio().SetMixMono(m_mix_mono.get_active());
+ });
+
auto *playback_renderer = Gtk::make_managed<Gtk::CellRendererText>();
m_playback_combo.set_valign(Gtk::ALIGN_END);
m_playback_combo.set_hexpand(true);
@@ -223,6 +229,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
m_controls.add(m_mute);
m_controls.add(m_deafen);
m_controls.add(m_noise_suppression);
+ m_controls.add(m_mix_mono);
m_main.add(m_menu_bar);
m_main.add(m_controls);
m_main.add(m_vad_value);
diff --git a/src/windows/voicewindow.hpp b/src/windows/voicewindow.hpp
index 6db2563..02e006f 100644
--- a/src/windows/voicewindow.hpp
+++ b/src/windows/voicewindow.hpp
@@ -54,6 +54,7 @@ private:
Gtk::Scale m_capture_gain;
Gtk::CheckButton m_noise_suppression;
+ Gtk::CheckButton m_mix_mono;
Gtk::ComboBoxText m_vad_combo;
Gtk::ComboBox m_playback_combo;