use std::collections::HashMap;
use std::sync::Arc;
use std::sync::atomic::AtomicBool;
use parking_lot::RwLock;
use crate::media::FileTrack;
use crate::media::bridge::{BridgeEndpoint, BridgePeer};
use crate::media::engine::mcu_switch::McuSwitch;
use crate::media::recorder::Recorder;
pub struct MediaSession {
pub session_id: String,
pub bridge: Option<Arc<BridgePeer>>,
pub caller_is_webrtc: bool,
pub caller_codec_info: Vec<crate::media::negotiate::CodecInfo>,
pub recorder: Arc<RwLock<Option<Recorder>>>,
pub recording_paused: Arc<AtomicBool>,
pub recording_started_at: Option<std::time::Instant>,
pub playback_tracks: HashMap<String, FileTrack>,
pub bridge_playback_track_ids: Vec<String>,
pub mcu: McuSwitch,
}
impl MediaSession {
pub fn new(session_id: String) -> Self {
let mcu = McuSwitch::new(session_id.clone(), 8000);
Self {
session_id,
bridge: None,
caller_is_webrtc: false,
caller_codec_info: vec![],
recorder: Arc::new(RwLock::new(None)),
recording_paused: Arc::new(AtomicBool::new(false)),
recording_started_at: None,
playback_tracks: HashMap::new(),
bridge_playback_track_ids: Vec::new(),
mcu,
}
}
pub fn caller_endpoint(&self) -> BridgeEndpoint {
if self.caller_is_webrtc {
BridgeEndpoint::Caller
} else {
BridgeEndpoint::Callee
}
}
pub fn callee_endpoint(&self) -> BridgeEndpoint {
if self.caller_is_webrtc {
BridgeEndpoint::Callee
} else {
BridgeEndpoint::Caller
}
}
pub fn endpoint_for_leg(&self, leg_id: &str) -> BridgeEndpoint {
match leg_id {
"callee" => self.callee_endpoint(),
_ => self.caller_endpoint(),
}
}
}
impl std::fmt::Debug for MediaSession {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("MediaSession")
.field("session_id", &self.session_id)
.field("bridge_present", &self.bridge.is_some())
.field("caller_is_webrtc", &self.caller_is_webrtc)
.field("bridge_playback_track_ids", &self.bridge_playback_track_ids)
.field(
"playback_tracks",
&self.playback_tracks.keys().collect::<Vec<_>>(),
)
.finish()
}
}