From b3c698be25e8e58c6510b72a6c018b27758d8120 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 14 Oct 2026 02:54:20 +0200 Subject: [PATCH] Prevent radio capture from competing with a broadcast microphone --- tools/chatgui/src/radio_audio_engine.cpp | 7 ++++++- tools/chatgui/src/radio_audio_engine.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/chatgui/src/radio_audio_engine.cpp b/tools/chatgui/src/radio_audio_engine.cpp index 04732175..0d24625a 100644 --- a/tools/chatgui/src/radio_audio_engine.cpp +++ b/tools/chatgui/src/radio_audio_engine.cpp @@ -203,13 +203,17 @@ void RadioAudioEngine::reconfigureCapture() { int RadioAudioEngine::start(quint64 groupId) { if (m_active && m_groupId == groupId) return 0; stop(); + if (!m_microphone.acquire()) { + DEBUG_WARN(DEBUG_CATEGORY_RADIO, "RadioAudio: microphone owned by another operation"); return -1; + } auto* inst = gui_bridge_get_inst(); if (!inst || radio_audio_start(groupId, 0) != 0) { DEBUG_ERROR(DEBUG_CATEGORY_RADIO, "RadioAudio: cannot start group=%016llx", (unsigned long long)groupId); + m_microphone.release(); return -1; } m_groupId = groupId; - if (!m_voice.start(VoiceAudioIo::Kind::Radio, groupId)) { radio_audio_stop(); m_groupId = 0; return -1; } + if (!m_voice.start(VoiceAudioIo::Kind::Radio, groupId)) { radio_audio_stop(); m_groupId = 0; m_microphone.release(); return -1; } m_wantStereo = chat_setting_get_int(inst, "radio_capture_stereo", 0) != 0; m_active = true; m_capture.retryNow(); @@ -300,6 +304,7 @@ void RadioAudioEngine::pauseDevices() { void RadioAudioEngine::stop() { m_recoveryTimer.stop(); pauseDevices(); m_voice.stop(); + m_microphone.release(); uint64_t group = m_groupId.exchange(0); bool talking = m_talking.exchange(false); m_buttonTalking = m_hotkeyTalking = false; diff --git a/tools/chatgui/src/radio_audio_engine.h b/tools/chatgui/src/radio_audio_engine.h index 9158d909..71506ed2 100644 --- a/tools/chatgui/src/radio_audio_engine.h +++ b/tools/chatgui/src/radio_audio_engine.h @@ -5,6 +5,7 @@ #include #include #include "audio_device.h" +#include "audio_capture_lease.h" #include "voice_audio_io.h" #include #include @@ -92,6 +93,7 @@ private: std::atomic m_groupId{0}; AudioDevice m_capture; + AudioCaptureLease m_microphone; VoiceAudioIo m_voice; bool m_outputAttached = false; QTimer m_recoveryTimer;