Preserve replacement PTT requests during obsolete capture rollback

This commit is contained in:
evgeny committed 2026-10-29 13:34:23 +01:00
1 parent 17caeb0a9c
commit a5fea0c503
1 file changed
+13 -7
@@ -36,7 +36,7 @@ import java.util.concurrent.Future
* talkingFlow показывает запрос/наблюдаемый TX, transmittingGroup — фактический native TX своего канала.
* Подписка/native capture и workers сохраняются до запуска API/Thread: частичный отказ получает rollback.
* Ошибка capture останавливает его подписку/encoder, сохраняя приём; ошибка playback освобождает всю свою сессию.
* Очистка идёт на io независимо от доставки main; identity/pоколение защищают заменившую сессию.
* Очистка идёт на io независимо от доставки main; identity/поколение защищают заменившую сессию.
*/
class RadioAudioEngine {
@@ -417,6 +417,7 @@ class RadioAudioEngine {
/** Оба детектора используют одно окно по экрану/фону; измеритель не продлевает это окно. */
private fun updateCapture() {
val version = generation
try {
mainHandler.removeCallbacks(vadTimeout)
if (!settingsReady) return
@@ -440,10 +441,13 @@ class RadioAudioEngine {
if (audioTrack == null) return
if (captureSubscription == null && nativeCaptureOwned) stopCapture()
if (captureSubscription == null && !startCapture(mode)) {
requestedTalk = false
_talkingFlow.value = false
if (generation == version) {
requestedTalk = false
_talkingFlow.value = nativeCaptureOwned && _transmittingGroup.value != null
}
return
}
if (generation != version) return
if (requestedTalk != capturePttRequested) {
if (captureSubscription?.ptt(requestedTalk) != true) {
LogManager.addLog("ERROR", "radio", "PTT command rejected; stopping capture group=$audioGroup")
@@ -453,9 +457,11 @@ class RadioAudioEngine {
capturePttRequested = requestedTalk
}
} catch (e: Exception) {
requestedTalk = false
_talkingFlow.value = nativeCaptureOwned && _transmittingGroup.value != null
LogManager.addLog("ERROR", "RadioAudio", "capture update failed group=$audioGroup generation=$generation " +
if (generation == version) {
requestedTalk = false
_talkingFlow.value = nativeCaptureOwned && _transmittingGroup.value != null
}
LogManager.addLog("ERROR", "RadioAudio", "capture update failed group=$audioGroup generation=$version current=$generation " +
"nativeOwned=$nativeCaptureOwned; retained for retry: $e")
}
}
@@ -516,7 +522,7 @@ class RadioAudioEngine {
LogManager.addLog("INFO", "radio", "capture started group=$captureGroup ch=$channels mode=$autoMode shared=true")
return true
} catch (e: Exception) {
requestedTalk = false
if (generation == version) requestedTalk = false
LogManager.addLog("ERROR", "RadioAudio", "capture startup failed operation=$operation group=$captureGroup " +
"generation=$version mode=$mode: $e")
try { stopCapture() } catch (cleanup: Exception) {