mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 19:11:08 +00:00
Xbox Cloud Gaming: stream from the store and Games tab, native player with DroidDeck frame generation Stream Xbox games with Xbox Cloud Gaming (Game Pass) from DroidDeck, outside the Linux session. - Backend: `xodus-cli cloud-token` (tools/xbox/droiddeck-cloud-token.patch) gets the streaming tokens; they stay in memory. - Web player (default): the Greenlight player page (tools/xcloud-player, MIT) in a WebView, plus Microsoft's own xbox.com/play player. In-stream menu with screen effects (sharpen, colour, deband, FXAA, CRT, NTSC, Toon, fps cap), stream quality, performance overlay (level, layout, top right / top left) and rumble. - Native player (opt-in, Android 10+, Player engine: Native): Google's WebRTC (io.github.webrtc-sdk 125.6422.07, BSD) with the Greenlight protocol ported to Kotlin, in its own process (:xcloudnative) with its own instance of DroidDeck's compositor. Decoded frames reach the compositor as AHardwareBuffers (new stream mode, VK_ANDROID_external_memory_android_ hardware_buffer import), so DDFG 2x and LSFG 2x/3x/4x run on them. Live frame generation, frame-rate target (presets and a 10-165 fps slider, even pacing), zero-copy picture, small network buffer, fast decoder, instant controller input, overlay with engine and on-screen fps, background end, restart and web fallback. It takes the main process's tokens through XboxCloudTokenService; they are fetched ahead while a cloud game is shown. - The compositor requests the dma-buf import extensions only where the driver has them (the system driver has none). - Catalog: cloud availability, Game Pass plan CFQ7TTC0K6L8 counted, library filter All / Owned / Game Pass / Cloud, Stream and Add to Games on the store page, stream-only Games-tab entries (Stream + Download / Play + Stream). - Xbox games get VC++ 2015-2022 and the ARM64 runtime registry entries (vcredist2022_arm64, built in until the catalog has it) before each launch. - Controller focus reaches pickers opened from a game page (install location, uninstall); Add / Remove from Games keep the focus. Credits: Greenlight by UnknownSKL (Jim Kroon), MIT, player and protocol; Better xCloud for the resolution / OS mapping; MGamer404's Bannerlator #627 for the ARM64 runtime approach. Ported from the412banner's Bannerlator.
39 lines
2.3 KiB
Python
Executable File
39 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Reproduce the pinned Nexus source and DroidDeck credential transport."""
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
|
|
recipe = Path(__file__).resolve().parent
|
|
cache = Path(sys.argv[1]).resolve()
|
|
lock = json.loads((recipe / 'backend.lock.json').read_text())
|
|
local_patches = ['droiddeck-credentials.patch', 'droiddeck-launch-view.patch', 'droiddeck-library-subscriptions.patch',
|
|
'droiddeck-credential-fallback.patch', 'droiddeck-credential-diagnostics.patch', 'droiddeck-cloud-token.patch']
|
|
identity = hashlib.sha256((recipe / 'backend.lock.json').read_bytes() + b''.join((recipe / name).read_bytes() for name in local_patches)).hexdigest()
|
|
source = cache / ('source-' + identity[:16])
|
|
if not (source / '.prepared').is_file():
|
|
if source.exists():
|
|
raise RuntimeError('Incomplete Xbox source directory; inspect it before retrying: ' + str(source))
|
|
source.mkdir(parents=True)
|
|
nexus = cache / ('nexus-' + lock['nexusCommit'])
|
|
for directory, remote, commit in ((source, lock['repository'], lock['commit']),
|
|
(nexus, 'https://github.com/domsvoboda/xodus-nexus.git', lock['nexusCommit'])):
|
|
directory.mkdir(parents=True, exist_ok=True)
|
|
if not (directory / '.git').is_dir():
|
|
subprocess.run(['git', 'init', '-q', str(directory)], check=True)
|
|
subprocess.run(['git', '-C', str(directory), 'fetch', '-q', '--depth', '1', remote, commit], check=True)
|
|
subprocess.run(['git', '-C', str(directory), 'checkout', '-q', '--detach', 'FETCH_HEAD'], check=True)
|
|
assert subprocess.check_output(['git', '-C', str(directory), 'rev-parse', 'HEAD'], text=True).strip() == commit
|
|
assert hashlib.sha256((source / 'Cargo.lock').read_bytes()).hexdigest() == lock['cargoLockSha256']
|
|
for patch in lock['patches']:
|
|
file = nexus / 'assets' / patch['file']
|
|
assert hashlib.sha256(file.read_bytes()).hexdigest() == patch['sha256']
|
|
subprocess.run(['git', '-C', str(source), 'apply', str(file)], check=True)
|
|
for name in local_patches:
|
|
subprocess.run(['git', '-C', str(source), 'apply', str(recipe / name)], check=True)
|
|
(source / '.prepared').write_text(identity + '\n')
|
|
assert (source / '.prepared').read_text().strip() == identity
|
|
print(source)
|