Browse Source

Document live low latency route tests and Samsung headset MMAP fallback

master
evgeny 3 days ago
parent
commit
19a135d552
  1. 30
      doc/tasks.md

30
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 удалял старую очередь.

Loading…
Cancel
Save