use flutter_rust_bridge::{DartOpaque, frb};
use send_wrapper::SendWrapper;
#[cfg(doc)]
use crate::media::track::local;
use crate::{
api::{DART_HANDLER_PORT, Error, dart::api::ForeignClass},
media::{
MediaKind, MediaSourceKind, NoiseSuppressionLevel, track::local as core,
},
platform::{self, utils::dart_future::IntoDartFuture as _},
};
#[derive(Debug)]
#[frb(opaque)]
pub struct LocalMediaTrack(SendWrapper<core::LocalMediaTrackImpl>);
impl From<core::LocalMediaTrackImpl> for LocalMediaTrack {
fn from(value: core::LocalMediaTrackImpl) -> Self {
Self(SendWrapper::new(value))
}
}
impl ForeignClass for LocalMediaTrack {}
impl LocalMediaTrack {
#[frb(sync)]
#[must_use]
pub fn get_track(&self) -> DartOpaque {
DartOpaque::new(
self.0.get_track().handle() as _,
DART_HANDLER_PORT
.get()
.expect("`DART_HANDLER_PORT` must be initialized"),
)
}
#[frb(sync)]
#[must_use]
pub fn kind(&self) -> MediaKind {
self.0.kind()
}
#[frb(sync)]
#[must_use]
pub fn on_ended(&self, f: DartOpaque) {
self.0.on_ended(platform::Function::new(f));
}
#[frb(sync)]
#[must_use]
pub fn state(&self) -> DartOpaque {
let track = self.0.clone();
async move { Ok::<_, Error>(track.state().await as i64) }
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn is_on_audio_level_available(&self) -> bool {
self.0.is_on_audio_level_available()
}
#[frb(sync)]
#[must_use]
pub fn on_audio_level_changed(&self, f: DartOpaque) {
self.0
.on_audio_level_changed(platform::Function::new(f))
.unwrap_or_else(|e| {
unreachable!("cannot error on non-WASM platforms, but did: {e}")
})
}
#[frb(sync)]
#[must_use]
pub fn media_source_kind(&self) -> MediaSourceKind {
self.0.media_source_kind()
}
#[frb(sync)]
#[must_use]
pub fn is_audio_processing_available(&self) -> bool {
self.0.is_audio_processing_available()
}
#[frb(sync)]
#[must_use]
pub fn set_noise_suppression_enabled(&self, enabled: bool) -> DartOpaque {
let this = self.0.clone();
async move {
this.set_noise_suppression_enabled(enabled)
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn set_noise_suppression_level(
&self,
level: NoiseSuppressionLevel,
) -> DartOpaque {
let this = self.0.clone();
async move {
this.set_noise_suppression_level(level).await.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn set_echo_cancellation_enabled(&self, enabled: bool) -> DartOpaque {
let this = self.0.clone();
async move {
this.set_echo_cancellation_enabled(enabled)
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn set_auto_gain_control_enabled(&self, enabled: bool) -> DartOpaque {
let this = self.0.clone();
async move {
this.set_auto_gain_control_enabled(enabled)
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn set_high_pass_filter_enabled(&self, enabled: bool) -> DartOpaque {
let this = self.0.clone();
async move {
this.set_high_pass_filter_enabled(enabled)
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn is_noise_suppression_enabled(&self) -> DartOpaque {
let this = self.0.clone();
async move {
this.is_noise_suppression_enabled()
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn get_noise_suppression_level(&self) -> DartOpaque {
let this = self.0.clone();
async move {
let lvl = this
.get_noise_suppression_level()
.await
.map_err(Error::from)?;
Ok::<_, Error>(lvl as i64)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn is_auto_gain_control_enabled(&self) -> DartOpaque {
let this = self.0.clone();
async move {
this.is_auto_gain_control_enabled()
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn is_echo_cancellation_enabled(&self) -> DartOpaque {
let this = self.0.clone();
async move {
this.is_echo_cancellation_enabled()
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn is_high_pass_filter_enabled(&self) -> DartOpaque {
let this = self.0.clone();
async move {
this.is_high_pass_filter_enabled()
.await
.map_err(Error::from)
}
.into_dart_future()
.into_dart_opaque()
}
#[frb(sync)]
#[must_use]
pub fn free(self) -> DartOpaque {
async move {
self.0.take().maybe_stop().await;
Ok::<_, Error>(())
}
.into_dart_future()
.into_dart_opaque()
}
}
#[frb(sync, type_64bit_int)]
#[must_use]
pub fn vec_local_tracks_from_raw(ptr: usize) -> Vec<LocalMediaTrack> {
unsafe { Vec::<LocalMediaTrack>::from_ptr(ptr).into_iter().collect() }
}