servo_media_audio/
sink.rs

1use crate::block::Chunk;
2use crate::render_thread::AudioRenderThreadMsg;
3use servo_media_streams::MediaSocket;
4use std::sync::mpsc::Sender;
5
6#[derive(Debug, PartialEq)]
7pub enum AudioSinkError {
8    /// Backend specific error.
9    Backend(String),
10    /// Could not push buffer into the audio sink.
11    BufferPushFailed,
12    /// Could not move to a different state.
13    StateChangeFailed,
14}
15
16pub trait AudioSink: Send {
17    fn init(
18        &self,
19        sample_rate: f32,
20        render_thread_channel: Sender<AudioRenderThreadMsg>,
21    ) -> Result<(), AudioSinkError>;
22    fn init_stream(
23        &self,
24        channels: u8,
25        sample_rate: f32,
26        socket: Box<dyn MediaSocket>,
27    ) -> Result<(), AudioSinkError>;
28    fn play(&self) -> Result<(), AudioSinkError>;
29    fn stop(&self) -> Result<(), AudioSinkError>;
30    fn has_enough_data(&self) -> bool;
31    fn push_data(&self, chunk: Chunk) -> Result<(), AudioSinkError>;
32    fn set_eos_callback(
33        &self,
34        callback: Box<dyn Fn(Box<dyn AsRef<[f32]>>) + Send + Sync + 'static>,
35    );
36}