From cd709b892ad5bcfc3bd0c19bb891e3fb282f15b0 Mon Sep 17 00:00:00 2001 From: liu weikai Date: Tue, 11 Aug 2026 18:03:10 +0800 Subject: [PATCH] fix(vmp): serialize pending MQTT voice transfers --- .../src/voice/vmp_pager_session.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/platform/esp/arduino_common/src/voice/vmp_pager_session.cpp b/platform/esp/arduino_common/src/voice/vmp_pager_session.cpp index 57df4425..d2454557 100644 --- a/platform/esp/arduino_common/src/voice/vmp_pager_session.cpp +++ b/platform/esp/arduino_common/src/voice/vmp_pager_session.cpp @@ -700,13 +700,17 @@ class PagerReceiveSession final } const OutboundCarrier candidate_carrier = selectOutboundCarrierLocked(broadcast); - const bool mqtt_carrier_busy = - candidate_carrier == OutboundCarrier::Mqtt && - (mqtt_pending_local_id_ != 0U || media_->mqtt_transmit.hasNext()); + // There is one bounded MQTT transfer slot. Do not start a second + // record/send session while it owns an earlier clip, even if MQTT has + // subsequently gone offline and LR1121 RF would otherwise be usable. + // This avoids overwriting the clip, dual live media allocations, and + // an implicit alternate-carrier copy under memory pressure. + const bool mqtt_delivery_pending = + mqtt_pending_local_id_ != 0U || media_->mqtt_transmit.hasNext(); const bool unavailable = presentation != presentation_protocol_ || active_ || outbound_task_ || playback_task_ || candidate_carrier == OutboundCarrier::None || - mqtt_carrier_busy; + mqtt_delivery_pending; unlockState(); if (unavailable) { @@ -725,11 +729,10 @@ class PagerReceiveSession final } const OutboundCarrier selected_carrier = selectOutboundCarrierLocked(broadcast); - const bool selected_mqtt_busy = - selected_carrier == OutboundCarrier::Mqtt && - (mqtt_pending_local_id_ != 0U || media_->mqtt_transmit.hasNext()); + const bool selected_mqtt_delivery_pending = + mqtt_pending_local_id_ != 0U || media_->mqtt_transmit.hasNext(); if (active_ || outbound_task_ || playback_task_ || - selected_carrier == OutboundCarrier::None || selected_mqtt_busy) + selected_carrier == OutboundCarrier::None || selected_mqtt_delivery_pending) { unlockState(); Serial.printf("[VMP][TX] hold begin rejected reason=became_busy_or_no_carrier\n");