use std::cell::{Cell, RefCell};
use medea_client_api_proto::{MediaType, TrackId as Id};
#[derive(Debug, Eq, PartialEq)]
pub struct MediaTrack {
id: Id,
mid: RefCell<Option<String>>,
media_type: MediaType,
transceiver_enabled: Cell<bool>,
send_media_state: MediaState,
recv_media_state: MediaState,
}
impl MediaTrack {
#[inline]
#[must_use]
pub fn new(id: Id, media_type: MediaType) -> Self {
Self {
id,
mid: RefCell::new(None),
media_type,
transceiver_enabled: Cell::new(true),
send_media_state: MediaState::default(),
recv_media_state: MediaState::default(),
}
}
#[inline]
#[must_use]
pub fn id(&self) -> Id {
self.id
}
#[inline]
#[must_use]
pub fn media_type(&self) -> &MediaType {
&self.media_type
}
#[inline]
pub fn set_mid(&self, mid: String) {
self.mid.borrow_mut().replace(mid);
}
#[inline]
#[must_use]
pub fn mid(&self) -> Option<String> {
self.mid.borrow_mut().as_ref().cloned()
}
#[inline]
pub fn set_transceiver_enabled(&self, enabled: bool) {
self.transceiver_enabled.set(enabled);
}
#[inline]
#[must_use]
pub fn is_transceiver_enabled(&self) -> bool {
self.transceiver_enabled.get()
}
#[inline]
#[must_use]
pub fn is_enabled_general(&self) -> bool {
self.send_media_state.is_enabled() && self.recv_media_state.is_enabled()
}
#[inline]
#[must_use]
pub fn recv_media_state(&self) -> &MediaState {
&self.recv_media_state
}
#[inline]
#[must_use]
pub fn send_media_state(&self) -> &MediaState {
&self.send_media_state
}
}
#[derive(Debug, Eq, PartialEq)]
pub struct MediaState {
muted: Cell<bool>,
enabled: Cell<bool>,
}
impl Default for MediaState {
#[inline]
fn default() -> Self {
Self {
enabled: Cell::new(true),
muted: Cell::new(false),
}
}
}
impl MediaState {
#[inline]
#[must_use]
pub fn is_enabled(&self) -> bool {
self.enabled.get()
}
#[inline]
#[must_use]
pub fn is_muted(&self) -> bool {
self.muted.get()
}
#[inline]
pub fn set_muted(&self, muted: bool) {
self.muted.set(muted);
}
#[inline]
pub fn set_enabled(&self, enabled: bool) {
self.enabled.set(enabled);
}
}