Orbiscreen v0.27.1
Trackpad stability, latency cure for long sessions, persistent toolbar, and a real audio output device: RelativeMove now drives the true relative mouse on the host so the cursor stays put when you lift your finger (#77), accumulated session lag is hard-dropped the moment it exceeds 80 ms with EWMA clock smoothing preventing false positives (#77), the in-session toolbar no longer vanishes after 12 seconds, and "Orbiscreen Audio" now appears as a proper PipeWire/PulseAudio output device you can route any app to from system sound settings.
Bug Fixes
- Trackpad cursor jumps to primary screen on finger lift (#77):
PointerEvent::RelativeMoveinx11.rswas injected into thetabletuinput device as absoluteAbs::X/YwithBTN_TOOL_PEN. When the finger lifted, the pen-proximity signal stopped and KWin snapped the cursor back to the primary screen. Fixed by routingRelativeMovetomouse_keyboardas true relativeRel::X/Rel::Yevents. The cursor now stays exactly where it was on the secondary screen with no jump. References #77. - Trackpad tap-to-click lands at wrong position:
moveDelta()inInputDispatcher.ktaccumulatedpendingDx/pendingDyfor the network loop but never updatedcursorX/cursorY. WhenleftClick()fired it sent aMoveto the stale center-of-screen position. Fixed by also updatingcursorX/cursorYcumulatively inmoveDelta()with boundary clamping. References #77. - Latency accumulation after long sessions (#77): After 30-60 minutes ExoPlayer's internal buffer drifted ahead of real time. Added a coroutine in
PlayerHolder.ktthat checksbufferedPosition - currentPositionevery 2 seconds and callsseekToDefaultPosition()+ IDR request when lag exceeds 80 ms. Closes #77. - Wi-Fi clock jitter causing false stale-frame drops:
clockOffsetNswas updated raw on every PONG packet, so a single high-latency packet could spike the offset and trigger unnecessary IDR requests. Applied EWMA smoothing (alpha = 0.1) so the offset follows the trend, not individual outliers. Closes #77. - Keyframe dropped during stale-frame flush (Wi-Fi): The stale-frame guard in
UdpPlayer.ktdiscarded all frames including keyframes when measured latency exceeded 75 ms, causing a decoder freeze until the next IDR arrived. Fixed by exempting keyframes from the drop condition so the decoder can recover immediately. Closes #77. - Session toolbar closes automatically: A
LaunchedEffect(showControls)block was automatically hiding the controls after a 12-second delay. Removed the effect entirely; the toolbar now stays visible until the user explicitly taps the eye button. References #76.
Features & Improvements
- Virtual Audio Sink "Orbiscreen Audio": When a client connects with
audio=1, the host now callsensure_virtual_sink()which usespactl load-module module-null-sinkto create a dedicated sink namedorbiscreen_audiowith description "Orbiscreen Audio". The GStreamer pipeline captures fromorbiscreen_audio.monitorinstead of@DEFAULT_MONITOR@. The sink appears as a standard output device in GNOME/KDE sound settings and any application or system audio can be routed to it. The sink is idempotent -- it is only created if it does not already exist.
Changed
- Cargo Workspace: Bumped workspace package version to
0.27.1. - Android Client: Incremented
versionCodeto83; updatedversionNameto"0.27.1". - Tauri GUI: Updated
tauri.conf.jsonversion to0.27.1. - PKGBUILD: Bumped
pkgverto0.27.1. - debian/changelog: Added
0.27.1-1release entry for Ubuntu noble.