use super::*;
#[cfg(not(all(target_family = "wasm", not(target_os = "wasi"))))]
#[path = "./protocol/protocol_desk.rs"]
pub mod platform_specifics;
#[cfg(all(target_family = "wasm", not(target_os = "wasi")))]
#[path = "./protocol/protocol_web.rs"]
pub mod platform_specifics;
pub use platform_specifics::*;
type Track = Box<dyn HasAudioStream>;
#[derive(Default)]
pub struct LocalRequestQueue {
queue: VecDeque<MixerRequest>,
}
impl LocalRequestQueue {
pub fn new() -> Self {
Self {
queue: VecDeque::new(),
}
}
pub fn enqueue(&mut self, req: MixerRequest) {
self.queue.push_back(req);
}
pub fn clear(&mut self) {
self.queue.clear();
}
}
#[derive(Copy, Clone)]
pub enum OffsetKind {
Start { offset: u64 },
Current { offset: i64 },
}
impl OffsetKind {
pub fn current() -> Self {
Self::default()
}
}
impl Default for OffsetKind {
fn default() -> Self {
Self::Current { offset: 0 }
}
}
pub enum MixerRequest {
Seek(OffsetKind),
AddTrack(TrackID, OffsetKind, Track),
RemoveTrack(TrackID),
FetchMixerTime,
MutateMixer(TrackID,fn(TrackID,&mut Mixer) -> MutatedResult<()>),
}
#[derive(Debug)]
pub enum AddTrackErr {
TrackIdAlreadyExists(Track),
}
#[derive(Debug)]
pub enum RemoveTrackErr {
TrackNotFound,
TrackCurrentlyPlaying
}
#[derive(Debug)]
pub enum TrackMutatedErr {
TrackNotFound,
}
#[derive(Debug)]
pub enum SeekErr {
CursorOutOfBounds,
}
#[derive(Debug,Copy,Clone)]
pub enum MixerEventKind{
TrackStarted(TrackID),
TrackStopped(TrackID),
}
#[derive(Debug)]
pub enum MixerResponse {
AddTrackStatus(TrackID, Result<(), AddTrackErr>),
RemoveTrackStatus(TrackID, Result<Track, RemoveTrackErr>),
MixerMutatedStatus(TrackID,Result<(), TrackMutatedErr>),
SeekStatus(Result<(), SeekErr>),
MixerEvent(MixerEventKind),
MixerTime(SampleTime),
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct TrackID {
id: u64,
}
impl TrackID {
pub fn from_u64(id: u64) -> Self {
Self { id }
}
pub const fn null()->Self{
Self{
id:!0,
}
}
}
impl Default for TrackID{
fn default() -> Self {
Self::null()
}
}