mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-09-19 02:41:10 +03:00
* fix(audio): add streaming resampler * fix(audio): preserve stream resampling state * fix(audio): keep playback callback nonblocking * fix(audio): decouple capture conversion from dasp * fix(audio): support stateful samplerate backend * refactor(audio): isolate stream callback state * refactor(audio): group capture output options * fix(audio): clear stale playback state after startup failure Reset non-Linux playback state when stream startup fails to prevent new-format audio from using the previous stream or resampler. Add regression tests for failed format changes and successful playback. Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): honor capture resampler selection and reuse buffers Use the selected resampling backend for fixed-frame capture. Convert samples directly into the input queue and reuse the PCM frame buffer. Add tests for anti-aliasing, thread transfer, and partial-frame draining. Signed-off-by: fufesou <linlong1266@gmail.com> * refact: reduce diffs Signed-off-by: fufesou <linlong1266@gmail.com> * test(audio): check resampler output count and passband energy Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): reset incompatible Linux playback state on startup failure Preserve compatible output streams when replacement startup fails. Clear state when no compatible stream exists and cover both paths in tests. Signed-off-by: fufesou <linlong1266@gmail.com> * perf(audio): reuse PCM buffers in the capture pipeline - Reuse capture framing, resampling, and channel conversion buffers - Deliver borrowed packets and write Sinc output into reusable storage - Add allocation and output-equivalence regression tests Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): smooth buffer discard discontinuities Signal receiver PCM discards and fade from the current playback output when the callback reaches the new timeline. Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): add missing Cargo.toml Signed-off-by: fufesou <linlong1266@gmail.com> * perf(audio): move capture encoding off the CPAL callback Move Opus encoding and service delivery to a dedicated worker. Use a preallocated bounded PCM queue with explicit loss reporting. Add tests for callback allocations and queue saturation. Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): smooth capture gaps and report losses during backlog Signed-off-by: fufesou <linlong1266@gmail.com> * feat(audio): report capture queue high-water mark Track peak queued PCM packets and log the approximate queued audio duration alongside capture loss statistics. Signed-off-by: fufesou <linlong1266@gmail.com> * refact(audio): reduce diffs Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): avoid blocking capture on encoder queue contention Use preallocated queues with try_lock in the capture callback. Count and drop the current packet on contention, preserving drop-oldest behavior on overflow. Add regressions for paused workers, buffer reuse, and sequence wrap. Signed-off-by: fufesou <linlong1266@gmail.com> * fix: add the missing files Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): isolate zero-gate state per encoder Signed-off-by: fufesou <linlong1266@gmail.com> * refact: reduce diffs Signed-off-by: fufesou <linlong1266@gmail.com> * refact(audio): simple refactor Signed-off-by: fufesou <linlong1266@gmail.com> * fix(audio): avoid waiting on playback callback locks Use one PCM try_lock attempt and preserve queued samples during contention. Replace readiness locking with per-stream atomic status and report callback errors from the receiving thread. Cover callback progress, retained audio, recovery, and poisoned-buffer handling. * fix(audio): restart capture after processing errors Stop further processing until the service recreates the stream. Document the guard as defensive recovery for an unconfirmed failure. Group capture and resampler submodules under their parent directories. Signed-off-by: fufesou <linlong1266@gmail.com> * audio: report capture queue contention drops separately - Add contention_dropped to loss reports while preserving total drop counts - Document packet rejection on contention even when buffers are available - Extend existing contention and saturation test assertions Signed-off-by: fufesou <linlong1266@gmail.com> * refact unit tests Signed-off-by: fufesou <linlong1266@gmail.com> --------- Signed-off-by: fufesou <linlong1266@gmail.com>
274 lines
10 KiB
TOML
274 lines
10 KiB
TOML
[package]
|
|
name = "rustdesk"
|
|
version = "1.5.0"
|
|
authors = ["rustdesk <info@rustdesk.com>"]
|
|
edition = "2021"
|
|
build= "build.rs"
|
|
description = "RustDesk Remote Desktop"
|
|
default-run = "rustdesk"
|
|
rust-version = "1.75"
|
|
|
|
[lib]
|
|
name = "librustdesk"
|
|
crate-type = ["cdylib", "staticlib", "rlib"]
|
|
|
|
[[bin]]
|
|
name = "naming"
|
|
path = "src/naming.rs"
|
|
|
|
[[bin]]
|
|
name = "service"
|
|
path = "src/service.rs"
|
|
|
|
[features]
|
|
inline = []
|
|
use_samplerate = ["samplerate", "libsamplerate-sys"]
|
|
use_rubato = ["rubato"]
|
|
use_dasp = ["dasp"]
|
|
flutter = ["flutter_rust_bridge"]
|
|
default = ["use_dasp"]
|
|
hwcodec = ["scrap/hwcodec"]
|
|
vram = ["scrap/vram"]
|
|
mediacodec = ["scrap/mediacodec"]
|
|
drm = ["scrap/drm"]
|
|
# The display wake, as its OWN compile gate on top of `drm`. Everything else in the drm backend
|
|
# READS (it captures a scanout); the wake WRITES, injecting one synthetic pointer event from the
|
|
# root service so a compositor that idle-disabled its outputs re-enables them. That is a different
|
|
# kind of operation and deserves a switch that can remove it from the binary entirely, without
|
|
# giving up DRM capture: `--features drm` builds the capture path with no wake code compiled in.
|
|
drm-wake = ["drm"]
|
|
linux-pkg-config = ["magnum-opus/linux-pkg-config", "scrap/linux-pkg-config"]
|
|
unix-file-copy-paste = [
|
|
"dep:x11-clipboard",
|
|
"dep:x11rb",
|
|
"dep:percent-encoding",
|
|
"dep:once_cell",
|
|
"clipboard/unix-file-copy-paste",
|
|
]
|
|
screencapturekit = ["cpal/screencapturekit"]
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[dependencies]
|
|
async-trait = "0.1"
|
|
scrap = { path = "libs/scrap", features = ["wayland"] }
|
|
hbb_common = { path = "libs/hbb_common", features = ["webrtc"] }
|
|
base = { path = "libs/base" }
|
|
serde_derive = "1.0"
|
|
serde = "1.0"
|
|
serde_json = "1.0"
|
|
serde_repr = "0.1"
|
|
cfg-if = "1.0"
|
|
lazy_static = "1.4"
|
|
sha2 = "0.10"
|
|
repng = "0.2"
|
|
parity-tokio-ipc = { git = "https://github.com/rustdesk-org/parity-tokio-ipc" }
|
|
magnum-opus = { git = "https://github.com/rustdesk-org/magnum-opus" }
|
|
dasp = { version = "0.11", features = ["signal", "interpolate-linear", "interpolate"], optional = true }
|
|
rubato = { version = "0.12", optional = true }
|
|
samplerate = { version = "0.2", optional = true }
|
|
libsamplerate-sys = { version = "0.1.12", optional = true }
|
|
uuid = { version = "1.3", features = ["v4"] }
|
|
num_cpus = "1.15"
|
|
bytes = { version = "1.4", features = ["serde"] }
|
|
default-net = "0.14"
|
|
wol-rs = "1.0"
|
|
flutter_rust_bridge = { version = "=1.80", features = ["uuid"], optional = true}
|
|
errno = "0.3"
|
|
rdev = { git = "https://github.com/rustdesk-org/rdev" }
|
|
url = { version = "2.3", features = ["serde"] }
|
|
crossbeam-queue = "0.3"
|
|
hex = "0.4"
|
|
chrono = "0.4"
|
|
cidr-utils = "0.5"
|
|
fon = "0.6"
|
|
shutdown_hooks = "0.1"
|
|
totp-rs = { version = "5.4", default-features = false, features = ["gen_secret", "otpauth"] }
|
|
stunclient = "0.4"
|
|
kcp-sys= { git = "https://github.com/rustdesk-org/kcp-sys", branch = "rustdesk-patches" }
|
|
reqwest = { version = "0.12", features = ["blocking", "socks", "json", "native-tls", "rustls-tls", "rustls-tls-native-roots", "gzip", "zstd"], default-features=false }
|
|
|
|
[target.'cfg(not(target_os = "linux"))'.dependencies]
|
|
# https://github.com/rustdesk/rustdesk/discussions/10197, not use cpal on linux
|
|
cpal = { git = "https://github.com/rustdesk-org/cpal", branch = "osx-screencapturekit" }
|
|
ringbuf = "0.3"
|
|
|
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
|
mac_address = "1.1"
|
|
sciter-rs = { git = "https://github.com/rustdesk-org/rust-sciter", branch = "dyn" }
|
|
sys-locale = "0.3"
|
|
enigo = { path = "libs/enigo", features = [ "with_serde" ] }
|
|
clipboard = { path = "libs/clipboard" }
|
|
ctrlc = "3.2"
|
|
# arboard = { version = "3.4", features = ["wayland-data-control"] }
|
|
arboard = { git = "https://github.com/rustdesk-org/arboard", features = ["wayland-data-control"] }
|
|
clipboard-master = { git = "https://github.com/rustdesk-org/clipboard-master" }
|
|
portable-pty = { git = "https://github.com/rustdesk-org/wezterm", branch = "rustdesk/pty_based_0.8.1", package = "portable-pty" }
|
|
|
|
system_shutdown = "4.0"
|
|
qrcode-generator = "4.1"
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
winapi = { version = "0.3", features = [
|
|
"winuser",
|
|
"wincrypt",
|
|
"shellscalingapi",
|
|
"pdh",
|
|
"synchapi",
|
|
"memoryapi",
|
|
"shellapi",
|
|
"devguid",
|
|
"setupapi",
|
|
"cguid",
|
|
"cfgmgr32",
|
|
"ioapiset",
|
|
"winspool",
|
|
] }
|
|
windows = { version = "0.61", features = [
|
|
"Win32",
|
|
"Win32_Foundation",
|
|
"Win32_Security",
|
|
"Win32_Security_Authorization",
|
|
"Win32_Storage_FileSystem",
|
|
"Win32_System",
|
|
"Win32_System_Com",
|
|
"Win32_System_Diagnostics",
|
|
"Win32_System_Diagnostics_ToolHelp",
|
|
"Win32_System_Environment",
|
|
"Win32_System_IO",
|
|
"Win32_System_Memory",
|
|
"Win32_System_Pipes",
|
|
"Win32_System_Registry",
|
|
"Win32_System_SystemInformation",
|
|
"Win32_System_Threading",
|
|
"Win32_UI_Shell",
|
|
"Win32_UI_WindowsAndMessaging",
|
|
] }
|
|
winreg = "0.11"
|
|
windows-service = "0.6"
|
|
virtual_display = { path = "libs/virtual_display" }
|
|
remote_printer = { path = "libs/remote_printer" }
|
|
impersonate_system = { git = "https://github.com/rustdesk-org/impersonate-system" }
|
|
shared_memory = "0.12"
|
|
tauri-winrt-notification = "0.1"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
objc = "0.2"
|
|
cocoa = "0.24"
|
|
dispatch = "0.2"
|
|
core-foundation = "0.9"
|
|
core-graphics = "0.22"
|
|
include_dir = "0.7"
|
|
fruitbasket = "0.10"
|
|
objc_id = "0.1"
|
|
# If we use piet "0.7" here, we must also update core-graphics to "0.24".
|
|
piet = "0.6"
|
|
piet-coregraphics = "0.6"
|
|
foreign-types = "0.3"
|
|
|
|
[target.'cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))'.dependencies]
|
|
tray-icon = { git = "https://github.com/tauri-apps/tray-icon", version = "0.21.3" }
|
|
tao = { git = "https://github.com/rustdesk-org/tao", branch = "dev" }
|
|
image = "0.24"
|
|
|
|
[target.'cfg(any(target_os = "macos", target_os = "linux"))'.dependencies]
|
|
keepawake = { git = "https://github.com/rustdesk-org/keepawake-rs" }
|
|
|
|
[target.'cfg(any(target_os = "windows", target_os = "linux"))'.dependencies]
|
|
wallpaper = { git = "https://github.com/rustdesk-org/wallpaper.rs" }
|
|
tiny-skia = "0.11"
|
|
softbuffer = "0.4"
|
|
fontdb = "0.23"
|
|
bytemuck = "1.23"
|
|
ttf-parser = "0.25"
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
libxdo-sys = "0.11"
|
|
psimple = { package = "libpulse-simple-binding", version = "2.27" }
|
|
pulse = { package = "libpulse-binding", version = "2.27" }
|
|
rust-pulsectl = { git = "https://github.com/rustdesk-org/pulsectl" }
|
|
async-process = "1.7"
|
|
evdev = { git="https://github.com/rustdesk-org/evdev" }
|
|
dbus = "0.9"
|
|
dbus-crossroads = "0.5"
|
|
x11-clipboard = {git="https://github.com/clslaid/x11-clipboard", branch = "feat/store-batch", optional = true}
|
|
x11rb = {version = "0.12", features = ["all-extensions"], optional = true}
|
|
percent-encoding = {version = "2.3", optional = true}
|
|
once_cell = {version = "1.18", optional = true}
|
|
nix = { version = "0.29", features = ["term", "process"]}
|
|
gtk = "0.18"
|
|
termios = "0.3"
|
|
terminfo = "0.8"
|
|
winit = "0.30"
|
|
|
|
[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies]
|
|
openssl = { version = "0.10", features = ["vendored"] }
|
|
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
android_logger = "0.13"
|
|
jni = "0.21"
|
|
android-wakelock = { git = "https://github.com/rustdesk-org/android-wakelock" }
|
|
|
|
[workspace]
|
|
members = ["libs/scrap", "libs/hbb_common", "libs/base", "libs/enigo", "libs/clipboard", "libs/virtual_display", "libs/virtual_display/dylib", "libs/portable", "libs/remote_printer"]
|
|
exclude = ["vdi/host"]
|
|
|
|
# Patch libxdo-sys to use a stub implementation that doesn't require libxdo
|
|
# This allows building and running on systems without libxdo installed (e.g., Wayland-only)
|
|
[patch.crates-io]
|
|
libxdo-sys = { path = "libs/libxdo-sys-stub" }
|
|
# One branch off upstream v0.13.0, the tag whose crate versions match this stack.
|
|
# webrtc-util: reads the Windows adapter list's IPv6 addresses as host-order u16 groups, so every
|
|
# one comes out byte-swapped, fails to bind, and ICE gathers no IPv6 host candidate on Windows.
|
|
# webrtc-sctp: RFC 4960's 1s RTO floor makes a single loss cost 1-3s on a link whose RTT is 24-64ms,
|
|
# and fast retransmit cannot cover a request/response exchange; INITIAL_MTU 1228 also fragments on
|
|
# IPv6; and its AIMD pins a lossy long-haul link to MSS/(RTT*sqrt(p)), so a switch sends without
|
|
# a congestion window, as KCP does - on by default, `allow-webrtc-congestion-control` opts back in.
|
|
# Sending that way, a reordering window keeps a chunk that is merely late from being resent on a
|
|
# path that jitters, every DATA chunk asks for its SACK at once so a lost tail is back within an
|
|
# RTT at KCP's RTO floors, and bundles of small chunks stay within the MTU. A T3-rtx resends
|
|
# everything outstanding when it packs into four packets and otherwise probes with one and lets
|
|
# the SACK settle the rest (F-RTO), timed from the latest send, so a stall no longer resends the
|
|
# whole backlog behind itself while a short lost tail still comes back at once.
|
|
# Pinned by rev, not branch: a fork branch can be rewritten out from under the lockfile.
|
|
webrtc-util = { git = "https://github.com/rustdesk-org/webrtc", rev = "db3b07a9dd8f195916c89c2e62a8911402b11d27" }
|
|
webrtc-sctp = { git = "https://github.com/rustdesk-org/webrtc", rev = "db3b07a9dd8f195916c89c2e62a8911402b11d27" }
|
|
|
|
[package.metadata.winres]
|
|
LegalCopyright = "Copyright © 2026 Purslane Tech Pte. Ltd. All rights reserved."
|
|
ProductName = "RustDesk"
|
|
FileDescription = "RustDesk Remote Desktop"
|
|
OriginalFilename = "rustdesk.exe"
|
|
|
|
[target.'cfg(target_os="windows")'.build-dependencies]
|
|
winres = "0.1"
|
|
winapi = { version = "0.3", features = [ "winnt", "pdh", "synchapi" ] }
|
|
|
|
[build-dependencies]
|
|
cc = "1.0"
|
|
hbb_common = { path = "libs/hbb_common" }
|
|
os-version = "0.2"
|
|
|
|
[dev-dependencies]
|
|
hound = "3.5"
|
|
docopt = "1.1"
|
|
tokio = { version = "1.44", features = ["test-util"] }
|
|
|
|
[package.metadata.bundle]
|
|
name = "RustDesk"
|
|
identifier = "com.carriez.rustdesk"
|
|
icon = ["res/32x32.png", "res/128x128.png", "res/128x128@2x.png"]
|
|
osx_minimum_system_version = "10.14"
|
|
|
|
#https://github.com/johnthagen/min-sized-rust
|
|
[profile.release]
|
|
lto = true
|
|
codegen-units = 1
|
|
panic = 'abort'
|
|
strip = true
|
|
#opt-level = 'z' # only have smaller size after strip
|
|
rpath = true
|
|
|
|
[profile.dev]
|
|
debug = 1
|