Skip to content

Auralis 2.0.0: UPnP/DLNA media server, OpenHome/UPnP AV renderer zones, playback + UI fixes - #9

Merged
QrowZK merged 2 commits into
mainfrom
claude/auralis-2
Jul 18, 2026
Merged

Auralis 2.0.0: UPnP/DLNA media server, OpenHome/UPnP AV renderer zones, playback + UI fixes#9
QrowZK merged 2 commits into
mainfrom
claude/auralis-2

Conversation

@QrowZK

@QrowZK QrowZK commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Auralis goes 2.0: full network audio in both directions, plus the round of playback and UI fixes from rig testing. Supersedes #8 (same content, now versioned 2.0.0).

Network audio — serve

(Settings → Media Server)

  • UPnP/DLNA media server with real SSDP presence (NOTIFY heartbeats + M-SEARCH responder, persistent device UUID). Any streamer on the LAN sees "Auralis" as a browsable library.
  • ContentDirectory tree: Albums / Artists / Genres / All Tracks / Playlists — smart playlists included, snapshots pushed from the UI so the rules engine stays in one place.
  • Audiophile-grade serving: DIDL-Lite with sampleFrequency, bitsPerSample, duration, album art; Range-capable streaming with DLNA contentFeatures/transferMode headers; files go out bit-for-bit untouched — no transcoding, ever.
  • Configurable name + port; auto-resumes on app start.

Network audio — drive

(Settings → Output Engine → Network Renderer)

  • Discover UPnP AV and OpenHome renderers (WiiM, Linn, Lumin, Cambridge, Volumio, …) and use one as Auralis's output zone: transport, seek, volume, queue, shuffle, smart playlists — the whole UI drives the streamer.
  • Gapless via SetNextAVTransportURI (UPnP AV) or playlist Insert (OpenHome), with track-advance detection (TrackURI match / position-wrap with a seek-to-zero guard).
  • Signal path honesty: source → HTTP serve (bit-perfect) → renderer; DSP controls no-op past the network boundary.
  • Offline renderer at boot falls back to standard output with a toast; engine switches fully release the departing device.

Playback & UI fixes

  • Queue auto-advance stall (native engine): the decoder's final sub-frame tail blocked the advance check forever — the native path never moved to the next queue entry. Tail is now flushed as a zero-padded final frame (PCM + DSD). Verified by drain simulation.
  • Bit-perfect toggle static / broken volume / frozen meters (carried from post-Auralis 1.5.0: signal path, SoX resampling + dither, IR convolution, WASAPI exclusive + DoP, smart playlists + ratings #6 rig testing): stream reopens when the processing mode changes even if the wire format matches; meters blank instead of freezing.
  • Sticky glow ring on transport buttons: buttons blur after real mouse clicks; keyboard focus keeps its ring.
  • Lyrics sync drift: auto-scroll geometry fixed (position: relative on the scroll container so offsetTop resolves correctly); LRC [offset:±ms] honored; stale highlight cleared on back-seek; auto-scroll yields for 3.5 s after manual scrolling.

Verification

  • Mock-renderer suite, 24 assertions: AV + OpenHome command ordering, gapless advance, natural end, seek-wrap guard, pause/resume/volume.
  • Full-stack Xvfb run: a mock streamer with real SSDP presence was discovered in the settings UI and pulled FLAC from the media server (HTTP 206, audio/flac, DLNA headers) while the player bar tracked its reported position.
  • Auto-advance drain simulation (7 assertions) and a live lyrics screenshot with the correctly-stamped line highlighted.
  • Remaining test only you can run: a real streamer on your network.

🤖 Generated with Claude Code

https://claude.ai/code/session_0125mBkda6C4Yv2CiekXA6uW


Generated by Claude Code

claude added 2 commits July 18, 2026 13:44
- Auto-advance: the decoder's final chunk almost never lands on a frame
  boundary, so a sub-frame tail sat in the residual buffer forever and
  _maybeAdvance refused to fire — the native engine never advanced to
  the next queued track. Flush the tail as a zero-padded final frame on
  decoder close (PCM and DSD paths). Verified with a drain simulation:
  advance fires only after the queue empties, natural end still stops.
- Button glow: a mouse click leaves the button focused and a later
  keypress (Space = play/pause) promotes it to a visible focus ring that
  sticks. Blur buttons after real pointer clicks; keyboard activation
  keeps its ring.
- Lyrics: the auto-scroll used offsetTop against the wrong offsetParent
  (.np-lyrics-scroll was not positioned), centering the active line on a
  garbage coordinate — position:relative fixes the geometry. Also honor
  LRC [offset:±ms] tags, clear the stale highlight when seeking back
  before the first stamp, and pause auto-scroll for 3.5s after a manual
  wheel scroll so it stops fighting the reader.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0125mBkda6C4Yv2CiekXA6uW
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0125mBkda6C4Yv2CiekXA6uW
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants