1 use super::{AudioDecoder, AudioPacket, DecoderError, DecoderResult}; 2 3 use lewton::audio::AudioReadError::AudioIsHeader; 4 use lewton::inside_ogg::OggStreamReader; 5 use lewton::samples::InterleavedSamples; 6 use lewton::OggReadError::NoCapturePatternFound; 7 use lewton::VorbisError::{BadAudio, OggError}; 8 9 use std::io::{Read, Seek}; 10 11 pub struct VorbisDecoder<R: Read + Seek>(OggStreamReader<R>); 12 13 impl<R> VorbisDecoder<R> 14 where 15 R: Read + Seek, 16 { new(input: R) -> DecoderResult<VorbisDecoder<R>>17 pub fn new(input: R) -> DecoderResult<VorbisDecoder<R>> { 18 let reader = 19 OggStreamReader::new(input).map_err(|e| DecoderError::LewtonDecoder(e.to_string()))?; 20 Ok(VorbisDecoder(reader)) 21 } 22 } 23 24 impl<R> AudioDecoder for VorbisDecoder<R> 25 where 26 R: Read + Seek, 27 { seek(&mut self, absgp: u64) -> DecoderResult<()>28 fn seek(&mut self, absgp: u64) -> DecoderResult<()> { 29 self.0 30 .seek_absgp_pg(absgp) 31 .map_err(|e| DecoderError::LewtonDecoder(e.to_string()))?; 32 Ok(()) 33 } 34 next_packet(&mut self) -> DecoderResult<Option<AudioPacket>>35 fn next_packet(&mut self) -> DecoderResult<Option<AudioPacket>> { 36 loop { 37 match self.0.read_dec_packet_generic::<InterleavedSamples<f32>>() { 38 Ok(Some(packet)) => return Ok(Some(AudioPacket::samples_from_f32(packet.samples))), 39 Ok(None) => return Ok(None), 40 Err(BadAudio(AudioIsHeader)) => (), 41 Err(OggError(NoCapturePatternFound)) => (), 42 Err(e) => return Err(DecoderError::LewtonDecoder(e.to_string())), 43 } 44 } 45 } 46 } 47