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:
1 parent
3620a2387b
commit
ed329213de
18 files changed
+55
-2393
No files matched your search
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user