From 7e7ccdd6d19d32651b9327eb4e5bb1d861ea761d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 23 Jan 2025 00:16:42 +0400 Subject: [PATCH] feat(rdp): add Opus codec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau --- Cargo.lock | 22 +++++++ qemu-rdp/Cargo.toml | 1 + qemu-rdp/src/server/sound.rs | 107 ++++++++++++++++++++++++++++------- 3 files changed, 110 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index edcd748..df12993 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -450,6 +450,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "audiopus_sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651" +dependencies = [ + "cmake", + "log 0.4.25", + "pkg-config", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -3151,6 +3162,16 @@ dependencies = [ "paste", ] +[[package]] +name = "opus" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6526409b274a7e98e55ff59d96aafd38e6cd34d46b7dbbc32ce126dffcd75e8e" +dependencies = [ + "audiopus_sys", + "libc", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -3688,6 +3709,7 @@ dependencies = [ "futures-util", "ironrdp", "keycodemap", + "opus", "pixman-sys", "qemu-display", "rustc_tools_util", diff --git a/qemu-rdp/Cargo.toml b/qemu-rdp/Cargo.toml index 16fafff..6088980 100644 --- a/qemu-rdp/Cargo.toml +++ b/qemu-rdp/Cargo.toml @@ -34,6 +34,7 @@ zbus.workspace = true enumflags2 = "0.7.10" dirs = "6.0" rustc_tools_util = "0.4.0" +opus = "0.3" [build-dependencies] rustc_tools_util = "0.4.0" diff --git a/qemu-rdp/src/server/sound.rs b/qemu-rdp/src/server/sound.rs index 55c7c5f..4cdb982 100644 --- a/qemu-rdp/src/server/sound.rs +++ b/qemu-rdp/src/server/sound.rs @@ -26,9 +26,11 @@ enum State { #[derive(Debug)] pub struct Inner { state: State, + dbus_nsamples: Option, start_time: Instant, ev_sender: Option>, - rdp_started: bool, + client_fmt: Option, + opus_enc: opus::Encoder, _audio: Option