rust_webrtc/client/src/media.rs

54 lines
2.2 KiB
Rust
Raw Normal View History

2025-05-01 16:57:03 +03:00
use protocol::Error;
use wasm_bindgen_futures::JsFuture;
use web_sys::{
MediaStream, MediaStreamConstraints, MediaStreamTrack, MediaTrackConstraints,
wasm_bindgen::{JsCast, JsValue},
window,
};
2025-05-01 16:57:03 +03:00
pub async fn audio() -> Result<MediaStream, Error> {
let media_devices = window()
.ok_or(Error::MediaStream("Accessing Window".to_owned()))?
.navigator()
.media_devices()
.map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let media_stream_constraints = MediaStreamConstraints::new();
let media_track_constraints = MediaTrackConstraints::new();
media_stream_constraints.set_audio(&JsValue::TRUE);
media_track_constraints.set_echo_cancellation(&JsValue::FALSE);
media_track_constraints.set_noise_suppression(&JsValue::FALSE);
media_track_constraints.set_auto_gain_control(&JsValue::FALSE);
let media_stream_promise = media_devices
.get_user_media_with_constraints(&media_stream_constraints)
2025-05-01 16:57:03 +03:00
.map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let media_stream = JsFuture::from(media_stream_promise)
.await
2025-05-01 16:57:03 +03:00
.map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let media_stream = media_stream.unchecked_ref::<MediaStream>();
let audio_stream_tracks = media_stream.get_audio_tracks();
let audio_stream_tracks = audio_stream_tracks
.iter()
2025-05-01 16:57:03 +03:00
.map(|audio_track| MediaStreamTrack::from(audio_track))
.collect::<Vec<_>>();
2025-05-01 16:57:03 +03:00
let audio_stream_track = audio_stream_tracks
.first()
.ok_or(Error::MediaStream("Get First Media Track".to_owned()))?;
let audio_stream_track_apply_constraints_promise = audio_stream_track
.apply_constraints_with_constraints(&media_track_constraints)
2025-05-01 16:57:03 +03:00
.map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
JsFuture::from(audio_stream_track_apply_constraints_promise)
.await
2025-05-01 16:57:03 +03:00
.map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let audio_stream =
MediaStream::new().map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
audio_stream.add_track(audio_stream_track);
2025-05-01 16:57:03 +03:00
Ok(audio_stream)
}