music_player_playback/decoder/
mod.rs1use 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}