fix(vdisplay): Windows admission default is reject, not join (single-capturer limit)
Two concurrent Windows sessions both drive the same pf-vdisplay monitor's single-capturer IDD-push channel (newest-delivery-wins), which freezes the live client and can wedge the driver (observed live: a concurrent-session test wedged .173 → Moonlight 'no video'; needed a reboot). True multi-session capture is §6.6/ Stage 7. So on Windows 'separate' (incl. the unconfigured default) now resolves to REJECT — a 2nd client gets a clean 503 and the live session is protected — instead of join (which would freeze it). join/steal stay explicit opt-ins; Linux keeps separate (real multi-view). Centralized as admission::effective_conflict(), shared by the native handshake + GameStream h_launch. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -149,10 +149,9 @@ async fn h_launch(
|
||||
.unwrap()
|
||||
.as_ref()
|
||||
.map(|s| (s.owner_fp, (s.width, s.height, s.fps)));
|
||||
let conflict = crate::vdisplay::policy::prefs()
|
||||
.configured_effective()
|
||||
.map(|e| e.mode_conflict)
|
||||
.unwrap_or(crate::vdisplay::policy::ModeConflict::Separate);
|
||||
// Same Windows default as the native path (separate → reject; see `effective_conflict`) so a
|
||||
// 2nd Moonlight client gets a clean 503 rather than wedging the shared monitor's capture.
|
||||
let conflict = crate::vdisplay::admission::effective_conflict();
|
||||
match gamestream_admission(live, req_fp, conflict) {
|
||||
GsDecision::Serve => {}
|
||||
GsDecision::Join((w, h, f)) => {
|
||||
|
||||
Reference in New Issue
Block a user