feat(audio,#2): MediaProjection + AudioPlaybackCapture preview on glasses; AudioPath /vm-audio to phone; debug test tone; debug audio pipe; FGS mediaProjection type; AudioOutputSection UI toggle

This commit is contained in:
2026-09-27 06:39:00 +03:00
parent 2125788e25
commit b1efa3d462
16 changed files with 872 additions and 229 deletions
+73
View File
@@ -0,0 +1,73 @@
# BLOCKERS ночной сессии 2026-09-27
## B1 — Нет общей L3-сети между телефоном и очками для проверки ON_PHONE end-to-end
**Задача:** #2 (проброс звука VirtualDisplay → телефон).
**Что сделано:**
- `AudioBridge` + `GlassesAudioCapture` + WebSocket-аудио-сервер `/vm-audio` (порт 8081) на очках +
`AudioPlaybackManager` на телефоне + UI-переключатель «Звук» в `GlassesStatusScreen`.
- **MediaProjection + AudioPlaybackCapture подтверждены работающими на очках в автономном debug-режиме
`DEBUG_AUDIO_PIPE`** (preview без WebSocket-канала):
```
TestTone: test tone start: 44100 Hz stereo, 10s
GlassesAudioCapture: capture: bytes=1310720 rms=5629 ← захват системного звука работает!
TestTone: test tone done
GlassesAudioCapture: capture: bytes=1474560 rms=0 ← тишина после теста
```
RMS 5629 совпадает с теоретическим (~5657 для амплитуды 8000) → мы реально ловим 440 Гц.
- Тестовый тон → динамик очков → AudioPlaybackCapture на тех же очках → доказано.
- Подача `Recorder Audio` + `PROJECT_MEDIA=allow` через `AdbController`/`appops` — работает.
**В чём стена:** WebSocket-канал (AudioPath между очками и телефоном) требует общую L3-сеть. На данный момент:
- Phone: `192.168.76.121/22 dev wlan0 → SSID "O2 5"`.
- Glasses: подключены к тому же `O2 5` через supplicant (CONNECTED), **но без IP на wlan0** (`network is unreachable`).
Просто очкам DHCP не отдал адрес (по какой-то причине).
- mDNS работает только в broadcast-домене одной L2/L3 сети.
Без общего IP между устройствами WebSocket `/vm-audio` не пройдёт — `AudioPlaybackManager` на телефоне подключиться не сможет. Сам захват звука на очках доказан, но отправка байтов по WS до телефона — нет.
**Что проверял:**
- `service call adb 4 i32 1 s16 "O2 5"` + `settings put global adb_wifi_enabled 1` — wireless-adb поднимается.
- Bluetooth-канал (Mercury) работает (BLE-команды идут). Но для WebSocket audio не применим (пропускная способность BLE всё-таки ограничена для 44.1 кГц стерео, что добавляет сложностей).
- ping телефон ↔ очки = `network is unreachable` от очков в сторону телефона (wlan0 не получил IP).
**Обход (нужна помощь пользователя):**
1. **Самый прямой:** пользователь включает Wi-Fi-хотспот на телефоне (через UI, ~30 секунд).
- SSID/пароль любые.
- Телефон и очки → обе в одну сеть, получают IP от телефона.
- Очки уже умеют авто-коннектиться к сохранённой сети (Caffeine Portable или любая).
2. **Альтернатива:** пользователь подключает очки к USB-tethering'у с телефона (если dev'ы возможно на устройстве).
3. **Самый сложный:** настроить прямой Wi-Fi Direct между телефоном и очками — `cmd wifi p2p ...` потребует более глубокой интеграции.
После появления общей сети проверить:
```bash
# на телефоне:
adb shell am start -n pw.binom.rayneovm.phone/.MainActivity # поднять UI
# UI → «Очки» → тумблер «Звук на телефоне».
# В логах телефона должно быть:
# AudioPlaybackManager: audio connected to ws://<glasses_ip>:8081/vm-audio
# AudioPlaybackManager: playing: bytes=… rms=…
# В логах очков:
# GlassesAudioCapture: capture: bytes=… rms=…
# VmService: sender: clients=1 bytes=…
```
**Статус:** #2 прогресс в работе, ядро (MediaProjection + AudioPlaybackCapture) доказано рабочим. Только финальная L3-проверка отложена до пробуждения пользователя.
## B2 — USB-adb / сеть очков: на руках есть USB-adb хост ↔ очки; очки же сейчас в wlan0 без IP
Зафиксировано в #B1 — нужно чтобы устройства в общей IP-сети. Wi-Fi-xотспот на телефоне решает.
## B3 (выяснено, не блокер) — Mercury path `ble.request.debug` не зарегистрирован на прошивке RayNeo X3 Pro
**Что:** `RayNeoMercury.enableWirelessAdb()` отправляет `ble.request.debug/enableWirelessAdb`, на очках приходит `Can not resolve(uri = ble.request.debug)` — RayNeo Mercury system-app на этой прошивке не знает этот URI.
Это означает: **провайдер Mercurry не работает на X3 Pro** для управления wireless-adb.
**Workaround:** включение wireless-adb через `service call adb 4 i32 1 s16 <ssid>` от shell — отлично работает (с shell UID через Shizuku или напрямую). Используется в `AdbController`/`ShizukuProvisioner`.