Document radio startup completion and independent cleanup contracts

This commit is contained in:
evgeny committed 2026-10-29 13:34:23 +01:00
1 parent 2fd8a35230
commit bb8518ab67
1 file changed
+34
+34
View File
@@ -259,6 +259,35 @@ capture останавливается. При работающем измери
Снятие ручного PTT само по себе не выключает автоматическую передачу.
Stop/смена группы сбрасывает удержания и прежний хвост; io проверяет generation.
Start/stop рации также вызываются на main. Start отвергает нулевую группу,
проверяет размер буфера AudioTrack и выполняет на io сначала очистку прежних
ресурсов, затем setup. Даже отказ первоначальной очистки завершает onReady(false)
на main. Отложенный результат перепроверяет generation: он не подтверждает и
не очищает новый запрос. Ошибка текущего запуска снимает activeGroup после
callback, если callback не начал новый start/stop. Это позволяет restoreAfterCall
сначала выключить native-членство неудачно восстановленной группы. Исключение
пользовательского callback логируется и передаётся main-caller. Если main-очередь
отвергла доставку, callback на io не вызывается, новые аудиоресурсы очищаются с ERROR.
Stop снимает логическое участие сразу; его Future завершается после io-очистки
либо возвращает первый критический отказ. Ждать Future нужно вне main. Receiver,
capture, output lease/AudioTrack и native DSP очищаются независимо. Перед остановкой
DSP движок дожидается своих capture/play workers; interruption не пропускает join,
флаг восстанавливается после очистки. Ссылка на отказавший receiver/lease/track
сохраняется для следующего stop/start. При ошибке detach lease трек ещё принадлежит
MediaAudioController и не получает release. Успешно очищенные ссылки сбрасываются;
native audio stop остаётся идемпотентной завершающей попыткой после join.
Новая группа не заменяет владельцев при неподтверждённой очистке.
Screen receiver удерживается до вызова registerReceiver, включая частичный отказ
IPC. IllegalArgumentException от unregister подтверждает отсутствие регистрации;
прочие ошибки сохраняют владельца. Доставленный после замены receiver проверяет
identity и исходное поколение до изменения состояния экрана. Проверка settings ACK
имеет собственный отменяемый Runnable: ACK, новая настройка и stop снимают его.
Отказ постановки ACK-timeout логируется, захват по-прежнему ждёт подтверждения.
Отказ таймера фоновой автоматики закрывает её окно; ручной PTT/измеритель могут
сохранить захват в режиме OFF. Логи содержат группу, поколение, этап отказа и join.
`RadioTalkState` хранит отдельный снимок говорящих для активной группы. Включение/
смена канала создаёт новый снимок, выключение устанавливает groupId=0. Событие 43
разбирается строго как 19 little-endian байтов: group/node/stream/on; ID ненулевые,
@@ -441,6 +470,11 @@ MediaAudioController с host-границами Android/JNI. Проверяет
измерителе: отказ/обычный хвост таймера, повторное нажатие, независимые владельцы,
отмена, смена группы, RECORD_AUDIO и запрет фоновых PTT-вызовов. PCM-подписки и
workers настоящие; звукового оборудования, DSP и сетевой передачи в модели нет.
RadioAudioLifecycleTest проверяет отказы регистрации/очистки receiver и AudioTrack,
зависимость release от detach lease, interruption, ошибки native/start/settings,
отложенные и повторно входящие callbacks, восстановление после звонка и отказы
таймеров ACK/автоматики. Проверяется и сохранение владельцев после частичного
эффекта API, и продолжение независимой очистки перед повторной попыткой.
На Linux `:app:testDebugUnitTest` также запускает 25 fault-сценариев настоящего
JNI logger через `:app:testJniLog`; окружение и границы модели: `tests/jni_log/README.md`.
Проверки native bridge/standby доступны в `tests/Makefile.am`;