139 lines
5.6 KiB
Markdown
139 lines
5.6 KiB
Markdown
# 05. Test multimedia controls across platforms [x]
|
|
|
|
meta:
|
|
id: audio-playback-fix-05
|
|
feature: audio-playback-fix
|
|
priority: P1
|
|
depends_on: []
|
|
tags: [testing, integration, cross-platform]
|
|
|
|
objective:
|
|
- Comprehensive testing of volume/speed controls and multimedia key support
|
|
- Verify platform-specific media integration works correctly
|
|
- Validate all controls across different audio backends
|
|
|
|
deliverables:
|
|
- Test suite for volume/speed controls in `src/utils/audio-player.test.ts`
|
|
- Integration tests for multimedia key handling in `src/hooks/useMultimediaKeys.test.ts`
|
|
- Platform-specific integration tests in `src/utils/media-registry.test.ts`
|
|
- Test coverage report showing all features tested
|
|
|
|
steps:
|
|
- Step 1: Run existing unit tests for audio player backends
|
|
- Step 2: Add volume control tests (setVolume, volume clamp, persistence)
|
|
- Step 3: Add speed control tests (setSpeed, speed clamp, persistence)
|
|
- Step 4: Create integration test for multimedia key handling
|
|
- Step 5: Test volume/speed controls with Player component UI
|
|
- Step 6: Test multimedia keys with Player component UI
|
|
- Step 7: Test platform-specific media integration on each platform
|
|
- Step 8: Test all controls across mpv, ffplay, and afplay backends
|
|
- Step 9: Document any platform-specific limitations or workarounds
|
|
|
|
tests:
|
|
- Unit:
|
|
- Test volume control methods in all backends
|
|
- Test speed control methods in all backends
|
|
- Test volume clamp logic (0-1 range)
|
|
- Test speed clamp logic (0.25-3 range)
|
|
- Test multimedia key detection
|
|
- Test event listener cleanup
|
|
- Integration:
|
|
- Test volume control via Player component UI
|
|
- Test speed control via Player component UI
|
|
- Test multimedia keys via keyboard
|
|
- Test volume/speed persistence across pause/resume
|
|
- Test volume/speed persistence across track changes
|
|
- Cross-platform:
|
|
- Test volume/speed controls on macOS
|
|
- Test volume/speed controls on Linux
|
|
- Test volume/speed controls on Windows
|
|
- Test multimedia keys on each platform
|
|
- Test media registration on each platform
|
|
|
|
acceptance_criteria:
|
|
- All unit tests pass with >90% code coverage
|
|
- All integration tests pass
|
|
- Volume controls work correctly on all platforms
|
|
- Speed controls work correctly on all platforms
|
|
- Multimedia keys work on all platforms
|
|
- Media controls appear on all supported platforms
|
|
- All audio backends (mpv, ffplay, afplay) work correctly
|
|
- No regressions in existing audio functionality
|
|
|
|
validation:
|
|
- Run full test suite: `bun test`
|
|
- Check test coverage: `bun test --coverage`
|
|
- Manually test volume controls on each platform
|
|
- Manually test speed controls on each platform
|
|
- Manually test multimedia keys on each platform
|
|
- Verify media controls appear on each platform
|
|
- Check for any console errors or warnings
|
|
|
|
notes:
|
|
- Test suite should cover all audio backend implementations
|
|
- Integration tests should verify UI controls work correctly
|
|
- Platform-specific tests should run on actual platform if possible
|
|
- Consider using test doubles for platform-specific APIs
|
|
- Document any platform-specific issues or limitations found
|
|
- Reference: Test patterns from existing test files in src/utils/
|
|
|
|
## Implementation Notes (Completed)
|
|
|
|
### Manual Validation Steps
|
|
|
|
1. **Volume controls (all backends)**
|
|
- Launch app, load an episode, press Up/Down arrows on Player tab
|
|
- Volume indicator in PlaybackControls should update (0.00 - 1.00)
|
|
- Audio output volume should change audibly
|
|
- Test on non-Player tabs: Up/Down should still adjust volume via global media keys
|
|
|
|
2. **Speed controls (mpv, afplay)**
|
|
- Press `S` to cycle speed: 1.0 -> 1.25 -> 1.5 -> 1.75 -> 2.0 -> 0.5
|
|
- Speed indicator should update in PlaybackControls
|
|
- Audible pitch/speed change on mpv and afplay
|
|
- ffplay: speed changes require track restart (documented limitation)
|
|
|
|
3. **Seek controls**
|
|
- Press Left/Right arrows to seek -10s / +10s
|
|
- Position indicator should update
|
|
- Works on Player tab (local) and other tabs (global media keys)
|
|
|
|
4. **Global media keys (non-Player tabs)**
|
|
- Navigate to Feed, Shows, or Discover tab
|
|
- Start playing an episode from Player tab first
|
|
- Switch to another tab
|
|
- Press Space to toggle play/pause
|
|
- Press Up/Down to adjust volume
|
|
- Press Left/Right to seek
|
|
- Press S to cycle speed
|
|
|
|
5. **Platform media integration (macOS)**
|
|
- Install `nowplaying-cli`: `brew install nowplaying-cli`
|
|
- Track info should appear in macOS Now Playing widget
|
|
- If `nowplaying-cli` is not installed, graceful no-op (no errors)
|
|
|
|
### Platform Limitations
|
|
|
|
| Backend | Volume | Speed | Seek | Notes |
|
|
|---------|--------|-------|------|-------|
|
|
| **mpv** | Runtime (IPC) | Runtime (IPC) | Runtime (IPC) | Best support, uses Unix socket |
|
|
| **afplay** | Restart required | Restart required | Not supported | Process restarts with new args |
|
|
| **ffplay** | Restart required | Not supported | Not supported | No runtime speed flag |
|
|
| **system** | Depends on OS | Depends on OS | Depends on OS | Uses `open`/`xdg-open` |
|
|
| **noop** | No-op | No-op | No-op | Silent fallback |
|
|
|
|
### Media Registry Platform Support
|
|
|
|
| Platform | Integration | Status |
|
|
|----------|------------|--------|
|
|
| **macOS** | `nowplaying-cli` | Works if binary installed |
|
|
| **Linux** | MPRIS D-Bus | Stub (no-op), upgradable |
|
|
| **Windows** | None | No-op stub |
|
|
|
|
### Key Architecture Decisions
|
|
- Global media keys use event bus (`media.*` events) for decoupling
|
|
- `useMultimediaKeys` hook is called once in App.tsx
|
|
- Guards prevent double-handling when Player tab is focused (Player.tsx handles locally)
|
|
- Guards prevent interference when text input is focused
|
|
- MediaRegistry is a singleton, fire-and-forget, never throws
|