lewton_decoder.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. extern crate lewton;
  2. use self::lewton::inside_ogg::OggStreamReader;
  3. use std::error;
  4. use std::fmt;
  5. use std::io::{Read, Seek};
  6. pub struct VorbisDecoder<R: Read + Seek>(OggStreamReader<R>);
  7. pub struct VorbisPacket(Vec<i16>);
  8. pub struct VorbisError(lewton::VorbisError);
  9. impl<R> VorbisDecoder<R>
  10. where
  11. R: Read + Seek,
  12. {
  13. pub fn new(input: R) -> Result<VorbisDecoder<R>, VorbisError> {
  14. Ok(VorbisDecoder(OggStreamReader::new(input)?))
  15. }
  16. pub fn seek(&mut self, ms: i64) -> Result<(), VorbisError> {
  17. let absgp = ms * 44100 / 1000;
  18. self.0.seek_absgp_pg(absgp as u64)?;
  19. Ok(())
  20. }
  21. pub fn next_packet(&mut self) -> Result<Option<VorbisPacket>, VorbisError> {
  22. use self::lewton::audio::AudioReadError::AudioIsHeader;
  23. use self::lewton::OggReadError::NoCapturePatternFound;
  24. use self::lewton::VorbisError::BadAudio;
  25. use self::lewton::VorbisError::OggError;
  26. loop {
  27. match self.0.read_dec_packet_itl() {
  28. Ok(Some(packet)) => return Ok(Some(VorbisPacket(packet))),
  29. Ok(None) => return Ok(None),
  30. Err(BadAudio(AudioIsHeader)) => (),
  31. Err(OggError(NoCapturePatternFound)) => (),
  32. Err(err) => return Err(err.into()),
  33. }
  34. }
  35. }
  36. }
  37. impl VorbisPacket {
  38. pub fn data(&self) -> &[i16] {
  39. &self.0
  40. }
  41. pub fn data_mut(&mut self) -> &mut [i16] {
  42. &mut self.0
  43. }
  44. }
  45. impl From<lewton::VorbisError> for VorbisError {
  46. fn from(err: lewton::VorbisError) -> VorbisError {
  47. VorbisError(err)
  48. }
  49. }
  50. impl fmt::Debug for VorbisError {
  51. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  52. fmt::Debug::fmt(&self.0, f)
  53. }
  54. }
  55. impl fmt::Display for VorbisError {
  56. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  57. fmt::Display::fmt(&self.0, f)
  58. }
  59. }
  60. impl error::Error for VorbisError {
  61. fn source(&self) -> Option<&(dyn error::Error + 'static)> {
  62. error::Error::source(&self.0)
  63. }
  64. }