5b4c7c1a18
AudioPlayerProvider publishes CascadingValue<StreamingAudioPlayerService> (concrete) but all consumers request interface types; cascade resolves null, controls render disabled. PLAYER_ANALYSIS.md has the deep-dive; TODO.md has the actionable bugs.
2.6 KiB
2.6 KiB
TODO.md — Known issues and bugs
Pre-existing bugs and known issues not yet triaged into the roadmap. Items here are waiting for scheduling or architectural clarity.
Player controls do not activate — cascade type mismatch [CRITICAL]
Full analysis in PLAYER_ANALYSIS.md (2026-06-03).
- Symptom: Backend streaming works; player controls never respond. Clicking a track does nothing visible, the dock never expands, transport buttons render disabled.
- Root cause:
AudioPlayerProvider.razorpublishes<CascadingValue Value="@(_audioPlayerService)">where_audioPlayerServiceis typed as the concreteStreamingAudioPlayerService. Blazor binds cascading values by the declaredTValuetype. Every consumer asks for an interface —AudioPlayerBar/SpectrumVisualizerwantIStreamingPlayerService,TracksView/HomewantIPlayerService— so none match the cascade and all receivenull. Null-guarded controls render disabled and silent;TracksView.PlayerServiceisrequiredand will throw on first click once the bar alone is fixed. - Fix shape: Type the provider field/cascade as a single interface (
IStreamingPlayerService) and align all four consumers to it; or register the service in DI and useAddCascadingValue<IStreamingPlayerService>. Minimal correct move is the former. Detail inPLAYER_ANALYSIS.md §2.3.
Player stack — adjacent correctness/hygiene issues
Surfaced by the same 2026-06-03 analysis (PLAYER_ANALYSIS.md §4). Distinct from the cascade bug.
- No JS-module-readiness guard.
AudioInteropService.CreatePlayerAsyncassumeswindow.DeepDrftAudiois present; a slow WASM boot / cache miss produces a spurious init failure. Add a readiness guard or load-order guarantee. - Dead legacy buffered path is reachable and silent. The base
AudioPlayerService.SelectTrack(non-streaming) path callsInitializeBufferedPlayerAsync/AppendAudioBlockAsync/FinalizeAudioBufferAsync, which are no-ops inindex.ts. Any non-streaming player reports success and plays silence. Remove the dead path or make it fail loudly. - Dead TypeScript.
Interop/audiobuffermanager.ts(orphaned, missing the live scheduler'sisActive_/playbackOffsetfixes) andInterop/webaudio.ts(legacy re-export shim) are not part of theaudio/engine. Delete after confirming no build reference. - Duplicated UI helpers.
GetPlayIconandFormatTimeare each implemented twice acrossAudioPlayerBarand child controls — drift risk. Consolidate. - Misleading minimized-dock affordance. The minimized button shows a play icon but
OnClicktoggles minimize, not playback.