Files
PodTui/tasks/audio-playback-fix/05-test-multimedia-controls.md

5.6 KiB

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