cleanup: room & dependencies (#76)

This commit is contained in:
Théo Monnom
2023-05-25 20:13:34 +02:00
committed by GitHub
parent a9e6865137
commit 05ad1c95af
46 changed files with 1094 additions and 1031 deletions
+14 -16
View File
@@ -6,14 +6,8 @@ use crate::{events::AsyncCmd, video_grid::VideoGrid};
use egui::{Rounding, Stroke};
use egui_wgpu::WgpuConfiguration;
use futures::StreamExt;
use livekit::prelude::*;
use livekit::webrtc::audio_stream::native::NativeAudioStream;
use livekit::webrtc::video_frame::native::I420BufferExt;
use livekit::SimulateScenario;
use parking_lot::Mutex;
use std::collections::HashMap;
@@ -37,7 +31,7 @@ use winit::{
};
struct Session {
room: Room,
room: Arc<Room>,
logo_track: LogoTrack,
sine_track: SineTrack,
close_tx: oneshot::Sender<()>,
@@ -114,9 +108,10 @@ pub fn run(rt: tokio::runtime::Runtime) {
let res = Room::connect(&url, &token).await;
if let Ok((room, room_events)) = res {
let room = Arc::new(room);
let (close_tx, close_rx) = oneshot::channel();
let logo_track = LogoTrack::new(room.session());
let sine_track = SineTrack::new(room.session());
let logo_track = LogoTrack::new(room.clone());
let sine_track = SineTrack::new(room.clone());
let handle = tokio::spawn(room_task(
state.clone(),
room_events,
@@ -148,7 +143,7 @@ pub fn run(rt: tokio::runtime::Runtime) {
}
AsyncCmd::SimulateScenario { scenario } => {
if let Some(session) = state.session.lock().as_ref() {
let _ = session.room.session().simulate_scenario(scenario).await;
let _ = session.room.simulate_scenario(scenario).await;
}
}
AsyncCmd::ToggleLogo => {
@@ -164,7 +159,11 @@ pub fn run(rt: tokio::runtime::Runtime) {
AsyncCmd::ToggleSine => {
if let Some(session) = state.session.lock().as_mut() {
let sine_track = &mut session.sine_track;
sine_track.publish().await.unwrap();
if !sine_track.is_published() {
sine_track.publish().await.unwrap();
} else {
sine_track.unpublish().await.unwrap();
}
}
}
}
@@ -401,15 +400,15 @@ impl App {
{
// Room Info
if let Some(session) = self.state.session.lock().as_ref() {
ui.label(format!("Name: {}", session.room.session().name()));
ui.label(format!("SID: {}", session.room.session().sid()));
ui.label(format!("Name: {}", session.room.name()));
ui.label(format!("SID: {}", session.room.sid()));
ui.label(format!(
"ConnectionState: {:?}",
session.room.session().connection_state()
session.room.connection_state()
));
ui.label(format!(
"ParticipantCount: {:?}",
session.room.session().participants().len() + 1
session.room.participants().len() + 1
));
}
}
@@ -459,7 +458,6 @@ impl App {
self.state.session.lock().as_ref().and_then(|session| {
session
.room
.session()
.participants()
.get(participant_sid)
.map(|p| p.name())
+5 -5
View File
@@ -38,15 +38,15 @@ struct TrackHandle {
pub struct LogoTrack {
rtc_source: NativeVideoSource,
session: RoomSession,
room: Arc<Room>,
handle: Option<TrackHandle>,
}
impl LogoTrack {
pub fn new(session: RoomSession) -> Self {
pub fn new(room: Arc<Room>) -> Self {
Self {
rtc_source: NativeVideoSource::default(),
session,
room,
handle: None,
}
}
@@ -67,7 +67,7 @@ impl LogoTrack {
let task = tokio::spawn(Self::track_task(close_rx, self.rtc_source.clone()));
self.session
self.room
.local_participant()
.publish_track(
LocalTrack::Video(track.clone()),
@@ -93,7 +93,7 @@ impl LogoTrack {
let _ = handle.close_tx.send(());
let _ = handle.task.await;
self.session
self.room
.local_participant()
.unpublish_track(handle.track.sid(), true)
.await?;
+24 -19
View File
@@ -1,7 +1,6 @@
use livekit::options::{AudioCaptureOptions, TrackPublishOptions};
use livekit::webrtc::audio_frame::AudioFrame;
use livekit::{prelude::*, webrtc::audio_source::native::NativeAudioSource};
use parking_lot::Mutex;
use std::sync::Arc;
use std::time::Duration;
use tokio::sync::oneshot;
@@ -27,7 +26,6 @@ impl Default for FrameData {
}
struct TrackHandle {
frame_data: Arc<Mutex<FrameData>>,
close_tx: oneshot::Sender<()>,
track: LocalAudioTrack,
task: JoinHandle<()>,
@@ -35,19 +33,23 @@ struct TrackHandle {
pub struct SineTrack {
rtc_source: NativeAudioSource,
session: RoomSession,
room: Arc<Room>,
handle: Option<TrackHandle>,
}
impl SineTrack {
pub fn new(session: RoomSession) -> Self {
pub fn new(room: Arc<Room>) -> Self {
Self {
rtc_source: NativeAudioSource::default(),
session,
room,
handle: None,
}
}
pub fn is_published(&self) -> bool {
self.handle.is_some()
}
pub async fn publish(&mut self) -> Result<(), RoomError> {
let (close_tx, close_rx) = oneshot::channel();
let track = LocalAudioTrack::create_audio_track(
@@ -60,14 +62,9 @@ impl SineTrack {
self.rtc_source.clone(),
);
let data = Arc::new(Mutex::new(FrameData::default()));
let task = tokio::spawn(Self::track_task(
close_rx,
self.rtc_source.clone(),
data.clone(),
));
let task = tokio::spawn(Self::track_task(close_rx, self.rtc_source.clone()));
self.session
self.room
.local_participant()
.publish_track(
LocalTrack::Audio(track.clone()),
@@ -79,7 +76,6 @@ impl SineTrack {
.await?;
let handle = TrackHandle {
frame_data: data,
close_tx,
track,
task,
@@ -89,11 +85,21 @@ impl SineTrack {
Ok(())
}
async fn track_task(
_close_rx: oneshot::Receiver<()>,
rtc_source: NativeAudioSource,
frame_options: Arc<Mutex<FrameData>>,
) {
pub async fn unpublish(&mut self) -> Result<(), RoomError> {
if let Some(handle) = self.handle.take() {
handle.close_tx.send(()).ok();
handle.task.await.ok();
self.room
.local_participant()
.unpublish_track(handle.track.sid(), true)
.await?;
}
Ok(())
}
async fn track_task(_close_rx: oneshot::Receiver<()>, rtc_source: NativeAudioSource) {
let mut data = FrameData::default();
let mut interval = tokio::time::interval(Duration::from_millis(10));
let mut samples_10ms = Vec::<i16>::new();
@@ -102,7 +108,6 @@ impl SineTrack {
interval.tick().await;
let mut data = frame_options.lock();
let samples_count_10ms = (data.sample_rate / 100) as usize * NUM_CHANNELS;
if samples_10ms.capacity() != samples_count_10ms {
+1
View File
@@ -141,6 +141,7 @@ impl VideoGrid {
}
}
#[allow(dead_code)]
impl VideoGrid {
pub fn min_video_size(mut self, min_video_size: egui::Vec2) -> Self {
self.min_video_size = min_video_size;
+6 -7
View File
@@ -2,15 +2,14 @@ use futures::StreamExt;
use livekit::webrtc::native::yuv_helper;
use livekit::webrtc::prelude::*;
use livekit::webrtc::video_stream::native::NativeVideoStream;
use std::{
ops::DerefMut,
sync::{Arc, Mutex},
};
use parking_lot::Mutex;
use std::{ops::DerefMut, sync::Arc};
use tracing::debug_span;
pub struct VideoRenderer {
internal: Arc<Mutex<RendererInternal>>,
#[allow(dead_code)]
rtc_track: RtcVideoTrack,
}
@@ -109,7 +108,7 @@ impl VideoRenderer {
let span = debug_span!("texture_upload");
let _enter = span.enter();
let mut internal = internal.lock().unwrap();
let mut internal = internal.lock();
let buffer = frame.buffer.to_i420();
let width: u32 = buffer.width().try_into().unwrap();
@@ -174,6 +173,6 @@ impl VideoRenderer {
}
pub fn texture_id(&self) -> Option<egui::TextureId> {
self.internal.lock().unwrap().egui_texture.clone()
self.internal.lock().egui_texture.clone()
}
}