From 49022b37149b35b20bfd8591e3fd6519fd5bf84f Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Fri, 4 Jul 2025 03:41:39 -0500 Subject: [PATCH] added handshakes --- client/src/app.rs | 12 +++++------- client/src/input/camera.rs | 2 +- server/src/handshake.rs | 32 ++++++++++++++++++++++++++++++++ server/src/lib.rs | 1 + server/src/main.rs | 3 ++- 5 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 server/src/handshake.rs diff --git a/client/src/app.rs b/client/src/app.rs index b35c986..39cfca3 100644 --- a/client/src/app.rs +++ b/client/src/app.rs @@ -140,13 +140,11 @@ impl LesavkaClientApp { std::env::var("LESAVKA_CAM_SOURCE").ok().as_deref() )?); tokio::spawn(Self::cam_loop(vid_ep.clone(), cam)); - if caps.microphone { - let mic = Arc::new(MicrophoneCapture::new()?); - tokio::spawn(Self::mic_loop(vid_ep.clone(), mic)); - } } - let mic = Arc::new(MicrophoneCapture::new()?); - tokio::spawn(Self::mic_loop(vid_ep.clone(), mic)); + if caps.microphone { + let mic = Arc::new(MicrophoneCapture::new()?); + tokio::spawn(Self::voice_loop(vid_ep.clone(), mic)); // renamed + } /*────────── central reactor ───────────────────*/ tokio::select! { @@ -269,7 +267,7 @@ impl LesavkaClientApp { } /*──────────────── mic stream ─────────────────*/ - async fn mic_loop(ep: Channel, mic: Arc) { + async fn voice_loop(ep: Channel, mic: Arc) { let mut delay = Duration::from_secs(1); static FAIL_CNT: AtomicUsize = AtomicUsize::new(0); loop { diff --git a/client/src/input/camera.rs b/client/src/input/camera.rs index 1e2f8b2..c0a776f 100644 --- a/client/src/input/camera.rs +++ b/client/src/input/camera.rs @@ -81,7 +81,7 @@ impl CameraCapture { let buf = sample.buffer()?; let map = buf.map_readable().ok()?; let pts = buf.pts().unwrap_or(gst::ClockTime::ZERO).nseconds() / 1_000; - Some(VideoPacket { id: 0, pts, data: map.as_slice().to_vec() }) + Some(VideoPacket { id: 2, pts, data: map.as_slice().to_vec() }) } /// Fuzzy‑match devices under `/dev/v4l/by-id` diff --git a/server/src/handshake.rs b/server/src/handshake.rs new file mode 100644 index 0000000..7152fa5 --- /dev/null +++ b/server/src/handshake.rs @@ -0,0 +1,32 @@ +// ─── server/src/handshake.rs ─────────────────────────────────────────────── +use tonic::{Request, Response, Status}; + +use lesavka_common::lesavka::{ + Empty, HandshakeSet, + handshake_server::{Handshake, HandshakeServer}, +}; + +/// Static capabilities for now; could be probed at runtime +pub struct HandshakeSvc { + pub camera: bool, + pub microphone: bool, +} + +#[tonic::async_trait] +impl Handshake for HandshakeSvc { + async fn get_capabilities( + &self, + _req: Request, + ) -> Result, Status> { + Ok(Response::new(HandshakeSet { + camera: self.camera, + microphone: self.microphone, + })) + } +} + +impl HandshakeSvc { + pub fn server() -> HandshakeServer { + HandshakeServer::new(Self { camera: true, microphone: true }) + } +} diff --git a/server/src/lib.rs b/server/src/lib.rs index b1b4b61..38c337f 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -3,3 +3,4 @@ pub mod audio; pub mod video; pub mod gadget; +pub mod handshake; diff --git a/server/src/main.rs b/server/src/main.rs index 4c9cda1..3efef6a 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -28,7 +28,7 @@ use lesavka_common::lesavka::{ MonitorRequest, VideoPacket, AudioPacket }; -use lesavka_server::{gadget::UsbGadget, video, audio}; +use lesavka_server::{gadget::UsbGadget, video, audio, handshake::HandshakeSvc}; /*──────────────── constants ────────────────*/ /// **false** = never reset automatically. @@ -305,6 +305,7 @@ async fn main() -> anyhow::Result<()> { .tcp_nodelay(true) .max_frame_size(Some(2*1024*1024)) .add_service(RelayServer::new(handler)) + .add_service(HandshakeSvc::server()) .add_service(ReflBuilder::configure().build_v1().unwrap()) .serve(([0,0,0,0], 50051).into()) .await?;