mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-03 17:59:24 +02:00
72 lines
1.9 KiB
Rust
72 lines
1.9 KiB
Rust
use std::fmt;
|
|
|
|
mod lewton_decoder;
|
|
pub use lewton_decoder::{VorbisDecoder, VorbisError};
|
|
|
|
mod passthrough_decoder;
|
|
pub use passthrough_decoder::{PassthroughDecoder, PassthroughError};
|
|
|
|
pub enum AudioPacket {
|
|
Samples(Vec<f64>),
|
|
OggData(Vec<u8>),
|
|
}
|
|
|
|
impl AudioPacket {
|
|
pub fn samples_from_f32(f32_samples: Vec<f32>) -> Self {
|
|
let f64_samples = f32_samples.iter().map(|sample| *sample as f64).collect();
|
|
AudioPacket::Samples(f64_samples)
|
|
}
|
|
|
|
pub fn samples(&self) -> &[f64] {
|
|
match self {
|
|
AudioPacket::Samples(s) => s,
|
|
AudioPacket::OggData(_) => panic!("can't return OggData on samples"),
|
|
}
|
|
}
|
|
|
|
pub fn oggdata(&self) -> &[u8] {
|
|
match self {
|
|
AudioPacket::Samples(_) => panic!("can't return samples on OggData"),
|
|
AudioPacket::OggData(d) => d,
|
|
}
|
|
}
|
|
|
|
pub fn is_empty(&self) -> bool {
|
|
match self {
|
|
AudioPacket::Samples(s) => s.is_empty(),
|
|
AudioPacket::OggData(d) => d.is_empty(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum AudioError {
|
|
PassthroughError(PassthroughError),
|
|
VorbisError(VorbisError),
|
|
}
|
|
|
|
impl fmt::Display for AudioError {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
match self {
|
|
AudioError::PassthroughError(err) => write!(f, "PassthroughError({})", err),
|
|
AudioError::VorbisError(err) => write!(f, "VorbisError({})", err),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<VorbisError> for AudioError {
|
|
fn from(err: VorbisError) -> AudioError {
|
|
AudioError::VorbisError(err)
|
|
}
|
|
}
|
|
|
|
impl From<PassthroughError> for AudioError {
|
|
fn from(err: PassthroughError) -> AudioError {
|
|
AudioError::PassthroughError(err)
|
|
}
|
|
}
|
|
|
|
pub trait AudioDecoder {
|
|
fn seek(&mut self, ms: i64) -> Result<(), AudioError>;
|
|
fn next_packet(&mut self) -> Result<Option<AudioPacket>, AudioError>;
|
|
}
|