diff --git a/tools/chatgui-android/doc/ARCHITECTURE.md b/tools/chatgui-android/doc/ARCHITECTURE.md index cfbb4dcda..b3e6c591b 100644 --- a/tools/chatgui-android/doc/ARCHITECTURE.md +++ b/tools/chatgui-android/doc/ARCHITECTURE.md @@ -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`;