Remove embedded music player

The music feature is retired: delete the Media tab, MediaAPI,
MediaPlayerController, PinnedMediaResourceLoader, MediaPanelView, the
media_state control publish, media scope handling in VoiceSession, the
volume setting, and all media tests. App is now Talk + Activity tabs.

Backend media API in hope-voice-api is untouched (still serves the web UI).
This commit is contained in:
snowspeeder committed 2026-09-12 06:26:58 -04:00
1 parent 3620a2387b
commit ed329213de
18 files changed
+55 -2393

No files matched your search

+8 -14
View File
@@ -1,19 +1,19 @@
# Voice — iOS client for Hope Voice
Native SwiftUI iOS app (iOS 17+) that talks to the [Hope Voice](https://github.com/) agent:
voice/text conversation, transcript history, voice & model pickers, media player, and a
background-tasks panel. Uses `hope-voice-api`, including cached AAC conversion for iOS music playback.
voice/text conversation, transcript history, voice & model pickers, and a background-tasks
panel. Uses `hope-voice-api`.
> **Status:** Core functionality is implemented and verified in simulator to the extent the
> environment allows. Full device qualification (mic capture, audible media playback,
> interruption behavior) remains pending. The native Talk/Music/Activity redesign is implemented —
> environment allows. Full device qualification (mic capture, interruption behavior)
> remains pending. The native Talk/Activity redesign is implemented —
> see [PLAN.md](PLAN.md) and [docs/DEVICE_TESTING.md](docs/DEVICE_TESTING.md).
## Prerequisites
- Xcode 16+ (Swift 6), iOS 17 simulator or a real iPhone on the LAN.
- [xcodegen](https://github.com/yonaskolb/XcodeGen) (`brew install xcodegen`).
- The `voice` container running on Unraid (LiveKit + token server + media API).
- The `voice` container running on Unraid (LiveKit + token server).
- Mic: the simulator mic is unreliable in this environment (CoreAudio `-4010`, 0 input
channels) — voice mode needs a real device. If the simulator was wiped, grant permission
first: `xcrun simctl privacy booted grant microphone dev.shane.voice`.
@@ -33,7 +33,7 @@ To run in the simulator, use Xcode or `xcrun simctl` with the built app.
Default base URL is `https://192.168.86.2:9178` (see `Sources/App/SettingsStore.swift`).
Change it at runtime in **Settings → Server URL** (the app disconnects and recreates the
session when idle). The app derives LiveKit signaling and media endpoints from this base URL.
session when idle). The app derives the LiveKit signaling endpoint from this base URL.
### TLS cert pinning
@@ -46,7 +46,7 @@ openssl s_client -connect 192.168.86.2:9178 </dev/null 2>/dev/null \
| openssl x509 -outform der | openssl dgst -sha256
```
Paste the new hash into `TLSPinning.pinnedCertSHA256Hex`. Until you do, token/media calls
Paste the new hash into `TLSPinning.pinnedCertSHA256Hex`. Until you do, token calls
fail with a pin mismatch (not a network error).
## Features
@@ -58,10 +58,6 @@ fail with a pin mismatch (not a network error).
stripping, last-50 history persisted to UserDefaults, clear button.
- **Voice & model pickers** — 13 Azure TTS voices; LLM models from the agent's `models`
message. Both persist and sync on join (`set_voice`/`set_model`).
- **Media player** — now-playing card (art/title/channel/status), transport (play/pause,
±10 s, stop), seek + volume sliders, search with "in library" tags, agent-offered choices,
library list (play/remove), add-stream form. AVPlayer-backed with a pinned-TLS Range proxy;
1.5 s `/state` polling and full web-parity reconciliation/reporting.
- **Activity tab** — live `task_event` updates (steps, result, error) with an active
count badge on the tab.
@@ -69,11 +65,9 @@ fail with a pin mismatch (not a network error).
- **Simulator mic**: CoreAudio returns `-4010` (no usable input source) in this environment;
voice capture must be verified on a real device. Text mode works in the simulator.
- **Music compatibility**: library WebM files are requested as cached AAC on iOS.
This requires the deployed backend compatibility patch; see [deployment](docs/DEPLOYMENT.md).
- **Cert pin rotation**: see above — re-export the pin after each server cert regeneration.
- **LiveKit signaling** uses plain `ws://192.168.86.2:7880` (not wss) because the Swift SDK
cannot trust the self-signed cert on its WebSocket; token + media still go over pinned TLS.
cannot trust the self-signed cert on its WebSocket; token calls still go over pinned TLS.
## Docs