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