Add pixelpass --doctor environment diagnostic
Screen-share failures are usually environment gaps, not pixelpass bugs — most often a GPU/driver with no working VA-API H.264 encoder, so the default vah264enc pipeline produces no video and the viewer "can't connect." doctor probes the whole chain and prints one actionable report so a remote tester can read it over a call instead of us guessing from logs, and it validates any X11/Wayland test environment we stand up. Checks (each a ✓/!/✗ line with a distro-aware install hint): - display server (Wayland/X11 + session env), and the X server vendor/ version so an xlibre server is distinguishable from stock Xorg - capture: gst tools + the backend's source element (pipewiresrc/ximagesrc) - encode: hardware H.264 (vah264enc + DRM render node + a VA-API H.264 *encode* entrypoint parsed from vainfo) and the software x264 fallback - mux/audio tail + pactl - viewer player (mpv/vlc) - network: binds a real endpoint and checks relay reachability Unlike deps::check_host_binaries (bails on first miss), doctor runs every check and reports them together. Closes with a specific hosting verdict and exits non-zero on any hard failure so scripts/CI can gate. Pure seams (vainfo entrypoint parse, summary tally, hosting verdict) are unit-tested; deps.rs gained pub(crate) which/gst_element_exists/install-hint/distro helpers so doctor reuses the same package-name knowledge. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
mod cli;
|
||||
mod common;
|
||||
mod doctor;
|
||||
#[cfg(feature = "gui")]
|
||||
mod gui;
|
||||
mod host;
|
||||
@@ -36,6 +37,13 @@ async fn main() -> Result<()> {
|
||||
}
|
||||
}
|
||||
|
||||
// Diagnostics run before pipewire::init() (they don't need it) and work
|
||||
// regardless of the `gui` feature, so a headless tester can probe their box.
|
||||
if cli.doctor {
|
||||
let relay = common::endpoint::relay_override(cli.relay.as_deref());
|
||||
return doctor::run(relay).await;
|
||||
}
|
||||
|
||||
// libpipewire requires global init before any pw_* call. Idempotent;
|
||||
// safe to call even when the per-app audio thread never spawns.
|
||||
pipewire::init();
|
||||
|
||||
Reference in New Issue
Block a user