WIP: Use audio support to send live data
This commit is contained in:
parent
bbf05c8eac
commit
ce3847c9fc
4 changed files with 62 additions and 12 deletions
|
@ -183,14 +183,6 @@ public func LKRoomVideoTracksForRemoteParticipant(room: UnsafeRawPointer, partic
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@_cdecl("LKCreateScreenShareTrackForDisplay")
|
|
||||||
public func LKCreateScreenShareTrackForDisplay(display: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
|
|
||||||
let display = Unmanaged<MacOSDisplay>.fromOpaque(display).takeUnretainedValue()
|
|
||||||
let track = LocalVideoTrack.createMacOSScreenShareTrack(source: display, preferredMethod: .legacy)
|
|
||||||
return Unmanaged.passRetained(track).toOpaque()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@_cdecl("LKLocalAudioTrackCreateTrack")
|
@_cdecl("LKLocalAudioTrackCreateTrack")
|
||||||
public func LKLocalAudioTrackCreateTrack() -> UnsafeMutableRawPointer {
|
public func LKLocalAudioTrackCreateTrack() -> UnsafeMutableRawPointer {
|
||||||
let track = LocalAudioTrack.createTrack(options: AudioCaptureOptions(
|
let track = LocalAudioTrack.createTrack(options: AudioCaptureOptions(
|
||||||
|
@ -201,6 +193,27 @@ public func LKLocalAudioTrackCreateTrack() -> UnsafeMutableRawPointer {
|
||||||
return Unmanaged.passRetained(track).toOpaque()
|
return Unmanaged.passRetained(track).toOpaque()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@_cdecl("LKCreateScreenShareTrackForDisplay")
|
||||||
|
public func LKCreateScreenShareTrackForDisplay(display: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
|
||||||
|
let display = Unmanaged<MacOSDisplay>.fromOpaque(display).takeUnretainedValue()
|
||||||
|
let track = LocalVideoTrack.createMacOSScreenShareTrack(source: display, preferredMethod: .legacy)
|
||||||
|
return Unmanaged.passRetained(track).toOpaque()
|
||||||
|
}
|
||||||
|
|
||||||
|
@_cdecl("LKRemoteAudioTrackStart")
|
||||||
|
public func LKRemoteAudioTrackStart(track: UnsafeRawPointer, onStart: @escaping @convention(c) (UnsafeRawPointer, Bool) -> Void, callbackData: UnsafeRawPointer) {
|
||||||
|
let track = Unmanaged<Track>.fromOpaque(track).takeUnretainedValue() as! RemoteAudioTrack
|
||||||
|
|
||||||
|
track.start().then { success in
|
||||||
|
onStart(callbackData, success)
|
||||||
|
}
|
||||||
|
.catch { _ in
|
||||||
|
onStart(callbackData, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@_cdecl("LKVideoRendererCreate")
|
@_cdecl("LKVideoRendererCreate")
|
||||||
public func LKVideoRendererCreate(data: UnsafeRawPointer, onFrame: @escaping @convention(c) (UnsafeRawPointer, CVPixelBuffer) -> Bool, onDrop: @escaping @convention(c) (UnsafeRawPointer) -> Void) -> UnsafeMutableRawPointer {
|
public func LKVideoRendererCreate(data: UnsafeRawPointer, onFrame: @escaping @convention(c) (UnsafeRawPointer, CVPixelBuffer) -> Bool, onDrop: @escaping @convention(c) (UnsafeRawPointer) -> Void) -> UnsafeMutableRawPointer {
|
||||||
Unmanaged.passRetained(LKVideoRenderer(data: data, onFrame: onFrame, onDrop: onDrop)).toOpaque()
|
Unmanaged.passRetained(LKVideoRenderer(data: data, onFrame: onFrame, onDrop: onDrop)).toOpaque()
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use gpui::{actions, keymap_matcher::Binding, Menu, MenuItem};
|
use gpui::{actions, keymap_matcher::Binding, Menu, MenuItem};
|
||||||
use live_kit_client::{LocalVideoTrack, RemoteVideoTrackUpdate, Room, LocalAudioTrack, RemoteAudioTrackUpdate};
|
use live_kit_client::{LocalVideoTrack, RemoteVideoTrackUpdate, Room, LocalAudioTrack, RemoteAudioTrackUpdate};
|
||||||
|
@ -69,6 +72,11 @@ fn main() {
|
||||||
panic!("unexpected message");
|
panic!("unexpected message");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let res = room_b.remote_audio_tracks("test-participant-1")[0].start().await;
|
||||||
|
println!("Attempting to start: {:?}", res);
|
||||||
|
let timer = cx.background().timer(Duration::from_secs(10));
|
||||||
|
timer.await;
|
||||||
|
|
||||||
let remote_audio_track = room_b
|
let remote_audio_track = room_b
|
||||||
.remote_audio_tracks("test-participant-1")
|
.remote_audio_tracks("test-participant-1")
|
||||||
.pop()
|
.pop()
|
||||||
|
|
|
@ -84,7 +84,17 @@ extern "C" {
|
||||||
) -> *const c_void;
|
) -> *const c_void;
|
||||||
|
|
||||||
fn LKRemoteAudioTrackGetSid(track: *const c_void) -> CFStringRef;
|
fn LKRemoteAudioTrackGetSid(track: *const c_void) -> CFStringRef;
|
||||||
fn LKVideoTrackAddRenderer(track: *const c_void, renderer: *const c_void);
|
fn LKRemoteAudioTrackStart(
|
||||||
|
track: *const c_void,
|
||||||
|
callback: extern "C" fn(*mut c_void, bool),
|
||||||
|
callback_data: *mut c_void
|
||||||
|
);
|
||||||
|
|
||||||
|
fn LKVideoTrackAddRenderer(
|
||||||
|
track: *const c_void,
|
||||||
|
renderer: *const c_void
|
||||||
|
,
|
||||||
|
);
|
||||||
fn LKRemoteVideoTrackGetSid(track: *const c_void) -> CFStringRef;
|
fn LKRemoteVideoTrackGetSid(track: *const c_void) -> CFStringRef;
|
||||||
|
|
||||||
fn LKDisplaySources(
|
fn LKDisplaySources(
|
||||||
|
@ -307,7 +317,6 @@ impl Room {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn remote_audio_track_updates(&self) -> mpsc::UnboundedReceiver<RemoteAudioTrackUpdate> {
|
pub fn remote_audio_track_updates(&self) -> mpsc::UnboundedReceiver<RemoteAudioTrackUpdate> {
|
||||||
let (tx, rx) = mpsc::unbounded();
|
let (tx, rx) = mpsc::unbounded();
|
||||||
self.remote_audio_track_subscribers.lock().push(tx);
|
self.remote_audio_track_subscribers.lock().push(tx);
|
||||||
|
@ -552,8 +561,25 @@ impl RemoteAudioTrack {
|
||||||
pub fn publisher_id(&self) -> &str {
|
pub fn publisher_id(&self) -> &str {
|
||||||
&self.publisher_id
|
&self.publisher_id
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
pub fn start(&self) -> futures::channel::oneshot::Receiver<bool> {
|
||||||
|
let (tx, rx) = futures::channel::oneshot::channel();
|
||||||
|
|
||||||
|
extern "C" fn on_start(callback_data: *mut c_void, success: bool) {
|
||||||
|
unsafe {
|
||||||
|
let tx =
|
||||||
|
Box::from_raw(callback_data as *mut futures::channel::oneshot::Sender<bool>);
|
||||||
|
tx.send(success).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
LKRemoteAudioTrackStart(self.native_track, on_start, Box::into_raw(Box::new(tx)) as *mut c_void)
|
||||||
|
}
|
||||||
|
|
||||||
|
rx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RemoteVideoTrack {
|
pub struct RemoteVideoTrack {
|
||||||
|
@ -639,7 +665,6 @@ pub enum RemoteAudioTrackUpdate {
|
||||||
Unsubscribed { publisher_id: Sid, track_id: Sid },
|
Unsubscribed { publisher_id: Sid, track_id: Sid },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct MacOSDisplay(*const c_void);
|
pub struct MacOSDisplay(*const c_void);
|
||||||
|
|
||||||
impl MacOSDisplay {
|
impl MacOSDisplay {
|
||||||
|
|
|
@ -476,6 +476,10 @@ impl RemoteAudioTrack {
|
||||||
pub fn publisher_id(&self) -> &str {
|
pub fn publisher_id(&self) -> &str {
|
||||||
&self.publisher_id
|
&self.publisher_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn start(&self) -> futures::channel::oneshot::Receiver<bool> {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue