cleanup: room & dependencies (#76)
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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?;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user