Invalidate radio settings before reconfiguration and log failed attempts

This commit is contained in:
evgeny committed 2026-10-29 13:34:23 +01:00
1 parent 67615cc330
commit 128af68a89
2 files changed
+28 -8

No files matched your search

@@ -250,15 +250,29 @@ class RadioAudioEngine {
}
}
/** Смена настроек сохраняет окно автоматики; явное включение открывает новое. */
/** Смена настроек сохраняет окно автоматики; явное включение открывает новое.
* При отказе приём остаётся включённым, capture ждёт нового reconfigure/ACK; прежний ACK его не разрешает. */
fun reconfigure(restartAuto: Boolean = false) {
val version = generation
io.execute {
if (!active || generation != version || audioTrack == null) return@execute
stopCapture()
loadCaptureSettings()
if (restartAuto) vadWindow.restart(SystemClock.elapsedRealtime())
updateCapture()
var operation = "capture stop"
try {
stopCapture()
operation = "settings"
loadCaptureSettings()
if (restartAuto) vadWindow.restart(SystemClock.elapsedRealtime())
operation = "capture update"
updateCapture()
} catch (e: Exception) {
settingsTimeout?.let { mainHandler.removeCallbacks(it) }; settingsTimeout = null
settingsReady = false; ++settingsRequest
LogManager.addLog("ERROR", "RadioAudio", "radio reconfigure failed operation=$operation group=$audioGroup " +
"generation=$version; capture disabled until retry: $e")
if (operation == "capture update") try { stopCapture() } catch (cleanup: Exception) {
LogManager.addLog("ERROR", "RadioAudio", "reconfigure rollback failed group=$audioGroup; retained for retry: $cleanup")
}
}
}
}
@@ -310,11 +324,11 @@ class RadioAudioEngine {
/* Настройки загружаются при включении/перенастройке, без DataStore в пути PTT. */
private fun loadCaptureSettings() {
settingsTimeout?.let { mainHandler.removeCallbacks(it) }; settingsTimeout = null
settingsReady = false
val request = ++settingsRequest
val provider = ChatApplication.instance.configProvider
MediaAudioController.refresh()
autoSettings = provider.getRadioAutoSettings()
settingsReady = false
val request = ++settingsRequest
if (!autoSettings.valid() || !NativeLib.radioConfigure(request, autoSettings)) {
LogManager.addLog("ERROR", "radio", "Cannot apply automatic transmission settings request=$request settings=$autoSettings")
} else {
+7 -1
View File
@@ -288,6 +288,11 @@ identity и исходное поколение до изменения сост
Отказ таймера фоновой автоматики закрывает её окно; ручной PTT/измеритель могут
сохранить захват в режиме OFF. Логи содержат группу, поколение, этап отказа и join.
Reconfigure инвалидирует прежний settings request до чтения новых настроек.
Ошибка чтения/применения/обновления capture логируется с этапом; приём остаётся
включённым, capture ждёт повторной перенастройки и нового ACK. Прежний ACK не
возобновляет захват после отказа. Частично созданный capture получает rollback.
`RadioTalkState` хранит отдельный снимок говорящих для активной группы. Включение/
смена канала создаёт новый снимок, выключение устанавливает groupId=0. Событие 43
разбирается строго как 19 little-endian байтов: group/node/stream/on; ID ненулевые,
@@ -472,7 +477,8 @@ MediaAudioController с host-границами Android/JNI. Проверяет
workers настоящие; звукового оборудования, DSP и сетевой передачи в модели нет.
RadioAudioLifecycleTest проверяет отказы регистрации/очистки receiver и AudioTrack,
зависимость release от detach lease, interruption, ошибки native/start/settings,
отложенные и повторно входящие callbacks, восстановление после звонка и отказы
отложенные и повторно входящие callbacks, восстановление после звонка, отказ
перенастройки с последующим старым ACK и отказы
таймеров ACK/автоматики. Проверяется и сохранение владельцев после частичного
эффекта API, и продолжение независимой очистки перед повторной попыткой.
На Linux `:app:testDebugUnitTest` также запускает 25 fault-сценариев настоящего