From c25acc155d869332e497e612c197e5a4f2f23e57 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 14 Oct 2022 10:37:10 +0200 Subject: [PATCH] Move ownership of `MacOSDisplay` to the rust side --- crates/capture/src/main.rs | 10 ++-------- .../Sources/LiveKitBridge/LiveKitBridge.swift | 2 +- crates/live_kit/src/live_kit.rs | 8 ++------ 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/crates/capture/src/main.rs b/crates/capture/src/main.rs index b248f071f14225c2c5e8c964426b97895d3fcecf..e56bdf8fead1ca151dfb15cc2df3e66686ec2efc 100644 --- a/crates/capture/src/main.rs +++ b/crates/capture/src/main.rs @@ -59,14 +59,8 @@ fn main() { room2.connect(&live_kit_url, &user2_token).await.unwrap(); cx.add_window(Default::default(), |cx| ScreenCaptureView::new(room2, cx)); - let display = live_kit::display_sources() - .await - .unwrap() - .into_iter() - .next() - .unwrap(); - - let track = LocalVideoTrack::screen_share_for_display(display); + let display_sources = live_kit::display_sources().await.unwrap(); + let track = LocalVideoTrack::screen_share_for_display(display_sources.first().unwrap()); room1.publish_video_track(&track).await.unwrap(); }) .detach(); diff --git a/crates/live_kit/LiveKitBridge/Sources/LiveKitBridge/LiveKitBridge.swift b/crates/live_kit/LiveKitBridge/Sources/LiveKitBridge/LiveKitBridge.swift index 7109e6dcf3161074f7fe4390c873a38d2438a5dd..b33b0ecdb442e1d9f4574ce9e9222fc150d95cf1 100644 --- a/crates/live_kit/LiveKitBridge/Sources/LiveKitBridge/LiveKitBridge.swift +++ b/crates/live_kit/LiveKitBridge/Sources/LiveKitBridge/LiveKitBridge.swift @@ -88,7 +88,7 @@ public func LKRoomPublishVideoTrack(room: UnsafeRawPointer, track: UnsafeRawPoin @_cdecl("LKCreateScreenShareTrackForDisplay") public func LKCreateScreenShareTrackForDisplay(display: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer { - let display = Unmanaged.fromOpaque(display).takeRetainedValue() + let display = Unmanaged.fromOpaque(display).takeUnretainedValue() let track = LocalVideoTrack.createMacOSScreenShareTrack(source: display, preferredMethod: .legacy) return Unmanaged.passRetained(track).toOpaque() } diff --git a/crates/live_kit/src/live_kit.rs b/crates/live_kit/src/live_kit.rs index f2d61c261a7df69f6a29515f806aaf4e1a004022..f8a94f6ae57bf24d7feba2198f16d2a39eae1471 100644 --- a/crates/live_kit/src/live_kit.rs +++ b/crates/live_kit/src/live_kit.rs @@ -187,11 +187,8 @@ impl Drop for RoomDelegate { pub struct LocalVideoTrack(*const c_void); impl LocalVideoTrack { - pub fn screen_share_for_display(display: MacOSDisplay) -> Self { - let ptr = display.0; - let this = Self(unsafe { LKCreateScreenShareTrackForDisplay(ptr) }); - std::mem::forget(display); - this + pub fn screen_share_for_display(display: &MacOSDisplay) -> Self { + Self(unsafe { LKCreateScreenShareTrackForDisplay(display.0) }) } } @@ -259,7 +256,6 @@ pub fn display_sources() -> impl Future>> { let sources = CFArray::wrap_under_get_rule(sources); let sources_vec = sources.iter().map(|source| MacOSDisplay(*source)).collect(); let _ = tx.send(Ok(sources_vec)); - std::mem::forget(sources); // HACK: If I drop the CFArray, all the objects inside it get dropped and we get issues accessing the display later. } } }