use std::rc::Rc;
use derive_more::AsRef;
use medea_client_api_proto as proto;
use crate::{
media::{MediaKind, MediaSourceKind},
platform,
};
use super::MediaStreamTrackState;
#[derive(AsRef, Debug)]
pub struct Track {
#[as_ref]
track: platform::MediaStreamTrack,
source_kind: proto::MediaSourceKind,
_parent: Option<Rc<Self>>,
}
impl Track {
#[must_use]
pub const fn new(
track: platform::MediaStreamTrack,
source_kind: proto::MediaSourceKind,
) -> Self {
Self {
track,
source_kind,
_parent: None,
}
}
#[must_use]
pub const fn platform_track(&self) -> &platform::MediaStreamTrack {
&self.track
}
pub fn set_enabled(&self, enabled: bool) {
self.track.set_enabled(enabled);
}
#[must_use]
pub fn id(&self) -> String {
self.track.id()
}
#[must_use]
pub const fn media_source_kind(&self) -> proto::MediaSourceKind {
self.source_kind
}
#[allow(clippy::missing_const_for_fn)] #[must_use]
pub fn kind(&self) -> MediaKind {
self.track.kind()
}
pub fn on_ended(&self, callback: platform::Function<()>) {
self.track.on_ended(Some(move || callback.call0()));
}
pub async fn state(&self) -> MediaStreamTrackState {
self.track.ready_state().await
}
pub async fn fork(self: &Rc<Self>) -> Self {
let parent = Rc::clone(self);
let track = self.track.fork().await;
Self {
track,
source_kind: self.source_kind,
_parent: Some(parent),
}
}
pub async fn stop(&self) {
self.track.stop().await;
}
}
impl Drop for Track {
fn drop(&mut self) {
platform::spawn(Box::pin(self.track.stop()));
}
}
#[derive(Debug, Clone)]
pub struct LocalMediaTrack(Rc<Track>);
impl LocalMediaTrack {
#[must_use]
pub fn new(track: Rc<Track>) -> Self {
Self(track)
}
#[must_use]
pub fn get_track(&self) -> &platform::MediaStreamTrack {
&self.0.track
}
#[must_use]
pub fn kind(&self) -> MediaKind {
self.0.kind()
}
pub fn on_ended(&self, callback: platform::Function<()>) {
self.0.on_ended(callback);
}
pub async fn state(&self) -> MediaStreamTrackState {
self.0.state().await
}
#[must_use]
pub fn is_on_audio_level_available(&self) -> bool {
self.get_track().is_on_audio_level_available()
}
pub fn on_audio_level_changed(&self, callback: platform::Function<i32>) {
self.get_track()
.on_audio_level_changed(move |v| callback.call1(v));
}
#[must_use]
pub fn media_source_kind(&self) -> MediaSourceKind {
self.0.media_source_kind().into()
}
pub async fn maybe_stop(mut self) {
if let Some(track) = Rc::get_mut(&mut self.0) {
track.stop().await;
}
}
}