fix clippy warnings
[nihav.git] / nihav-llaudio / src / demuxers / wavpack.rs
index 9cfbba8b8ea10af2e809f2db9fb4285fd8a6b1e6..6c5f8dd392b51d155abebc000ac519dc11439e36 100644 (file)
@@ -20,7 +20,7 @@ const WV_FLAG_END_BLOCK: u32    = 1 << 12;
 const WV_FLAG_FALSE_STEREO: u32 = 1 << 30;
 //const WV_FLAG_DSD_AUDIO: u32    = 1 << 31;
 
-const WV_STREAM_FLAGS: u32 = 0x8000018B;
+const WV_STREAM_FLAGS: u32 = 0x8000008B;
 
 #[derive(Clone,Copy,Default)]
 struct WVHeader {
@@ -36,6 +36,7 @@ struct WVHeader {
 const WV_HEADER_SIZE: usize = 32;
 
 impl WVHeader {
+    #[allow(clippy::field_reassign_with_default)]
     fn parse(src: &[u8]) -> DemuxerResult<Self> {
         let mut mr = MemoryReader::new_read(src);
         let mut br = ByteReader::new(&mut mr);
@@ -174,7 +175,7 @@ impl<'a> DemuxCore<'a> for WavPackDemuxer<'a> {
 
         let ahdr = NAAudioInfo::new(srate, channels, SND_S16P_FORMAT, 1);
         let ainfo = NACodecInfo::new("wavpack", NACodecTypeInfo::Audio(ahdr), Some(buf.clone()));
-        strmgr.add_stream(NAStream::new(StreamType::Audio, 0, ainfo, 1, srate)).unwrap();
+        strmgr.add_stream(NAStream::new(StreamType::Audio, 0, ainfo, 1, srate, hdr.tot_samples)).unwrap();
         seek_index.mode = SeekIndexMode::Automatic;
         self.srate = srate;
         self.known_frames = Vec::with_capacity(((self.nsamples + u64::from(srate) - 1) / u64::from(srate)) as usize);
@@ -189,8 +190,7 @@ impl<'a> DemuxCore<'a> for WavPackDemuxer<'a> {
             std::mem::swap(&mut fb, &mut self.first_blocks);
             let (refhdr, buf) = fb.unwrap();
             let stream = strmgr.get_stream(0).unwrap();
-            let (tb_num, tb_den) = stream.get_timebase();
-            let ts = NATimeInfo::new(Some(self.samplepos), None, None, tb_num, tb_den);
+            let ts = stream.make_ts(Some(self.samplepos), None, None);
             let pkt = NAPacket::new(stream, ts, true, buf);
 
             self.samplepos += u64::from(refhdr.block_samples);
@@ -205,8 +205,7 @@ impl<'a> DemuxCore<'a> for WavPackDemuxer<'a> {
         let (refhdr, buf) = self.read_blocks()?;
 
         let stream = strmgr.get_stream(0).unwrap();
-        let (tb_num, tb_den) = stream.get_timebase();
-        let ts = NATimeInfo::new(Some(self.samplepos), None, None, tb_num, tb_den);
+        let ts = stream.make_ts(Some(self.samplepos), None, None);
         let pkt = NAPacket::new(stream, ts, true, buf);
 
         self.samplepos += u64::from(refhdr.block_samples);
@@ -230,6 +229,8 @@ impl<'a> DemuxCore<'a> for WavPackDemuxer<'a> {
                 }
             } else {
                 let mut hdrbuf = [0u8; WV_HEADER_SIZE];
+                let lastoff = self.known_frames.last().unwrap_or(&FrameSeekInfo::default()).off;
+                self.src.seek(SeekFrom::Start(lastoff))?;
                 loop {
                                           self.src.peek_buf(&mut hdrbuf)?;
                     let hdr = WVHeader::parse(&hdrbuf)?;
@@ -251,6 +252,7 @@ impl<'a> DemuxCore<'a> for WavPackDemuxer<'a> {
             Err(DemuxerError::NotPossible)
         }
     }
+    fn get_duration(&self) -> u64 { 0 }
 }
 
 impl<'a> NAOptionHandler for WavPackDemuxer<'a> {
@@ -276,6 +278,7 @@ mod test {
 
     #[test]
     fn test_wavpack_demux() {
+        // sample from the official WavPack test samples set
         let mut file = File::open("assets/LLaudio/wv/false_stereo.wv").unwrap();
         let mut fr = FileReader::new_read(&mut file);
         let mut br = ByteReader::new(&mut fr);