1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
//! Wrapper around [`sys::MediaStreamTrack`] received from //! [getUserMedia()][1]/[getDisplayMedia()][2] request. //! //! [1]: https://w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia //! [2]: https://w3.org/TR/screen-capture/#dom-mediadevices-getdisplaymedia use std::rc::Rc; use medea_client_api_proto::MediaSourceKind; use wasm_bindgen::prelude::*; use web_sys as sys; use crate::{media::MediaKind, JsMediaSourceKind}; /// Wrapper around [`sys::MediaStreamTrack`] received from from /// [getUserMedia()][1]/[getDisplayMedia()][2] request. /// /// Underlying [`sys::MediaStreamTrack`] is stopped on this [`Track`]'s /// [`Drop`]. /// /// [1]: https://w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia /// [2]: https://w3.org/TR/screen-capture/#dom-mediadevices-getdisplaymedia #[derive(Debug)] pub struct Track { /// Actual [`sys::MediaStreamTrack`]. track: sys::MediaStreamTrack, /// Underlying [`sys::MediaStreamTrack`] source kind. source_kind: MediaSourceKind, /// Underlying [`sys::MediaStreamTrack`] kind. kind: MediaKind, /// Reference to the parent [`Track`]. /// /// Parent will be [`None`] if this [`Track`] wasn't forked from another /// [`Track`]. /// /// This field is used only for holding strong reference to the parent. _parent: Option<Rc<Self>>, } impl Track { /// Builds a new [`Track`] from the provided [`sys::MediaStreamTrack`] and /// [`MediaSourceKind`]. /// /// # Panics /// /// If the given [`sys::MediaStreamTrack`]'s kind is not `audio` or `video`. #[must_use] pub fn new( track: sys::MediaStreamTrack, source_kind: MediaSourceKind, ) -> Self { let kind = match track.kind().as_ref() { "audio" => MediaKind::Audio, "video" => MediaKind::Video, _ => unreachable!(), }; Self { track, source_kind, kind, _parent: None, } } /// Changes [`enabled`][1] attribute on the underlying /// [MediaStreamTrack][2]. /// /// [1]: https://tinyurl.com/w3-streams#dom-mediastreamtrack-enabled /// [2]: https://w3.org/TR/mediacapture-streams/#mediastreamtrack #[inline] pub fn set_enabled(&self, enabled: bool) { self.track.set_enabled(enabled); } /// Returns [`id`] of underlying [MediaStreamTrack][2]. /// /// [`id`]: https://w3.org/TR/mediacapture-streams/#dom-mediastreamtrack-id /// [2]: https://w3.org/TR/mediacapture-streams/#mediastreamtrack #[inline] #[must_use] pub fn id(&self) -> String { self.track.id() } /// Returns this [`Track`]'s media source kind. #[inline] #[must_use] pub fn media_source_kind(&self) -> MediaSourceKind { self.source_kind } /// Returns this [`Track`]'s kind (audio/video). #[inline] #[must_use] pub fn kind(&self) -> MediaKind { self.kind } /// Forks this [`Track`]. /// /// Creates new [`sys::MediaStreamTrack`] from this [`Track`]'s /// [`sys::MediaStreamTrack`] using [`clone()`][1] method. /// /// Forked [`Track`] will hold a strong reference to this [`Track`]. /// /// [1]: https://w3.org/TR/mediacapture-streams/#dom-mediastreamtrack-clone #[must_use] pub fn fork(self: &Rc<Self>) -> Self { let parent = Rc::clone(self); let track = sys::MediaStreamTrack::clone(&self.track); Self { track, kind: self.kind, source_kind: self.source_kind, _parent: Some(parent), } } /// Returns reference to the underlying [`sys::MediaStreamTrack`] of this /// [`Track`]. #[inline] #[must_use] pub fn sys_track(&self) -> &sys::MediaStreamTrack { &self.track } } impl Drop for Track { #[inline] fn drop(&mut self) { self.track.stop(); } } /// Wrapper around strongly referenced [`Track`] for JS side. #[wasm_bindgen(js_name = LocalMediaTrack)] pub struct JsTrack(Rc<Track>); impl JsTrack { /// Creates new [`JsTrack`] from the provided [`Track`]. #[inline] #[must_use] pub fn new(track: Rc<Track>) -> Self { JsTrack(track) } } #[wasm_bindgen(js_class = LocalMediaTrack)] impl JsTrack { /// Returns the underlying [`sys::MediaStreamTrack`] of this [`JsTrack`]. #[must_use] pub fn get_track(&self) -> sys::MediaStreamTrack { Clone::clone(self.0.track.as_ref()) } /// Returns [`MediaKind::Audio`] if this [`JsTrack`] represents an audio /// track, or [`MediaKind::Video`] if it represents a video track. #[must_use] pub fn kind(&self) -> MediaKind { self.0.kind() } /// Returns [`JsMediaSourceKind::Device`] if this [`JsTrack`] is sourced /// from some device (webcam/microphone), or [`JsMediaSourceKind::Display`] /// if ot is captured via [MediaDevices.getDisplayMedia()][1]. /// /// [1]: https://w3.org/TR/screen-capture/#dom-mediadevices-getdisplaymedia #[must_use] pub fn media_source_kind(&self) -> JsMediaSourceKind { self.0.media_source_kind().into() } }