Repository navigation
Releases: sh00bx/aurora-ds5
Release list
Aurora DS5 1.7.41
Default pad latency follows the TV
The 35 ms default of 1.7.40 relies on a fix that only matches the Bluetooth stack build of the LG G4 it was developed on. Aurora now checks this per TV:
- Stack recognised: default pad latency 35 ms, as before.
- Any other stack (other firmware builds, Realtek Bluetooth chips, no root): default 70 ms, nothing in the stack is touched.
A latency you set yourself is kept either way.
Fixes for TVs with a different stack
- 1.7.40 searched an unknown stack every 10 s while a pad was connected, on the thread that feeds the pad. That search takes 30–100 ms and could cause audio gaps. It now runs only while no pad is bound, and ever more rarely (10 s to 5 min).
- The stack's memory is opened read-only until a write is actually due, and is only written after the code at that address has been re-checked.
Fix on the G4
- If the daemon was stopped during a session (for example by an app update), the Magic Remote stayed slow to wake until the end of the next stream. The daemon now puts the original values back when it starts.
To switch the mechanism off: touch /tmp/ds5_leconn_off on the TV (the default then reads 70 ms).
Aurora DS5 1.7.40
DualSense audio and haptics at half the buffer
The TV's Bluetooth stack keeps searching for the sleeping Magic Remote, scanning 30 ms out of every 100 ms, and the radio serves that search ahead of the controller. Pad audio and haptics arrived in bursts, up to 71 ms late, which is why the pad needed a 65–70 ms buffer.
While a pad is connected, Aurora's root daemon now shortens that search to 2.5 ms every 159 ms (in the running stack's memory only; the original values return when no pad is bound). Measured on an LG G4: longest radio gap 25 → 12 ms, and a 35 ms pad buffer plays without dropouts.
- Default pad latency is now 35 ms (was 60).
- The Magic Remote takes a little longer to wake while a pad is connected.
- Needs root (Homebrew Channel elevation). On a TV whose Bluetooth stack is not recognised nothing is changed; if the pad speaker crackles there, raise the latency slider to about 70 ms.
- To switch the mechanism off:
touch /tmp/ds5_leconn_offon the TV.
Also in this release (since 1.7.24)
- Per-controller settings and modes: HID, X360, DS4, DS5, Switch; lightbar colour per mode; per-game mode lock.
- DS4 support including the pad speaker.
- Pseudo-VRR frame pacing and audio drift trim.
- Cheaper controller auto-plug polling (removes a once-a-second input hitch).
- Overlay, on-screen keyboard and USB keyboard fixes.
Aurora DS5 1.7.24
Aurora DS5 1.7.24 — touchpad cursor in the menus, HOME key, stream diagnostics, CPU baseline
New:
- The controller touchpad moves a mouse cursor through Aurora's own menus (launcher, settings): tap or pad click selects, two-finger scroll, the cursor accelerates with speed. Hovering a game in the launcher focuses it. Menu cursor speed defaults to 150 %; toggle under Settings > Input ("touchpad_ui_mouse", on by default). (1.7.20–1.7.23)
- The HOME key inside the app opens the device's default home screen instead of always LG's launcher. (1.7.17)
- Stream diagnostics: reassembly time and frame arrival cadence in the stats overlay (
reasm avg/max) and onevideo windowline per stats window in the log. (1.7.18)
Fixes:
- The pinned stats panel can be unpinned again, and its legend stays inside the panel. (1.7.19)
- A touchpad click swallowed by the stream still releases the key state. (1.7.23)
- Build: the app is compiled for the webOS SDK's CPU baseline (Cortex-A9, NEON/VFPv3) instead of NEON-VFPv4. Earlier builds could crash with an illegal instruction on older TVs whose CPU lacks VFPv4; newer TVs are unaffected. (1.7.24)
Aurora DS5 1.7.16
Aurora DS5 1.7.16 — incremental deep review 2026-09-13 (stages 1 + 2)
Fixes, stage 1 (1.7.15):
- Gamepad mode no longer disables the on-screen keyboard for the IP and custom-resolution fields; A/ENTER opens it on the first press.
- A character typed through the webOS keyboard no longer disables the USB-keyboard fallback for the rest of the run.
- Game mode: a sound preset you change mid-session is no longer reverted at session end (only a coupled change within 15 s of the picture switch is).
- Custom-FPS editor: no reconnect prompt without a real change; AV1 gate log no longer promises H.264 above 60 fps.
- DS5 mic uplink (TV half): honest socket-depth comment, outbox eviction also sheds mic frames, receiver only starts on the raw-ACL path.
- USB keyboard: a device opened while the input gate was closed is no longer grabbed-but-silent.
Fixes, stage 2 (1.7.16):
- Forgetting a host while its status update is still running no longer creates a ghost entry that ends in a fatal assert.
- The host-update worker copies the address under the lock (use-after-free class).
- "Forget" is offered only for the stale twin of a host that took over its identity, never for the live one and never before the first status query; forgetting is persisted immediately.
- Build: SDL-webOS now comes from the sh00bx/SDL-webOS fork (branch aurora/webos.5-uevent) in every build, so the channel IPK has the same joystick hotplug as the locally built one; the variant is logged at startup ("SDL2 uevent@74b8a735").
- DS4 volume comment corrected.
Full report with evidence chains: workspace archive deep-review-2026-09-13-incremental.md.
Aurora DS5 1.7.14
Aurora DS5 1.7.14
DS5 microphone uplink (plumbing, default off).
ds5_txd: on the HCI monitor, the DualSense's Bluetooth0x31audio-in reports (71 B Opus, 48 kHz stereo, 10 ms) are forwarded as datagrams to a per-controller socket, gated by the lever file/tmp/ds5_mic. With the lever absent — the default — nothing is read or sent.- App: those frames are relayed over the bridge transport to the host only when the host advertises the DS5-mic capability.
- No arming: the microphone is never armed while
hid-playstationis bound; arming stays on the push-to-talk path (unbind → arm → rebind).
Pairs with the Vibepollo host half (ds5_native_mic, default off). Inert on the TV until the PTT path sets the lever.
Also carries the wave-2 client work already running on 1.7.13.
Aurora DS5 1.7.13
Everything since 1.5.10, which is what the channel was still serving.
DualShock 4 bridging (1.6.0 – 1.6.2)
DS4 pads now bridge against the native host the same way DS5 does, instead of
falling back to a lossy generic-HID path. Layout-B report decoding, battery
readout, audio-route reporting, and key-repeat stall handling all ship for
DS4 alongside the existing DS5 path.
Controller idle-off (1.6.3 – 1.6.6, fixed in 1.7.6)
An unused controller now powers itself off after a configurable timeout
(0–30 minutes, default 5), the same way a PS5 does — luna hid/disconnect
drops the link and the pad switches itself off. A poll()-return bug meant
that with two pads connected, the daemon only ever watched the first one, so
the active pad could be disconnected mid-session; fixed in the 1.7.6 review
pass below.
Interface (1.6.7, 1.7.0 – 1.7.3)
Perf overlay redesigned around render-queue depth instead of a derived FPS
number, plus a device-load line. Settings sheet reworked for D-pad
navigation. Delayed tooltip bubbles on focus instead of instant popups.
Deep review round (1.7.4 – 1.7.6)
Eighteen findings from an incremental review of everything since 1.5.9. The
one major (P0): the idle-off poll() bug above. The rest: DS4 sessions weren't
tagged as audio-active for stall telemetry, DS4 had no input-neutralize so
overlay/keyboard presses leaked into the game underneath it, a stale
recency-latch on the webOS-touchpad grab-veto, a blocking send on the LVGL
thread that could freeze the UI, and an HDR/10-bit-style gate that HEVC
refresh lost when it moved panes. Also: honest reconnect prompts (a plain
D-pad pass over the bitrate slider no longer claims a change happened), and a
scan-restore marker written before, not after, the scan-off HCI command.
Input UX (1.7.7 / 1.7.8)
USB keyboards can now drive the streaming overlay — the keyboard grab used
for the on-screen keyboard didn't follow the same gate as the rest of the UI,
so overlay and the HID sheet never saw a keypress. Typing into LVGL text
fields works without SDL_TEXTINPUT, which webOS doesn't deliver for raw USB
keyboards. Custom-FPS editor rebuilt D-pad-first (stepper with hold-repeat,
NTSC checkbox, live readout) after the old dropdown/textarea combination had
several dead ends, including a silent no-op when entering exactly a preset's
NTSC value.
Audio, decoder stats, and stability (1.7.9 – 1.7.12)
Upstream ports from the 2026-09-11 sweep. DS5 speaker volume now reaches the
audible range while keeping the host's own cancel bits. Decode-latency
readout smoothed. And a crash fix: an "Unstable connection" notice was being
posted to an LVGL label straight from moonlight-common-c's video receive
thread — LVGL isn't thread-safe, so a flaky host connection that flapped the
status often enough could corrupt the heap and glyph cache. It now goes
through the same UI-thread post as the rest of the stream stats.
Port-plan wave 2, client side (1.7.13)
Daemon and rig now understand the 0x35 short-packet audio report alongside
0x36/0x39. Game mode now notices when the TV's own sound-mode pairing drags
the panel's picture/sound preset along mid-session and restores it. SDL-webOS
webos.5 with uevent-based controller hotplug is available as an opt-in local
build (-DAURORA_SDL2_LOCAL_REPO); the CI/release build is unaffected and
keeps shipping the webos.5 tarball path.
Built by CI from this tag. Installs through the Homebrew Channel:
https://raw.githubusercontent.com/sh00bx/webos-apps/main/repo.json
Aurora DS5 1.5.10
Everything since 1.5.4, which is what the channel was still serving.
Audio (1.5.10)
5.1 could go silent for seconds at a time, and the cause turned out not to be
the codec. Audio decoding ran on Limelight's RTP receive thread
(CAPABILITY_DIRECT_SUBMIT), so anything slow in the audio path stopped the
socket being read, and at 4K bitrates that loses packets until the sound cuts
out. On webOS the audio path now runs on Limelight's own decoder thread
instead. The bundled ss4s carries the other half: the surround transcode and the
5.1 channel remap no longer hold the player lock — holding it across a re-encode
blocked the video feed for the whole encode — and the transcode itself runs at
complexity 0, which is cheap and, at 512 kbit for six channels, transparent.
The Opus stream, coupled and mapping values the host sends are now logged at
startup, so the remaining 5.1 channel-order question can be settled by reading
rather than guessing.
Deep review round (1.5.8, 1.5.9)
Forty-three findings from a full review of the client. The critical one was a
use-after-free in the HID sheet; the rest spread across game mode (a failed tick
no longer loses the preset, mid-teardown restarts and shell races survive), the
DS5 link (the flush lever is per link and foreign HCI traffic can no longer move
it; the flush timeout survives a pin flap and dies with its connection), and
auto-plug (it gives up eventually instead of retrying forever, and the touchpad
grab follows the foreground app).
Ports from upstream (1.5.9)
- 10-bit video, gated behind the same HDR capability check as the HDR option
— offering a 10-bit format is the HDR request on this protocol, so it cannot
be offered independently. - Controller battery is reported to the host (
LI_CCAP_BATTERY_STATE). - Network priority before the stream starts: receive buffers are raised
before the sockets are created, which is the only order that works, since
net.core.rmem_maxonly clamps sockets made after it. - Game mode learned the mechanics upstream had and we did not: a cryptofs root
probe, acurrent_appretry, no-op detection before setting, and an HDR
switch mid-session. The key policy is unchanged — still one key, still no
sound preset.
Interface (1.5.5 – 1.5.7)
Touchpad-mouse setting, decluttered menus, a static HID sheet height so the
sheet stops hopping when a bridged pad is selected, and a Close button that is
reachable with the arrow keys.
Built by CI from this tag. Installs through the Homebrew Channel:
https://raw.githubusercontent.com/sh00bx/webos-apps/main/repo.json
Aurora DS5 1.5.4
Aurora DS5 1.5.4
Rollup of 1.5.0–1.5.4 (previous release: 1.4.19).
Highlights since 1.4.19
- TV game mode now ships in the IPK (1.5.3): engaged automatically while a stream runs (via Homebrew Channel root exec) — stops WiFi-coex background services, quiets WiFi-Direct discovery, pins CPUs against the MP governor, boosts stream threads, and switches picture/sound to the TV's game presets with full restore at stream end. Toggle: Settings → Basic → "TV game mode while streaming".
- Deep UI rework (1.5.0–1.5.1): one design language for launcher, settings and overlay; settings as category sheet; unified palette and focus styling; auto-resume and auto-plug reliability fixes (1.5.2).
- Input fixes (1.5.4): no more double navigation steps after main-loop stalls; DualSense touchpad is grabbed on webOS so edge swipes no longer inject BACK/HOME; mouse wheel now scrolls the topmost dialog instead of the list behind it.
- 5.1 audio channel order (1.5.4): correct device channel order on the webOS 6-channel PCM path (remap in the feed; no more surroundParams override).
- NDJSON frame diagnostics (1.5.4, off by default):
touch /tmp/aurora_frame_diag.enablein the app jail, stream, then read/tmp/aurora_frame_diag.ndjson— per-frame feed timing, PTS and render-queue depth for pacing analysis.
Notes
- No dbgsym archive for this release (Release build).
Aurora DS5 1.4.19
The streaming overlay has been rebuilt around a single palette shared by the
command bar and the HID passthrough sheet.
- Colour says what a thing is, white says where you are. Each command in the
bottom bar wears the LG remote colour key that triggers it as a rail on its
leading edge, and a bridged device wears teal on its row. Focus is white only:
the focused slab lifts behind a chalk border, so a focus ring never disappears
into a scene of the same hue. - HID passthrough sheet reworked. Header, device list and settings are now
three zones the arrow keys move within, instead of one flat focus chain. The
whole device row is the control OK acts on — the separate plug button is gone —
and the toggles are switches, which sit in the same right-hand gutter as the
sliders and are a far bigger target from the couch. - Nothing over the game is fully opaque, so the stream stays readable through
the sheet.
Fixes
- The remote's green key was mapped to a point nobody ever wrote and clicked
the top-left corner of the screen; HID Devices sat on a button index no key
can reach. HID Devices is now on green, and unused indices are parked
off-screen where a click finds no object. - The BRIDGED badge in the controller list kept the purple of the old HID
button; it is teal now, the same colour a bridged device carries in the sheet.
Runtime beyond "it starts and draws" is not verified yet.
Aurora DS5 1.4.15
The fork installs beside upstream Aurora and had been sharing its icon, which
left two identical tiles on the TV home screen. The icon now carries a small
DS5 mark, sized so it is still legible at the 130 px webOS icon.
The mark is generated rather than painted: the branding sources stay untouched
and scripts/gen_aurora_logo.py stamps it, so its size and position are
constants. The splash keeps the upstream AURORA TV lockup.
Also fixed along the way: src/app/res/gen/*.h is committed rather than built,
so regenerating the icon would have left the app compiling the previous bytes.
The header is emitted from the same script now. It had already drifted — it
declared 7302 bytes against a 5793-byte source image.
No functional changes to streaming, input or the bundled DualSense daemon;
ds5_txd is byte-identical to 1.4.0 (md5 a5524813257d2b8a0e67cadfc170da62).