Merge - Streaming Winner #2
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Finish the Settings "Apply" behavior so changing streaming quality mid-track switches format immediately instead of only persisting the cookie for the next play. - SettingsMenu reads the AudioPlayerProvider cascade and threads the player into StreamQualitySetting as an explicit parameter (the MudMenu panel portals to MudPopoverProvider, outside the cascade scope, so a [CascadingParameter] there lands null). StreamQualitySetting's Apply persists the cookie, then asks the player to reload preserving position. - Add a "load at timestamp" path to the player rather than restart-from-0-then- seek (which audibly played the start and raced the just-started scheduler into a crash). ReloadPreservingPositionAsync loads the track in the newly-resolved format beginning DIRECTLY at the saved position: * new JS resolveStreamOffset(position) resolves the file-absolute byte offset with no playback/buffer state (Opus from its sidecar immediately; WAV after a header probe), * StartFromPositionAsync converges onto the existing seek/refill loop (RunSegmentedStreamAsync with a non-null seekPosition) so the decoder reinitializes for a header-less Range continuation and starts playback at the target, * ProbeHeaderAsync feeds the byte-0 segment to the decoder WITHOUT starting playback until the WAV header parses (bounded by 256 KB); the probe buffers are dropped by the continuation's clearForSeek, so nothing is audible. - IStreamingPlayerService gains ReloadPreservingPositionAsync; the QueueService test fake implements it.