4.9 KiB
4.9 KiB
Phase 4: Live/Voice Feature — Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task.
Goal: Implement the Live panel — voice connection, audio visualization, music/screen playback, recordings, PCM streaming, and mic transmit.
Architecture: Canvas 2D via web-sys::CanvasRenderingContext2d for real-time audio vis. web_sys::AudioContext + AudioBufferSourceNode for PCM playback. web_sys::MediaDevices::get_user_media for mic capture. WS binary frames parsed from [u32 userId][i16 samples] format.
Tech Stack: Leptos 0.7 CSR, web-sys (Canvas, AudioContext, MediaDevices), wasm-bindgen, js-sys.
Global Constraints
- Branch:
leptos-rewriteat/mnt/code/bete/.worktrees/leptos-rewrite/ - Use
use leptos::prelude::*;(NOTuse leptos::*;) - Canvas elements use
web-sysnot Leptos abstractions - Binary WS frames:
DataViewonArrayBufferreceived inWsContext.on_binarycallback - No new heavy dependencies (avoid
cpal,rodio— these don't compile to WASM)
File Structure
services/frontend-leptos/frontend/src/
└── features/
└── live/
├── mod.rs # LivePanel (composition)
├── components/
│ ├── mod.rs
│ ├── voice_connection_card.rs # Guild/channel select + connect/disconnect
│ ├── active_speakers.rs # Speaking users list
│ ├── audio_visualizer.rs # Canvas 32-bar viz
│ ├── mic_level_meter.rs # Horizontal level bar
│ ├── now_playing.rs # Current media + queue
│ ├── music_sub_panel.rs # Music playlist controls
│ ├── screen_sub_panel.rs # Screenshare controls
│ ├── recordings_sub_panel.rs # Voice recordings list
│ └── waveform_player.rs # Canvas + AudioContext player
├── hooks/
│ ├── mod.rs
│ ├── use_voice_control.rs # Voice connection commands
│ ├── use_media_control.rs # Media player commands
│ ├── use_audio_playback.rs # PCM → AudioContext pipeline
│ └── use_audio_transmit.rs # Mic → WS binary frames
└── audio/
├── mod.rs
├── pcm_decoder.rs # Opus/PCM decode logic
└── ring_buffer.rs # Audio ring buffer for streaming
Files to modify:
services/frontend-leptos/frontend/src/lib.rs— addpub mod features;(already done, addpub mod live;)services/frontend-leptos/frontend/src/app.rs— wireLivePanelas tab contentservices/frontend-leptos/frontend/src/app.css— add live-panel CSS classesservices/frontend-leptos/frontend/Cargo.toml— add any new web-sys features
Task 1: Module skeleton + voice control hook
- Create:
features/live/{mod.rs, components/mod.rs, hooks/mod.rs} - Create:
features/live/hooks/use_voice_control.rs— guilds, channels, connect/disconnect - Create:
features/live/hooks/use_media_control.rs— queue, skip, stop, volume - Modify:
lib.rs— addpub mod live;
Task 2: VoiceConnectionCard + ActiveSpeakers
- Create:
features/live/components/voice_connection_card.rs - Create:
features/live/components/active_speakers.rs - Port from React: guild selector, voice channel selector, join/disconnect buttons, speaker list
Task 3: AudioVisualizer + MicLevelMeter
- Create:
features/live/components/audio_visualizer.rs— Canvas 32-bar frequency vis - Create:
features/live/components/mic_level_meter.rs— 0-100% bar - Key:
CanvasRenderingContext2d::fill_rectper frame viarequestAnimationFrame
Task 4: Music + Screen sub-panels
- Create:
features/live/components/now_playing.rs - Create:
features/live/components/music_sub_panel.rs - Create:
features/live/components/screen_sub_panel.rs - Port from React: queue display, volume slider, URL inputs, control buttons
Task 5: RecordingsSubPanel + WaveformPlayer
- Create:
features/live/components/recordings_sub_panel.rs— paginated recordings list - Create:
features/live/components/waveform_player.rs— Canvas waveform + AudioContext - Key:
AudioContext::decode_audio_datafor fetch-playback
Task 6: PCM audio playback + mic transmit
- Create:
features/live/hooks/use_audio_playback.rs— binary WS frames → AudioContext - Create:
features/live/hooks/use_audio_transmit.rs— getUserMedia → WS - Create:
features/live/audio/pcm_decoder.rs - Create:
features/live/audio/ring_buffer.rs
Task 7: LivePanel composition + wiring
- Rewrite:
features/live/mod.rs— assemble all components - Modify:
app.rs— wire LivePanel, add CSS classes - Test:
cargo check+trunk build --release