diff --git a/doc/tasks.md b/doc/tasks.md index 9411e6b5..f52c39ed 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -40,7 +40,7 @@ после начального пустого callback новых starvation нет. Стартовый callback повысил резерв 2 -> 3, возврат 3 -> 2 -> 1 занял 40с; обучение стартового периода стоит отделить от рабочего starvation. Отдельный APK audio-probe проверен на обоих телефонах: VOICE_COMMUNICATION/SPEECH, активный захват, - тишина на выходе, данные микрофона отбрасываются. Основное приложение пока использует AudioTrack. + тишина на выходе, данные микрофона отбрасываются. На этапе этой пробы основное приложение использовало AudioTrack. Samsung: AudioTrack с буфером 20мс даёт outputUs ~103мс в среднем; повторное открытие не включает FAST. AAudio/MMAP на speaker: shared mono/stereo ~30мс, exclusive mono/stereo ~24мс, буфер 20мс, underrun=0. Earpiece отсутствует в MMAP-профиле устройства; AAudio падает в legacy shared с буфером 40мс и outputUs ~129мс. @@ -64,6 +64,34 @@ Полная матрица запускается без аргументов; для круга Samsung: --es api aaudio --ei channels 1 --es sharing exclusive --ez roundtrip true --ei seconds 20; контроль Q8: --es api track --ei buffer_ms 40. Логи adb logcat -s AudioProbe; для нового прогона сначала am force-stop com.utun.audioprobe после завершения предыдущего. + Реализован CallAudioOutput: AAudio для подтверждённого SPEAKER, AudioTrack для остальных выходов/отказа fast. + AAudio пишет подготовленный PCM по аппаратному периоду с ограниченным общим таймаутом 100мс; + дополнительной PCM-очереди/callback нет. NON_BLOCKING заполняет ёмкость MMAP сверх рабочего bufferSize: + прямая проба дала ~63мс, штатное ожидание по периоду — ~24.4мс без underrun и с восстановлением после route change. + Источник поведения: AOSP AudioStreamInternalPlay::processDataNow и AudioStreamInternal::processData. + Подтверждённый AudioManager device ID запускает повторный выбор выхода; одинаковые уведомления игнорируются. + DISCONNECTED/DEAD_OBJECT обрабатывает playback worker, повтор ограничен текущим маршрутом, далее AudioTrack. + Новое устройство получает локальный head=0 и общий base=accepted PCM. Незаписанный хвост блока сохраняется. + Очередь уже закрытого устройства не переигрывается: pendingFrames логируется, при переключении возможен короткий разрыв. + call_audio_suspend_device инвалидирует аппаратный якорь без сброса JB/DSP/PTS. Старые timestamps отвергаются по generation. + AEC использует полную задержку выхода и возраст аппаратной метки захвата, без смешивания старого/нового frame counter. + Реальный видеозвонок на Samsung: SPEAKER ~23.1мс, wired MMAP ~23.4мс, EARPIECE AudioTrack ~137мс при буфере 40мс; + возврат EARPIECE -> SPEAKER снова выбирает MMAP. На всех выходах hardware underrun=0, ошибок аудиочасов нет. + Однако wired MMAP физически продолжал играть из динамика: Telecom, AudioPolicy и HAL показывали headset/0x4, + пользователь дважды подтвердил неверный звук. Контроль с AudioTrack исправил физический выход (подтверждено пользователем). + Поэтому быстрый backend разрешён только на SPEAKER; для гарнитур сохранён AudioTrack, несмотря на формальную доступность MMAP. + Исправлен auto-headset: ручной выбор speaker действует до следующего подключения/отключения гарнитуры, + дубликаты событий не отменяют ручной выбор. Рация явно отключает авторежим при ручном выборе, её поведение сохранено. + Добавлены INFO только при изменении списка устройств, Telecom endpoints и видимого состояния аудиокнопок. + 103 Android unit-теста, test_call_timeline, test_call_video_clock, test_call_delay, test_call_jitter прошли; + ядро и APK собраны. Финальный APK установлен на оба телефона. Логи переходов: /tmp/route-sm-live.log; + противоречащий физическому звуку HAL-маршрут: /tmp/headset-failure-{audio,policy,flinger}.txt. + +[ ] **Доступность разговорного динамика в UI звонка** — при подключённой проводной гарнитуре Samsung убирает + EARPIECE из Telecom endpoints, но кнопка остаётся доступной по наличию физического встроенного устройства. + Нажатие создаёт отложенный запрос, который исполняется после отключения гарнитуры. Согласовать UI с доступными endpoints. + Также выбор проводной гарнитуры в CallScreen сейчас запрашивает BLUETOOTH_CONNECT при отсутствии этого разрешения; + проверку разрешения нужно привязать к выбранному типу гарнитуры. [x] **Завершение звонка и видеопорта после обрыва транспорта** — 15.10.2026: Трасса test_call доказала потерю HANGUP при смене эпохи сигналинга: router reset удалял старую очередь.