music_player_playback/decoder/
mod.rs

1use std::ops::Deref;
2use thiserror::Error;
3
4pub mod symphonia_decoder;
5
6#[derive(Error, Debug)]
7pub enum DecoderError {
8    #[error("Symphonia Decoder Error: {0}")]
9    SymphoniaDecoder(String),
10}
11
12pub type DecoderResult<T> = Result<T, DecoderError>;
13
14#[derive(Error, Debug)]
15pub enum AudioPacketError {
16    #[error("Decoder Raw Error: Can't return Raw on Samples")]
17    Raw,
18    #[error("Decoder Samples Error: Can't return Samples on Raw")]
19    Samples,
20}
21
22pub type AudioPacketResult<T> = Result<T, AudioPacketError>;
23
24pub enum AudioPacket {
25    Samples(Vec<f64>),
26    Raw(Vec<u8>),
27}
28
29impl AudioPacket {
30    pub fn samples(&self) -> AudioPacketResult<&[f64]> {
31        match self {
32            AudioPacket::Samples(s) => Ok(s),
33            AudioPacket::Raw(_) => Err(AudioPacketError::Raw),
34        }
35    }
36
37    pub fn raw(&self) -> AudioPacketResult<&[u8]> {
38        match self {
39            AudioPacket::Raw(d) => Ok(d),
40            AudioPacket::Samples(_) => Err(AudioPacketError::Samples),
41        }
42    }
43
44    pub fn is_empty(&self) -> bool {
45        match self {
46            AudioPacket::Samples(s) => s.is_empty(),
47            AudioPacket::Raw(d) => d.is_empty(),
48        }
49    }
50}
51
52#[derive(Debug, Clone)]
53pub struct AudioPacketPosition {
54    pub position_ms: u32,
55    pub skipped: bool,
56}
57
58impl Deref for AudioPacketPosition {
59    type Target = u32;
60    fn deref(&self) -> &Self::Target {
61        &self.position_ms
62    }
63}
64
65pub trait AudioDecoder {
66    fn seek(&mut self, position_ms: u32) -> Result<u32, DecoderError>;
67    fn next_packet(
68        &mut self,
69    ) -> DecoderResult<Option<(AudioPacketPosition, AudioPacket, u16, u32)>>;
70}
71
72impl From<symphonia::core::errors::Error> for DecoderError {
73    fn from(err: symphonia::core::errors::Error) -> Self {
74        Self::SymphoniaDecoder(err.to_string())
75    }
76}