rustwav_core/
decoders.rs

1#![allow(dead_code)]
2#![allow(non_snake_case)]
3
4use std::{cmp::min, fmt::Debug, io::SeekFrom, marker::PhantomData};
5
6use xlaw::{PcmXLawDecoder, XLaw};
7use io_utils::Reader;
8use downmixer::{Downmixer, DownmixerParams};
9use sampletypes::{SampleType, i24, u24};
10use crate::adpcm;
11use crate::format_specs::{Spec, WaveSampleType, format_tags::*};
12use crate::chunks::{FmtChunk, ext::{ExtensibleData, ExtensionData}};
13use crate::errors::{AudioError, AudioReadError};
14
15#[cfg(feature = "mp3dec")]
16use mp3::Mp3Decoder;
17
18#[cfg(feature = "opus")]
19use opus::OpusDecoder;
20
21#[cfg(feature = "flac")]
22use flac_dec::FlacDecoderWrap;
23
24#[cfg(feature = "oggvorbis")]
25use oggvorbis_dec::OggVorbisDecoderWrap;
26
27/// * Decodes audio into samples of the caller-provided format `S`.
28pub trait Decoder<S>: Debug
29where
30    S: SampleType,
31{
32    /// Get num channels
33    fn get_channels(&self) -> u16;
34
35    /// Decode one audio frame. An audio frame is each channel has one sample. This method supports > 2 channels.
36    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError>;
37
38    /// Seek to a specific audio frame. An audio frame is each channel has one sample.
39    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError>;
40
41    /// Get current frame index.
42    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError>;
43
44    /// Decode a mono sample, multiple channels will be mixed into one channel.
45    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> {
46        if let Some(frame) = self.decode_frame()? {
47            if let Some(downmixer) = self.get_downmixer() {
48                Ok(Some(downmixer.downmix_frame_to_mono(&frame)))
49            } else {
50                match self.get_channels() {
51                    1 => Ok(Some(frame[0])),
52                    _ => Ok(Some(S::average_arr(&frame))),
53                }
54            }
55        } else {
56            Ok(None)
57        }
58    }
59
60    /// Decode a stereo sample with left and right samples, if the audio has > 2 channels, this method fails.
61    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> {
62        if let Some(frame) = self.decode_frame()? {
63            if let Some(downmixer) = self.get_downmixer() {
64                Ok(Some(downmixer.downmix_frame_to_stereo(&frame)))
65            } else {
66                match self.get_channels() {
67                    1 => Ok(Some((frame[0], frame[0]))),
68                    2 => Ok(Some((frame[0], frame[1]))),
69                    o => Err(AudioReadError::Unsupported(format!(
70                        "Unsupported to merge {o} channels to 2 channels, downmixer is not set up."
71                    ))),
72                }
73            }
74        } else {
75            Ok(None)
76        }
77    }
78
79    /// Decode multiple audio frames. This method supports > 2 channels.
80    fn decode_frames(&mut self, num_frames: usize) -> Result<Vec<Vec<S>>, AudioReadError> {
81        let mut frames = Vec::<Vec<S>>::with_capacity(num_frames);
82        for _ in 0..num_frames {
83            match self.decode_frame()? {
84                Some(frame) => frames.push(frame),
85                None => break,
86            }
87        }
88        Ok(frames)
89    }
90
91    /// Decode multiple mono samples, multiple channels will be mixed into one channel.
92    fn decode_monos(&mut self, num_monos: usize) -> Result<Vec<S>, AudioReadError> {
93        let mut monos = Vec::<S>::with_capacity(num_monos);
94        for _ in 0..num_monos {
95            match self.decode_mono()? {
96                Some(mono) => monos.push(mono),
97                None => break,
98            }
99        }
100        Ok(monos)
101    }
102
103    /// Decode multiple stereo samples with left and right samples, if the audio has > 2 channels, this method fails.
104    fn decode_stereos(&mut self, num_stereos: usize) -> Result<Vec<(S, S)>, AudioReadError> {
105        let mut stereos = Vec::<(S, S)>::with_capacity(num_stereos);
106        for _ in 0..num_stereos {
107            match self.decode_stereo()? {
108                Some(stereo) => stereos.push(stereo),
109                None => break,
110            }
111        }
112        Ok(stereos)
113    }
114
115    /// Set the downmixer
116    fn set_downmixer(&mut self, _downmixer: &Downmixer) {
117        eprintln!("This decoder doesn't supports downmixing");
118    }
119
120    /// Get the downmixer
121    fn get_downmixer(&self) -> Option<Downmixer> {
122        None
123    }
124}
125
126impl<S> Decoder<S> for PcmDecoder<S>
127    where S: SampleType {
128    fn get_channels(&self) -> u16 { self.spec.channels }
129    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(PcmDecoder::<S>::get_cur_frame_index(self)) }
130    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
131    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame() }
132    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo() }
133    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono() }
134    fn set_downmixer(&mut self, downmixer: &Downmixer) { self.downmixer = *downmixer; }
135    fn get_downmixer(&self) -> Option<Downmixer> { Some(self.downmixer) }
136}
137
138impl<S, D> Decoder<S> for AdpcmDecoderWrap<D>
139    where S: SampleType,
140          D: adpcm::AdpcmDecoder {
141    fn get_channels(&self) -> u16 { self.channels }
142    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(AdpcmDecoderWrap::<D>::get_cur_frame_index(self)) }
143    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
144    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
145    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
146    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
147}
148
149impl<S> Decoder<S> for PcmXLawDecoderWrap
150    where S: SampleType {
151    fn get_channels(&self) -> u16 { self.channels }
152    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(PcmXLawDecoderWrap::get_cur_frame_index(self)) }
153    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
154    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
155    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
156    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
157}
158
159#[cfg(feature = "mp3dec")]
160impl<S> Decoder<S> for Mp3Decoder
161    where S: SampleType {
162    fn get_channels(&self) -> u16 { Mp3Decoder::get_channels(self) }
163    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(Mp3Decoder::get_cur_frame_index(self)) }
164    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { Mp3Decoder::seek(self, seek_from) }
165    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
166    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
167    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
168}
169
170#[cfg(feature = "opus")]
171impl<S> Decoder<S> for OpusDecoder
172    where S: SampleType {
173    fn get_channels(&self) -> u16 { OpusDecoder::get_channels(self) }
174    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(OpusDecoder::get_cur_frame_index(self)) }
175    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
176    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
177    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
178    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
179}
180
181#[cfg(feature = "flac")]
182impl<S> Decoder<S> for FlacDecoderWrap<'_>
183    where S: SampleType {
184    fn get_channels(&self) -> u16 { FlacDecoderWrap::get_channels(self) }
185    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(FlacDecoderWrap::get_cur_frame_index(self)) }
186    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
187    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
188    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
189    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
190    fn set_downmixer(&mut self, downmixer: &Downmixer) { self.downmixer = *downmixer; }
191    fn get_downmixer(&self) -> Option<Downmixer> { Some(self.downmixer) }
192}
193
194#[cfg(feature = "oggvorbis")]
195impl<S> Decoder<S> for OggVorbisDecoderWrap
196    where S: SampleType {
197    fn get_channels(&self) -> u16 { OggVorbisDecoderWrap::get_channels(self) }
198    fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(OggVorbisDecoderWrap::get_cur_frame_index(self)) }
199    fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
200    fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
201    fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
202    fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
203    fn set_downmixer(&mut self, downmixer: &Downmixer) { self.downmixer = *downmixer; }
204    fn get_downmixer(&self) -> Option<Downmixer> { Some(self.downmixer) }
205}
206
207#[derive(Debug)]
208pub struct ExtensibleDecoder<S>
209where
210    S: SampleType,
211{
212    phantom: PhantomData<S>,
213}
214
215impl<S> ExtensibleDecoder<S>
216where
217    S: SampleType,
218{
219    #[allow(clippy::new_ret_no_self)]
220    pub fn new(
221        reader: Box<dyn Reader>,
222        data_offset: u64,
223        data_length: u64,
224        spec: Spec,
225        fmt: &FmtChunk,
226        downmixer_params: Option<DownmixerParams>
227    ) -> Result<Box<dyn Decoder<S>>, AudioError> {
228        if fmt.format_tag != FORMAT_TAG_EXTENSIBLE {
229            Err(AudioError::InvalidArguments(
230                "The `format_tag` from `fmt ` chunk must be 0xFFFE for the extensible decoder."
231                    .to_string(),
232            ))
233        } else {
234            match &fmt.extension {
235                None => {
236                    eprintln!(
237                        "No extension data was found in the `fmt ` chunk. The audio data is parsed as PCM."
238                    );
239                    Ok(Box::new(PcmDecoder::<S>::new(
240                        reader,
241                        data_offset,
242                        data_length,
243                        spec,
244                        fmt,
245                        downmixer_params,
246                    )?))
247                }
248                Some(extension) => match &extension.data {
249                    ExtensionData::Extensible(extensible) => {
250                        if (extension.ext_len as usize) < ExtensibleData::sizeof() {
251                            eprintln!(
252                                "The size of the extension data found in the `fmt ` chunk is not big enough as the extensible data should be. The audio data is parsed as PCM."
253                            );
254                            Ok(Box::new(PcmDecoder::<S>::new(
255                                reader,
256                                data_offset,
257                                data_length,
258                                spec,
259                                fmt,
260                                downmixer_params,
261                            )?))
262                        } else {
263                            let spec = Spec {
264                                channels: spec.channels,
265                                channel_mask: extensible.channel_mask,
266                                sample_rate: spec.sample_rate,
267                                bits_per_sample: spec.bits_per_sample,
268                                sample_format: spec.sample_format,
269                            };
270                            use crate::wavcore::guids::*;
271                            match extensible.sub_format {
272                                GUID_PCM_FORMAT | GUID_IEEE_FLOAT_FORMAT => {
273                                    Ok(Box::new(PcmDecoder::<S>::new(
274                                        reader,
275                                        data_offset,
276                                        data_length,
277                                        spec,
278                                        fmt,
279                                        downmixer_params,
280                                    )?))
281                                }
282                                o => Err(AudioError::Unimplemented(format!(
283                                    "Unknown format of GUID {o} in the extensible data"
284                                ))),
285                            }
286                        }
287                    }
288                    o => Err(AudioError::WrongExtensionData(format!(
289                        "The extension data in the `fmt ` chunk must be `extensible`, got {:?}",
290                        o
291                    ))),
292                },
293            }
294        }
295    }
296}
297
298/// * The `PcmDecoder<S>` to decode WAV PCM samples to your specific format
299#[derive(Debug)]
300pub struct PcmDecoder<S>
301where
302    S: SampleType,
303{
304    reader: Box<dyn Reader>,
305    data_offset: u64,
306    data_length: u64,
307    block_align: u16,
308    total_frames: u64,
309    spec: Spec,
310    sample_decoder: fn(&mut dyn Reader, &mut [S]) -> Result<(), AudioReadError>,
311    cache: Vec<S>,
312    cache_position: u64,
313    frame_index: u64,
314    downmixer: Downmixer,
315}
316
317impl<S> PcmDecoder<S>
318where
319    S: SampleType,
320{
321    const CACHE_SIZE: usize = 4096;
322
323    pub fn new(
324        reader: Box<dyn Reader>,
325        data_offset: u64,
326        data_length: u64,
327        spec: Spec,
328        fmt: &FmtChunk,
329        downmixer_params: Option<DownmixerParams>,
330    ) -> Result<Self, AudioError> {
331        let wave_sample_type = spec.get_sample_type();
332        Ok(Self {
333            reader,
334            data_offset,
335            data_length,
336            block_align: fmt.block_align,
337            total_frames: data_length / fmt.block_align as u64,
338            spec,
339            sample_decoder: Self::choose_sample_decoder(wave_sample_type)?,
340            cache: Vec::with_capacity(Self::CACHE_SIZE),
341            cache_position: 0,
342            frame_index: 0,
343            downmixer: Downmixer::new(spec.channel_mask, downmixer_params.unwrap_or_default()),
344        })
345    }
346
347    fn is_end_of_data(&mut self) -> bool {
348        self.frame_index >= self.total_frames
349    }
350
351    fn get_num_cached_frames(&self) -> usize {
352        self.cache.len() / self.spec.channels as usize
353    }
354
355    fn clear_cache(&mut self) {
356        self.cache_position = self.frame_index;
357        self.cache.clear();
358    }
359
360    fn is_frame_index_out_of_cache(&self) -> bool {
361        self.frame_index < self.cache_position || self.frame_index >= self.cache_position + self.get_num_cached_frames() as u64
362    }
363
364    pub fn get_cur_frame_index(&mut self) -> u64 {
365        self.frame_index
366    }
367
368    pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
369        self.frame_index = match seek_from {
370            SeekFrom::Start(fi) => fi,
371            SeekFrom::Current(cur) => (self.frame_index as i64 + cur) as u64,
372            SeekFrom::End(end) => (self.total_frames as i64 + end) as u64,
373        };
374        if self.frame_index > self.total_frames {
375            self.frame_index = self.total_frames;
376            self.reader.seek(SeekFrom::Start(self.data_offset + self.data_length))?;
377        } else {
378            self.reader.seek(SeekFrom::Start(self.data_offset + self.frame_index * self.block_align as u64))?;
379        }
380        Ok(())
381    }
382
383    fn decode_samples_to<T>(r: &mut dyn Reader, buf: &mut [S]) -> Result<(), AudioReadError>
384    where
385        T: SampleType,
386    {
387        for sample in buf.iter_mut() {
388            *sample = S::scale_from(T::read_le(r)?);
389        }
390        Ok(())
391    }
392
393    #[allow(clippy::type_complexity)]
394    fn choose_sample_decoder(wave_sample_type: WaveSampleType) -> Result<fn(&mut dyn Reader, &mut [S]) -> Result<(), AudioReadError>, AudioError> {
395        use WaveSampleType::{F32, F64, S8, S16, S24, S32, S64, U8, U16, U24, U32, U64, Unknown};
396        match wave_sample_type {
397            S8 =>  Ok(Self::decode_samples_to::<i8 >),
398            S16 => Ok(Self::decode_samples_to::<i16>),
399            S24 => Ok(Self::decode_samples_to::<i24>),
400            S32 => Ok(Self::decode_samples_to::<i32>),
401            S64 => Ok(Self::decode_samples_to::<i64>),
402            U8 =>  Ok(Self::decode_samples_to::<u8 >),
403            U16 => Ok(Self::decode_samples_to::<u16>),
404            U24 => Ok(Self::decode_samples_to::<u24>),
405            U32 => Ok(Self::decode_samples_to::<u32>),
406            U64 => Ok(Self::decode_samples_to::<u64>),
407            F32 => Ok(Self::decode_samples_to::<f32>),
408            F64 => Ok(Self::decode_samples_to::<f64>),
409            Unknown => Err(AudioError::InvalidArguments(format!(
410                "unknown sample type \"{:?}\"",
411                wave_sample_type
412            ))),
413        }
414    }
415
416    pub fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> {
417        if self.is_end_of_data() {
418            Ok(None)
419        } else {
420            if self.is_frame_index_out_of_cache() {
421                self.clear_cache();
422            }
423            if self.cache.is_empty() {
424                let num_samples_to_read = min(Self::CACHE_SIZE, (self.total_frames - self.cache_position) as usize) * self.spec.channels as usize;
425                self.cache.resize(num_samples_to_read, S::new());
426                (self.sample_decoder)(&mut self.reader, &mut self.cache)?;
427            }
428            let sample_start = ((self.frame_index - self.cache_position) * self.spec.channels as u64) as usize;
429            let sample_end = sample_start + self.spec.channels as usize;
430            let frame = self.cache[sample_start..sample_end].to_vec();
431            self.frame_index += 1;
432            Ok(Some(frame))
433        }
434    }
435
436    pub fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> {
437        match self.decode_frame()? {
438            None => Ok(None),
439            Some(frame) => {
440                Ok(Some(self.downmixer.downmix_frame_to_stereo(&frame)))
441            }
442        }
443    }
444
445    pub fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> {
446        match self.decode_frame()? {
447            None => Ok(None),
448            Some(frame) => {
449                Ok(Some(self.downmixer.downmix_frame_to_mono(&frame)))
450            }
451        }
452    }
453}
454
455/// * The `AdpcmDecoderWrap` to decode ADPCM blocks to your specific format samples
456#[derive(Debug)]
457pub struct AdpcmDecoderWrap<D>
458where
459    D: adpcm::AdpcmDecoder,
460{
461    channels: u16,
462    reader: Box<dyn Reader>,
463    data_offset: u64,
464    data_length: u64,
465    block_align: u16,
466    frame_index: u64,
467    frames_decoded: u64,
468    total_frames: u64,
469    decoder: D,
470    samples: Vec<i16>,
471    first_frame_of_samples: u64,
472}
473
474impl<D> AdpcmDecoderWrap<D>
475where
476    D: adpcm::AdpcmDecoder,
477{
478    pub fn new(
479        reader: Box<dyn Reader>,
480        data_offset: u64,
481        data_length: u64,
482        fmt: &FmtChunk,
483        total_samples: u64,
484    ) -> Result<Self, AudioReadError> {
485        let decoder = D::new(fmt)?;
486        let total_frames = if total_samples == 0 {
487            let frames_per_block = decoder.frames_per_block() as u64;
488            let total_blocks = data_length / fmt.block_align as u64;
489            total_blocks * frames_per_block
490        } else {
491            total_samples / fmt.channels as u64
492        };
493        Ok(Self {
494            channels: fmt.channels,
495            reader,
496            data_offset,
497            data_length,
498            block_align: fmt.block_align,
499            frame_index: 0,
500            frames_decoded: 0,
501            total_frames,
502            decoder,
503            samples: Vec::<i16>::new(),
504            first_frame_of_samples: 0,
505        })
506    }
507
508    fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
509        let end_of_data = self.data_offset + self.data_length;
510        if self.reader.stream_position()? >= end_of_data {
511            Ok(true)
512        } else {
513            Ok(false)
514        }
515    }
516
517    pub fn get_cur_frame_index(&self) -> u64 {
518        self.frame_index
519    }
520
521    pub fn feed_until_output(&mut self, wanted_length: usize) -> Result<(), AudioReadError> {
522        let end_of_data = self.data_offset + self.data_length;
523        let mut sample_decoded = 0u64;
524        while self.samples.len() < wanted_length {
525            let cur_pos = self.reader.stream_position()?;
526            if cur_pos < end_of_data {
527                let remains = end_of_data - cur_pos;
528                let to_read = min(remains, self.block_align as u64);
529                let mut buf = vec![0u8; to_read as usize];
530                self.reader.read_exact(&mut buf)?;
531                let mut iter = buf.into_iter();
532                self.decoder.decode(
533                    || -> Option<u8> { iter.next() },
534                    |sample: i16| {
535                        sample_decoded += 1;
536                        self.samples.push(sample)
537                    },
538                )?;
539            } else {
540                self.decoder.flush(|sample: i16| {
541                    sample_decoded += 1;
542                    self.samples.push(sample)
543                })?;
544                break;
545            }
546        }
547        self.frames_decoded += sample_decoded / self.channels as u64;
548        Ok(())
549    }
550
551    pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
552        let frames_per_block = self.decoder.frames_per_block() as u64;
553        let frame_index = match seek_from {
554            SeekFrom::Start(fi) => fi,
555            SeekFrom::Current(cur) => (self.frame_index as i64 + cur) as u64,
556            SeekFrom::End(end) => (self.total_frames as i64 + end) as u64,
557        };
558        let block_index = frame_index / frames_per_block;
559        self.samples.clear();
560        self.decoder.reset_states();
561        if frame_index >= self.total_frames {
562            let end_of_data = self.data_offset + self.data_length;
563            self.reader.seek(SeekFrom::Start(end_of_data))?;
564            self.first_frame_of_samples = self.total_frames;
565            self.frames_decoded = self.total_frames;
566            self.frame_index = frame_index;
567            Ok(())
568        } else {
569            let block_pos = self.data_offset + block_index * self.block_align as u64;
570            self.reader.seek(SeekFrom::Start(block_pos))?;
571            self.first_frame_of_samples = block_index * frames_per_block;
572            self.frames_decoded = self.first_frame_of_samples;
573            self.frame_index = frame_index;
574            Ok(())
575        }
576    }
577
578    pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
579    where
580        S: SampleType,
581    {
582        match self.channels {
583            1 => {
584                // Force-decodes at least 1 sample to ensure data availability
585                if self.samples.is_empty() {
586                    self.feed_until_output(1)?;
587                }
588
589                // Empty after feeding indicates end-of-stream
590                if self.samples.is_empty() {
591                    Ok(None)
592                } else {
593                    // Internal status check
594                    if self.frame_index < self.first_frame_of_samples {
595                        panic!(
596                            "Unknown error occured when decoding the ADPCM data: the sample cache was updated while the previous cache is needed: FI = {}, FF = {}",
597                            self.frame_index, self.first_frame_of_samples
598                        );
599                    } else if self.frame_index < self.frames_decoded {
600                        let ret =
601                            self.samples[(self.frame_index - self.first_frame_of_samples) as usize];
602                        self.frame_index += 1;
603                        Ok(Some(S::scale_from(ret)))
604                    } else {
605                        // Need to decode the next block
606                        self.first_frame_of_samples += self.samples.len() as u64;
607                        self.samples.clear();
608                        self.decode_mono::<S>()
609                    }
610                }
611            }
612            2 => {
613                let ret = self.decode_stereo::<S>()?;
614                match ret {
615                    None => Ok(None),
616                    Some((l, r)) => Ok(Some(S::average(l, r))),
617                }
618            }
619            o => Err(AudioReadError::Unsupported(format!(
620                "Unsupported channels {o}"
621            ))),
622        }
623    }
624
625    pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
626    where
627        S: SampleType,
628    {
629        match self.channels {
630            1 => {
631                let ret = self.decode_mono::<S>()?;
632                match ret {
633                    None => Ok(None),
634                    Some(ret) => Ok(Some((ret, ret))),
635                }
636            }
637            2 => {
638                // Force-decodes at least 1 sample to ensure data availability
639                if self.samples.is_empty() {
640                    self.feed_until_output(2)?;
641                }
642
643                // Empty after feeding indicates end-of-stream
644                if self.samples.is_empty() {
645                    Ok(None)
646                } else {
647                    // Internal status check
648                    if self.frame_index < self.first_frame_of_samples {
649                        panic!(
650                            "Unknown error occured when decoding the ADPCM data: the sample cache was updated while the previous cache is needed: FI = {}, FF = {}",
651                            self.frame_index, self.first_frame_of_samples
652                        );
653                    } else if self.frame_index < self.frames_decoded {
654                        let index = ((self.frame_index - self.first_frame_of_samples) * 2) as usize;
655                        self.frame_index += 1;
656                        let l = self.samples[index];
657                        let r = self.samples[index + 1];
658                        Ok(Some((S::scale_from(l), S::scale_from(r))))
659                    } else {
660                        // Need to decode the next block
661                        self.first_frame_of_samples += (self.samples.len() / 2) as u64;
662                        self.samples.clear();
663                        self.decode_stereo::<S>()
664                    }
665                }
666            }
667            o => Err(AudioReadError::Unsupported(format!(
668                "Unsupported channels {o}"
669            ))),
670        }
671    }
672
673    pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
674    where
675        S: SampleType,
676    {
677        match self.channels {
678            1 => match self.decode_mono::<S>()? {
679                Some(sample) => Ok(Some(vec![sample])),
680                None => Ok(None),
681            },
682            2 => match self.decode_stereo::<S>()? {
683                Some((l, r)) => Ok(Some(vec![l, r])),
684                None => Ok(None),
685            },
686            o => Err(AudioReadError::Unsupported(format!(
687                "Unsupported channels {o}"
688            ))),
689        }
690    }
691}
692
693/// * The `PcmXLawDecoderWrap` to decode aLaw or MuLaw PCM data to your specific format samples
694#[derive(Debug)]
695pub struct PcmXLawDecoderWrap {
696    reader: Box<dyn Reader>,
697    channels: u16,
698    data_offset: u64,
699    data_length: u64,
700    total_frames: u64,
701    frame_index: u64,
702    dec: PcmXLawDecoder,
703}
704
705impl PcmXLawDecoderWrap {
706    pub fn new(
707        reader: Box<dyn Reader>,
708        which_law: XLaw,
709        data_offset: u64,
710        data_length: u64,
711        fmt: &FmtChunk,
712        total_samples: u64,
713    ) -> Result<Self, AudioReadError> {
714        match fmt.channels {
715            1 => (),
716            2 => (),
717            o => {
718                return Err(AudioReadError::Unsupported(format!(
719                    "Unsupported channels {o}"
720                )));
721            }
722        }
723        Ok(Self {
724            reader,
725            channels: fmt.channels,
726            data_offset,
727            data_length,
728            total_frames: total_samples / fmt.channels as u64,
729            frame_index: 0,
730            dec: PcmXLawDecoder::new(which_law),
731        })
732    }
733
734    fn decode(&mut self) -> Result<i16, AudioReadError> {
735        Ok(self.dec.decode(u8::read_le(&mut self.reader)?))
736    }
737
738    pub fn get_cur_frame_index(&self) -> u64 {
739        self.frame_index
740    }
741
742    pub fn seek(&mut self, from: SeekFrom) -> Result<(), AudioReadError> {
743        let mut frame_index = match from {
744            SeekFrom::Start(fi) => fi,
745            SeekFrom::Current(cur) => (self.frame_index as i64 + cur) as u64,
746            SeekFrom::End(end) => (self.frame_index as i64 + end) as u64,
747        };
748        if frame_index > self.total_frames {
749            frame_index = self.total_frames;
750        }
751        self.frame_index = frame_index;
752        self.reader.seek(SeekFrom::Start(
753            self.data_offset + self.frame_index * self.channels as u64,
754        ))?;
755        Ok(())
756    }
757
758    fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
759        let end_of_data = self.data_offset + self.data_length;
760        if self.reader.stream_position()? >= end_of_data {
761            Ok(true)
762        } else {
763            Ok(false)
764        }
765    }
766
767    pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
768    where
769        S: SampleType,
770    {
771        if self.is_end_of_data()? {
772            Ok(None)
773        } else {
774            match self.channels {
775                1 => {
776                    let s = S::scale_from(self.decode()?);
777                    self.frame_index += 1;
778                    Ok(Some(s))
779                }
780                2 => {
781                    let l = S::scale_from(self.decode()?);
782                    let r = S::scale_from(self.decode()?);
783                    self.frame_index += 1;
784                    Ok(Some(S::average(l, r)))
785                }
786                o => Err(AudioReadError::Unsupported(format!(
787                    "Unsupported channels {o}"
788                ))),
789            }
790        }
791    }
792
793    pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
794    where
795        S: SampleType,
796    {
797        if self.is_end_of_data()? {
798            Ok(None)
799        } else {
800            match self.channels {
801                1 => {
802                    let s = S::scale_from(self.decode()?);
803                    self.frame_index += 1;
804                    Ok(Some((s, s)))
805                }
806                2 => {
807                    let l = S::scale_from(self.decode()?);
808                    let r = S::scale_from(self.decode()?);
809                    self.frame_index += 1;
810                    Ok(Some((l, r)))
811                }
812                o => Err(AudioReadError::Unsupported(format!(
813                    "Unsupported channels {o}"
814                ))),
815            }
816        }
817    }
818
819    pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
820    where
821        S: SampleType,
822    {
823        match self.channels {
824            1 => match self.decode_mono::<S>()? {
825                Some(sample) => Ok(Some(vec![sample])),
826                None => Ok(None),
827            },
828            2 => match self.decode_stereo::<S>()? {
829                Some((l, r)) => Ok(Some(vec![l, r])),
830                None => Ok(None),
831            },
832            o => Err(AudioReadError::Unsupported(format!(
833                "Unsupported channels {o}"
834            ))),
835        }
836    }
837}
838
839/// * The MP3 decoder for `WaveReader`
840#[cfg(feature = "mp3dec")]
841pub mod mp3 {
842    use std::{
843        fmt::{self, Debug, Formatter},
844        io::{Read, SeekFrom},
845        mem,
846    };
847
848    use crate::SampleType;
849    use crate::errors::AudioReadError;
850    use crate::io_utils::Reader;
851    use crate::audioutils;
852    use crate::chunks::FmtChunk;
853
854    use resampler::Resampler;
855    use rmp3::{DecoderOwned, Frame};
856
857    /// * The `Mp3Decoder`, decodes the MP3 file encapsulated in the WAV file.
858    pub struct Mp3Decoder {
859        target_sample_rate: u32,
860        target_channels: u16,
861        the_decoder: DecoderOwned<Vec<u8>>,
862        cur_frame: Option<Mp3AudioData>,
863        sample_pos: u64,
864        total_frames: u64,
865        resampler: Resampler,
866    }
867
868    impl Debug for Mp3Decoder {
869        fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
870            fmt.debug_struct("Mp3Decoder")
871                .field("target_sample_rate", &self.target_sample_rate)
872                .field("target_channels", &self.target_channels)
873                .field("the_decoder", &format_args!("DecoderOwned<Vec<u8>>"))
874                .field("cur_frame", &self.cur_frame)
875                .field("sample_pos", &self.sample_pos)
876                .field("total_frames", &self.total_frames)
877                .field("resampler", &self.resampler)
878                .finish()
879        }
880    }
881
882    /// * The `Mp3AudioData` for a MP3 frame.
883    ///   **NOTE:** Some people like to concat MP3 files savagely just like concat binary files, and the MP3 format actually supports this kind of operation.
884    ///   If the concat MP3 files have different sample rates, this will cause the sample rate to change while you are just normally parsing and decoding the MP3 file.
885    ///   This was done by using a resampler here.
886    #[derive(Clone)]
887    pub struct Mp3AudioData {
888        pub bitrate: u32,
889        pub channels: u16,
890        pub mpeg_layer: u8,
891        pub sample_rate: u32,
892        pub sample_count: usize,
893        pub samples: Vec<i16>,
894        pub buffer_index: usize,
895    }
896
897    impl Debug for Mp3AudioData {
898        fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
899            fmt.debug_struct("Mp3AudioData")
900                .field("bitrate", &self.bitrate)
901                .field("channels", &self.channels)
902                .field("mpeg_layer", &self.mpeg_layer)
903                .field("sample_rate", &self.sample_rate)
904                .field("sample_count", &self.sample_count)
905                .field("samples", &format_args!("[i16; {}]", self.samples.len()))
906                .field("buffer_index", &self.buffer_index)
907                .finish()
908        }
909    }
910
911    impl Mp3Decoder {
912        pub fn new(
913            reader: Box<dyn Reader>,
914            data_offset: u64,
915            data_length: u64,
916            fmt: &FmtChunk,
917            total_samples: u64,
918        ) -> Result<Self, AudioReadError> {
919            let mut reader = reader;
920            let mut mp3_raw_data = vec![0u8; data_length as usize];
921            reader.seek(SeekFrom::Start(data_offset))?;
922            reader.read_exact(&mut mp3_raw_data)?;
923            let the_decoder = rmp3::DecoderOwned::new(mp3_raw_data);
924            let mut ret = Self {
925                target_sample_rate: fmt.sample_rate,
926                target_channels: fmt.channels,
927                the_decoder,
928                cur_frame: None,
929                sample_pos: 0,
930                total_frames: total_samples,
931                resampler: Resampler::new(Resampler::get_rounded_up_fft_size(fmt.sample_rate)),
932            };
933            ret.cur_frame = ret.get_next_frame();
934            if let Some(ref mp3frame) = ret.cur_frame {
935                ret.total_frames /= mp3frame.channels as u64;
936            }
937            Ok(ret)
938        }
939
940        fn reset(&mut self) {
941            self.the_decoder.set_position(0);
942            self.cur_frame = self.get_next_frame();
943            self.sample_pos = 0;
944        }
945
946        fn do_resample(&self, samples: &[i16], channels: u16, src_sample_rate: u32) -> Vec<i16> {
947            let process_size = self.resampler.get_process_size(
948                self.resampler.get_fft_size(),
949                src_sample_rate,
950                self.target_sample_rate,
951            );
952            let mut monos = audioutils::interleaved_samples_to_monos(samples, channels).unwrap();
953            for mono in monos.iter_mut() {
954                let mut iter = mem::take(mono).into_iter();
955                loop {
956                    let block: Vec<i16> = iter.by_ref().take(process_size).collect();
957                    if block.is_empty() {
958                        break;
959                    }
960                    mono.extend(&audioutils::do_resample_mono(
961                        &self.resampler,
962                        &block,
963                        src_sample_rate,
964                        self.target_sample_rate,
965                    ));
966                }
967            }
968            audioutils::monos_to_interleaved_samples(&monos).unwrap()
969        }
970
971        fn get_next_frame(&mut self) -> Option<Mp3AudioData> {
972            while let Some(frame) = self.the_decoder.next() {
973                if let Frame::Audio(audio) = frame {
974                    if let Some(cur_frame) = &self.cur_frame {
975                        self.sample_pos += cur_frame.sample_count as u64;
976                    }
977
978                    let mut ret = Mp3AudioData {
979                        bitrate: audio.bitrate(),
980                        channels: audio.channels(),
981                        mpeg_layer: audio.mpeg_layer(),
982                        sample_rate: audio.sample_rate(),
983                        sample_count: audio.sample_count(),
984                        samples: audio.samples().to_vec(),
985                        buffer_index: 0,
986                    };
987
988                    // First, convert the source channels to the target channels
989                    match (ret.channels, self.target_channels) {
990                        (1, t) => {
991                            ret.samples = mem::take(&mut ret.samples)
992                                .into_iter()
993                                .flat_map(|s| -> Vec<i16> { vec![s; t as usize] })
994                                .collect();
995                            ret.channels = self.target_channels;
996                        }
997                        (t, 1) => {
998                            let mut iter = mem::take(&mut ret.samples).into_iter();
999                            loop {
1000                                let frame: Vec<i32> =
1001                                    iter.by_ref().take(t as usize).map(|s| s as i32).collect();
1002                                if frame.is_empty() {
1003                                    break;
1004                                }
1005                                ret.samples
1006                                    .push((frame.iter().sum::<i32>() / frame.len() as i32) as i16);
1007                            }
1008                            ret.channels = self.target_channels;
1009                        }
1010                        (s, t) => {
1011                            if s != t {
1012                                eprintln!("Can't change {s} channels to {t} channels.");
1013                            }
1014                        }
1015                    }
1016
1017                    // Second, change the sample rate to match the target sample rate
1018                    ret.samples = self.do_resample(&ret.samples, ret.channels, ret.sample_rate);
1019                    ret.sample_rate = self.target_sample_rate;
1020                    ret.sample_count = ret.samples.len() / ret.channels as usize;
1021
1022                    return Some(ret);
1023                }
1024            }
1025            None
1026        }
1027
1028        pub fn get_cur_frame_index(&self) -> u64 {
1029            if let Some(frame) = &self.cur_frame {
1030                self.sample_pos + (frame.buffer_index as u64)
1031            } else {
1032                0u64
1033            }
1034        }
1035
1036        pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
1037            let frame_index = match seek_from {
1038                SeekFrom::Start(fi) => fi,
1039                SeekFrom::Current(cur) => (self.get_cur_frame_index() as i64 + cur) as u64,
1040                SeekFrom::End(end) => (self.total_frames as i64 + end) as u64,
1041            };
1042            if self.sample_pos > frame_index {
1043                self.reset();
1044            }
1045            loop {
1046                if let Some(cur_frame) = &self.cur_frame {
1047                    if self.sample_pos + (cur_frame.sample_count as u64) > frame_index {
1048                        break;
1049                    } else {
1050                        self.cur_frame = self.get_next_frame();
1051                    }
1052                } else {
1053                    return Ok(());
1054                }
1055            }
1056            for _ in 0..(frame_index - self.sample_pos) {
1057                let _ = self.decode_stereo_raw()?;
1058            }
1059            Ok(())
1060        }
1061
1062        pub fn get_channels(&self) -> u16 {
1063            self.target_channels
1064        }
1065
1066        pub fn get_sample_rate(&self) -> u32 {
1067            self.target_sample_rate
1068        }
1069
1070        pub fn get_cur_frame(&self) -> &Option<Mp3AudioData> {
1071            &self.cur_frame
1072        }
1073
1074        pub fn decode_mono_raw(&mut self) -> Result<Option<i16>, AudioReadError> {
1075            match self.cur_frame {
1076                None => Ok(None),
1077                Some(ref mut frame) => match frame.channels {
1078                    1 => {
1079                        let sample = frame.samples[frame.buffer_index];
1080                        frame.buffer_index += 1;
1081                        if frame.buffer_index >= frame.sample_count {
1082                            self.cur_frame = self.get_next_frame();
1083                        }
1084                        Ok(Some(sample))
1085                    }
1086                    2 => {
1087                        let l = frame.samples[frame.buffer_index * 2];
1088                        let r = frame.samples[frame.buffer_index * 2 + 1];
1089                        frame.buffer_index += 1;
1090                        if frame.buffer_index >= frame.sample_count {
1091                            self.cur_frame = self.get_next_frame();
1092                        }
1093                        Ok(Some(((l as i32 + r as i32) / 2i32) as i16))
1094                    }
1095                    o => Err(AudioReadError::InvalidData(format!(
1096                        "Unknown channel count {o}."
1097                    ))),
1098                },
1099            }
1100        }
1101
1102        pub fn decode_stereo_raw(&mut self) -> Result<Option<(i16, i16)>, AudioReadError> {
1103            match self.cur_frame {
1104                None => Ok(None),
1105                Some(ref mut frame) => match frame.channels {
1106                    1 => {
1107                        let sample = frame.samples[frame.buffer_index];
1108                        frame.buffer_index += 1;
1109                        if frame.buffer_index >= frame.sample_count {
1110                            self.cur_frame = self.get_next_frame();
1111                        }
1112                        Ok(Some((sample, sample)))
1113                    }
1114                    2 => {
1115                        let l = frame.samples[frame.buffer_index * 2];
1116                        let r = frame.samples[frame.buffer_index * 2 + 1];
1117                        frame.buffer_index += 1;
1118                        if frame.buffer_index >= frame.sample_count {
1119                            self.cur_frame = self.get_next_frame();
1120                        }
1121                        Ok(Some((l, r)))
1122                    }
1123                    o => Err(AudioReadError::InvalidData(format!(
1124                        "Unknown channel count {o}."
1125                    ))),
1126                },
1127            }
1128        }
1129
1130        pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
1131        where
1132            S: SampleType,
1133        {
1134            match self.decode_mono_raw()? {
1135                None => Ok(None),
1136                Some(s) => Ok(Some(S::scale_from(s))),
1137            }
1138        }
1139
1140        pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
1141        where
1142            S: SampleType,
1143        {
1144            match self.decode_stereo_raw()? {
1145                None => Ok(None),
1146                Some((l, r)) => Ok(Some((S::scale_from(l), S::scale_from(r)))),
1147            }
1148        }
1149
1150        pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
1151        where
1152            S: SampleType,
1153        {
1154            let stereo = self.decode_stereo::<S>()?;
1155            match stereo {
1156                None => Ok(None),
1157                Some((l, r)) => match self.target_channels {
1158                    1 => Ok(Some(vec![S::scale_from(l)])),
1159                    2 => Ok(Some(vec![S::scale_from(l), S::scale_from(r)])),
1160                    o => Err(AudioReadError::InvalidData(format!(
1161                        "Unknown channel count {o}."
1162                    ))),
1163                },
1164            }
1165        }
1166    }
1167}
1168
1169/// * The Opus decoder for `WaveReader`
1170#[cfg(feature = "opus")]
1171pub mod opus {
1172    use std::{
1173        fmt::{self, Debug, Formatter},
1174        io::SeekFrom,
1175    };
1176
1177    use crate::SampleType;
1178    use crate::errors::AudioReadError;
1179    use crate::chunks::FmtChunk;
1180    use crate::io_utils::Reader;
1181
1182    use opus::{self, Channels, Decoder, ErrorCode};
1183
1184    pub struct OpusDecoder {
1185        reader: Box<dyn Reader>,
1186        decoder: Decoder,
1187        channels: u16,
1188        sample_rate: u32,
1189        data_offset: u64,
1190        data_length: u64,
1191        total_frames: u64,
1192        block_align: usize,
1193        decoded_samples: Vec<f32>,
1194        decoded_samples_index: usize,
1195        frame_index: u64,
1196    }
1197
1198    impl OpusDecoder {
1199        pub fn new(
1200            mut reader: Box<dyn Reader>,
1201            data_offset: u64,
1202            data_length: u64,
1203            fmt: &FmtChunk,
1204            total_samples: u64,
1205        ) -> Result<Self, AudioReadError> {
1206            let channels = fmt.channels;
1207            let sample_rate = fmt.sample_rate;
1208            let opus_channels = match channels {
1209                1 => Channels::Mono,
1210                2 => Channels::Stereo,
1211                o => {
1212                    return Err(AudioReadError::InvalidArguments(format!(
1213                        "Bad channels: {o} for the opus decoder."
1214                    )));
1215                }
1216            };
1217            let decoder = Decoder::new(sample_rate, opus_channels)?;
1218            reader.seek(SeekFrom::Start(data_offset))?;
1219            Ok(Self {
1220                reader,
1221                decoder,
1222                channels,
1223                sample_rate,
1224                data_offset,
1225                data_length,
1226                total_frames: total_samples / channels as u64,
1227                block_align: fmt.block_align as usize,
1228                decoded_samples: Vec::<f32>::new(),
1229                decoded_samples_index: 0,
1230                frame_index: 0,
1231            })
1232        }
1233
1234        pub fn get_channels(&self) -> u16 {
1235            self.channels
1236        }
1237
1238        pub fn get_sample_rate(&self) -> u32 {
1239            self.sample_rate
1240        }
1241
1242        pub fn get_cur_frame_index(&self) -> u64 {
1243            self.frame_index
1244        }
1245
1246        fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
1247            if self.reader.stream_position()? >= self.data_offset + self.data_length {
1248                Ok(true)
1249            } else {
1250                Ok(false)
1251            }
1252        }
1253
1254        fn clear_decoded_samples_buffer(&mut self) {
1255            self.decoded_samples.clear();
1256            self.decoded_samples_index = 0;
1257        }
1258
1259        fn get_samples_per_block(&self) -> usize {
1260            self.block_align
1261        }
1262
1263        fn decode_block(&mut self) -> Result<(), AudioReadError> {
1264            if self.is_end_of_data()? {
1265                self.clear_decoded_samples_buffer();
1266                return Ok(());
1267            }
1268
1269            // Prepare the buffers
1270            let mut buf = vec![0u8; self.block_align];
1271            let samples_to_get = self.get_samples_per_block();
1272            self.reader.read_exact(&mut buf)?;
1273            self.decoded_samples = vec![0.0; samples_to_get];
1274
1275            // Reset the sample index
1276            self.decoded_samples_index = 0;
1277
1278            // Perform the decode call
1279            let frames =
1280                self.decoder
1281                    .decode_float(&buf, &mut self.decoded_samples, /*fec*/ false)?;
1282
1283            // Check out the result
1284            let samples = frames * self.channels as usize;
1285            if samples != samples_to_get {
1286                Err(AudioReadError::IncompleteData(format!(
1287                    "Expected {samples_to_get} samples will be decoded, got {samples} samples."
1288                )))
1289            } else {
1290                Ok(())
1291            }
1292        }
1293
1294        pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
1295            let frame_index = match seek_from {
1296                SeekFrom::Start(fi) => fi,
1297                SeekFrom::Current(cur) => (self.frame_index as i64 + cur) as u64,
1298                SeekFrom::End(end) => (self.total_frames as i64 + end) as u64,
1299            };
1300            self.frame_index = frame_index;
1301            let block_align = self.block_align as u64;
1302            let block_index = frame_index / block_align;
1303            let seek_to = self.data_offset + block_index * block_align;
1304            self.reader.seek(SeekFrom::Start(seek_to))?;
1305            if seek_to < self.data_offset + self.data_length {
1306                self.decode_block()?;
1307                self.decoded_samples_index = ((frame_index * self.channels as u64)
1308                    - block_index * self.get_samples_per_block() as u64)
1309                    as usize;
1310            } else {
1311                self.clear_decoded_samples_buffer();
1312            }
1313            Ok(())
1314        }
1315
1316        fn decode_sample<S>(&mut self) -> Result<Option<S>, AudioReadError>
1317        where
1318            S: SampleType,
1319        {
1320            if self.decoded_samples_index >= self.decoded_samples.len() {
1321                self.decode_block()?;
1322            }
1323            if self.decoded_samples.is_empty() {
1324                Ok(None)
1325            } else {
1326                let ret = S::scale_from(self.decoded_samples[self.decoded_samples_index]);
1327                self.decoded_samples_index += 1;
1328                Ok(Some(ret))
1329            }
1330        }
1331
1332        pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
1333        where
1334            S: SampleType,
1335        {
1336            let frame: Result<Vec<Option<S>>, AudioReadError> = (0..self.channels)
1337                .map(|_| self.decode_sample::<S>())
1338                .collect();
1339            match frame {
1340                Ok(frame) => {
1341                    let frame: Vec<S> = frame.into_iter().flatten().collect();
1342                    if frame.is_empty() {
1343                        Ok(None)
1344                    } else {
1345                        Ok(Some(S::average_arr(&frame)))
1346                    }
1347                }
1348                Err(e) => Err(e),
1349            }
1350        }
1351
1352        pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
1353        where
1354            S: SampleType,
1355        {
1356            match self.channels {
1357                1 => {
1358                    if let Some(s) = self.decode_sample::<S>()? {
1359                        self.frame_index += 1;
1360                        Ok(Some((s, s)))
1361                    } else {
1362                        Ok(None)
1363                    }
1364                }
1365                2 => {
1366                    let l = self.decode_sample::<S>()?;
1367                    let r = self.decode_sample::<S>()?;
1368                    if l.is_some() || r.is_some() {
1369                        self.frame_index += 1;
1370                        Ok(Some((l.unwrap(), r.unwrap())))
1371                    } else {
1372                        Ok(None)
1373                    }
1374                }
1375                o => Err(AudioReadError::InvalidData(format!(
1376                    "Can't convert {o} channel audio to stereo channel audio"
1377                ))),
1378            }
1379        }
1380
1381        pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
1382        where
1383            S: SampleType,
1384        {
1385            let frame: Result<Vec<Option<S>>, AudioReadError> = (0..self.channels)
1386                .map(|_| self.decode_sample::<S>())
1387                .collect();
1388            match frame {
1389                Ok(frame) => {
1390                    let frame: Vec<S> = frame.into_iter().flatten().collect();
1391                    if frame.is_empty() {
1392                        Ok(None)
1393                    } else {
1394                        Ok(Some(frame))
1395                    }
1396                }
1397                Err(e) => Err(e),
1398            }
1399        }
1400    }
1401
1402    impl Debug for OpusDecoder {
1403        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
1404            f.debug_struct("OpusDecoder")
1405                .field("reader", &self.reader)
1406                .field("decoder", &self.decoder)
1407                .field("channels", &self.channels)
1408                .field("sample_rate", &self.sample_rate)
1409                .field("data_offset", &self.data_offset)
1410                .field("data_length", &self.data_length)
1411                .field("total_frames", &self.total_frames)
1412                .field("block_align", &self.block_align)
1413                .field(
1414                    "decoded_samples",
1415                    &format_args!("[f32; {}]", self.decoded_samples.len()),
1416                )
1417                .field("decoded_samples_index", &self.decoded_samples_index)
1418                .field("frame_index", &self.frame_index)
1419                .finish()
1420        }
1421    }
1422
1423    impl From<opus::Error> for AudioReadError {
1424        fn from(err: opus::Error) -> Self {
1425            match err.code() {
1426                ErrorCode::BadArg => Self::InvalidArguments(format!("On calling `{}`: {}", err.function(), err.description())),
1427                ErrorCode::BufferTooSmall => Self::BufferTooSmall(format!("On calling `{}`: {}", err.function(), err.description())),
1428                ErrorCode::InternalError => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
1429                ErrorCode::InvalidPacket => Self::InvalidData(format!("On calling `{}`: {}", err.function(), err.description())),
1430                ErrorCode::Unimplemented => Self::Unimplemented(format!("On calling `{}`: {}", err.function(), err.description())),
1431                ErrorCode::InvalidState => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
1432                ErrorCode::AllocFail => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
1433                ErrorCode::Unknown => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
1434            }
1435        }
1436    }
1437}
1438
1439/// * The FLAC decoder for `WaveReader`
1440#[cfg(feature = "flac")]
1441pub mod flac_dec {
1442    use std::{
1443        cmp::Ordering,
1444        collections::BTreeMap,
1445        fmt::{self, Debug, Formatter},
1446        io::{self, ErrorKind, Read, Seek, SeekFrom},
1447        ptr,
1448    };
1449
1450    use flac::{
1451        FlacDecoderUnmovable,
1452        options::FlacAudioForm,
1453        closure_objects::{FlacReadStatus, SamplesInfo, FlacInternalDecoderError},
1454    };
1455    use resampler::Resampler;
1456    use downmixer::Downmixer;
1457    use sampletypes::SampleType;
1458    use io_utils::Reader;
1459    use audioutils::{do_resample_frames, sample_conv, sample_conv_batch};
1460    use crate::errors::{AudioReadError, IOErrorInfo};
1461    use crate::chunks::{FmtChunk, ListChunk, ListInfo};
1462    use crate::wavcore::flac::get_listinfo_flacmeta;
1463
1464    /// A wrapper for the WaveReader to decode FLAC audio encapsulated in the WAV file.
1465    pub struct FlacDecoderWrap<'a> {
1466        /// The decoder core
1467        decoder: Box<FlacDecoderUnmovable<'a, Box<dyn Reader>>>,
1468
1469        /// The resampler for decoding. What if some of the blocks has different sample rate, this thing will help
1470        resampler: Resampler,
1471
1472        /// The number of channels of the FLAC audio
1473        channels: u16,
1474
1475        /// The sample rate of the FLAC audio
1476        sample_rate: u32,
1477
1478        /// The offset of the FLAC file data in the source file
1479        data_offset: u64,
1480
1481        /// The length of the FLAC file data in the source file
1482        data_length: u64,
1483
1484        /// The decoded frames of the current block
1485        decoded_frames: Vec<Vec<i32>>,
1486
1487        /// The decode position in the decoded frames
1488        decoded_frames_index: usize,
1489
1490        /// The current decode position
1491        frame_index: u64,
1492
1493        /// How many frames in total
1494        total_frames: u64,
1495
1496        /// A boxed pointer points to this struct itself. The `extern "system"` callback functions rely on this poiner to convert the call to our closure calls.
1497        self_ptr: Box<*mut FlacDecoderWrap<'a>>,
1498
1499        /// The downmixer for multiple channels audio to decode into 2 or 1 channels
1500        pub downmixer: Downmixer,
1501    }
1502
1503    impl FlacDecoderWrap<'_> {
1504        pub fn new(
1505            reader: Box<dyn Reader>,
1506            data_offset: u64,
1507            data_length: u64,
1508            fmt: &FmtChunk,
1509            total_samples: u64,
1510            downmixer: Option<Downmixer>,
1511        ) -> Result<Self, AudioReadError> {
1512            // `self_ptr`: A boxed raw pointer points to the `FlacDecoderWrap`, before calling `decoder.decode()`, must set the pointer inside the box to `self`
1513            let mut self_ptr: Box<*mut Self> = Box::new(ptr::null_mut());
1514            let self_ptr_ptr = (&mut *self_ptr) as *mut *mut Self;
1515            let decoder = Box::new(FlacDecoderUnmovable::new(
1516                reader,
1517                // on_read
1518                Box::new(
1519                    move |reader: &mut Box<dyn Reader>, buffer: &mut [u8]| -> (usize, FlacReadStatus) {
1520                        let to_read = buffer.len();
1521                        match reader.read(buffer) {
1522                            Ok(size) => match size.cmp(&to_read) {
1523                                Ordering::Equal => (size, FlacReadStatus::GoOn),
1524                                Ordering::Less => (size, FlacReadStatus::Eof),
1525                                Ordering::Greater => panic!(
1526                                    "`reader.read()` returns a size greater than the desired size."
1527                                ),
1528                            },
1529                            Err(e) => {
1530                                eprintln!("on_read(): {:?}", e);
1531                                (0, FlacReadStatus::Abort)
1532                            }
1533                        }
1534                    },
1535                ),
1536                // on_seek
1537                Box::new(
1538                    move |reader: &mut Box<dyn Reader>, position: u64| -> io::Result<()> {
1539                        reader.seek(SeekFrom::Start(data_offset + position))?;
1540                        Ok(())
1541                    },
1542                ),
1543                // on_tell
1544                Box::new(move |reader: &mut Box<dyn Reader>| -> io::Result<u64> {
1545                    Ok(reader.stream_position()? - data_offset)
1546                }),
1547                // on_length
1548                Box::new(move |_reader: &mut Box<dyn Reader>| -> io::Result<u64> {
1549                    Ok(data_length)
1550                }),
1551                // on_eof
1552                Box::new(move |reader: &mut Box<dyn Reader>| -> bool {
1553                    reader.stream_position().unwrap() >= data_offset + data_length
1554                }),
1555                // on_write
1556                Box::new(
1557                    move |frames: &[Vec<i32>],
1558                          sample_info: &SamplesInfo|
1559                          -> io::Result<()> {
1560                        // Before `on_write()` was called, make sure `self_ptr` was updated to the `self` pointer of `FlacDecoderWrap`
1561                        let this = unsafe { &mut *(*self_ptr_ptr).cast::<Self>() };
1562                        this.decoded_frames_index = 0;
1563                        if sample_info.sample_rate != this.sample_rate {
1564                            this.decoded_frames.clear();
1565                            let process_size = this.resampler.get_process_size(
1566                                this.resampler.get_fft_size(),
1567                                sample_info.sample_rate,
1568                                this.sample_rate,
1569                            );
1570                            let mut iter = frames.iter();
1571                            loop {
1572                                let block: Vec<Vec<i32>> =
1573                                    iter.by_ref().take(process_size).cloned().collect();
1574                                if block.is_empty() {
1575                                    break;
1576                                }
1577                                this.decoded_frames.extend(
1578                                    sample_conv_batch(&do_resample_frames(
1579                                        &this.resampler,
1580                                        &block,
1581                                        sample_info.sample_rate,
1582                                        this.sample_rate,
1583                                    ))
1584                                    .to_vec(),
1585                                );
1586                            }
1587                            this.decoded_frames.shrink_to_fit();
1588                        } else {
1589                            this.decoded_frames = frames.to_vec();
1590                        }
1591
1592                        Ok(())
1593                    },
1594                ),
1595                // on_error
1596                Box::new(move |error: FlacInternalDecoderError| {
1597                    eprintln!("on_error({error})");
1598                }),
1599                true, // md5_checking
1600                true, // scale_to_i32_range
1601                FlacAudioForm::FrameArray,
1602            )?);
1603            let downmixer = if let Some(downmixer) = downmixer {
1604                downmixer
1605            } else {
1606                use downmixer::{DownmixerParams, speaker_positions::*};
1607                let channel_mask = match fmt.channels {
1608                    1 => MONO_LAYOUT,
1609                    2 => STEREO_LAYOUT,
1610                    3 => SURROUND_LAYOUT,
1611                    4 => STEREO_LAYOUT | BACK_LR_BITS,
1612                    5 => SURROUND_LAYOUT | BACK_LR_BITS,
1613                    6 => DOLBY_5_1_FRONT_SIDE_LAYOUT,
1614                    7 => DOLBY_6_1_LAYOUT,
1615                    8 => DOLBY_7_1_LAYOUT,
1616                    o => return Err(AudioReadError::InvalidArguments(format!("Bad channel number: {o}"))),
1617                };
1618                Downmixer::new(channel_mask, DownmixerParams::new())
1619            };
1620            let mut ret = Self {
1621                decoder,
1622                resampler: Resampler::new(Resampler::get_rounded_up_fft_size(fmt.sample_rate)),
1623                channels: fmt.channels,
1624                sample_rate: fmt.sample_rate,
1625                data_offset,
1626                data_length,
1627                decoded_frames: Vec::<Vec<i32>>::new(),
1628                decoded_frames_index: 0,
1629                frame_index: 0,
1630                total_frames: total_samples / fmt.channels as u64,
1631                self_ptr,
1632                downmixer,
1633            };
1634            *ret.self_ptr = &mut ret as *mut Self;
1635            ret.decoder.initialize()?;
1636            Ok(ret)
1637        }
1638
1639        fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
1640            Ok(self.decoder.eof())
1641        }
1642
1643        fn clear_decoded_frames(&mut self) {
1644            self.decoded_frames.clear();
1645            self.decoded_frames_index = 0;
1646        }
1647
1648        fn decode_block(&mut self) -> Result<(), AudioReadError> {
1649            if self.is_end_of_data()? {
1650                self.clear_decoded_frames();
1651                Ok(())
1652            } else {
1653                // When to decode, the FLAC decoder will call our callback functions, then our closures will be called.
1654                // These closures captured the address of the boxed `self_ptr`, and will use the pointer to find `self`
1655                *self.self_ptr = self as *mut Self;
1656                self.decoder.decode()?;
1657                Ok(())
1658            }
1659        }
1660
1661        pub fn get_metadata_as_list(&self) -> Result<ListChunk, AudioReadError> {
1662            let comments = self.decoder.get_comments();
1663            let mut listinfo = ListChunk::Info(BTreeMap::<String, String>::new());
1664
1665            for (list_key, flac_key) in get_listinfo_flacmeta().iter() {
1666                if let Some(data) = comments.get(flac_key.to_owned()) {
1667                    listinfo.set(list_key, data)?;
1668                }
1669            }
1670
1671            Ok(listinfo)
1672        }
1673
1674        pub fn get_channels(&self) -> u16 {
1675            self.channels
1676        }
1677
1678        pub fn get_sample_rate(&self) -> u32 {
1679            self.sample_rate
1680        }
1681
1682        pub fn get_cur_frame_index(&self) -> u64 {
1683            self.frame_index
1684        }
1685
1686        pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
1687            let frame_index = match seek_from {
1688                SeekFrom::Start(fi) => fi,
1689                SeekFrom::Current(cur) => (self.frame_index as i64 + cur) as u64,
1690                SeekFrom::End(end) => (self.total_frames as i64 + end) as u64,
1691            };
1692            self.clear_decoded_frames();
1693            self.frame_index = frame_index;
1694            self.decoder.seek(frame_index)?;
1695
1696            Ok(())
1697        }
1698
1699        pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
1700        where
1701            S: SampleType,
1702        {
1703            if self.is_end_of_data()? {
1704                Ok(None)
1705            } else if self.decoded_frames_index < self.decoded_frames.len() {
1706                let ret = sample_conv(&self.decoded_frames[self.decoded_frames_index]);
1707                self.decoded_frames_index += 1;
1708                self.frame_index += 1;
1709                Ok(Some(ret.to_vec()))
1710            } else {
1711                self.decode_block()?;
1712                self.decoded_frames_index = 0;
1713                self.decode_frame::<S>()
1714            }
1715        }
1716
1717        pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
1718        where
1719            S: SampleType,
1720        {
1721            if let Some(frame) = self.decode_frame::<S>()? {
1722                Ok(Some(self.downmixer.downmix_frame_to_stereo(&frame)))
1723            } else {
1724                Ok(None)
1725            }
1726        }
1727
1728        pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
1729        where
1730            S: SampleType,
1731        {
1732            if let Some(frame) = self.decode_frame::<S>()? {
1733                Ok(Some(self.downmixer.downmix_frame_to_mono(&frame)))
1734            } else {
1735                Ok(None)
1736            }
1737        }
1738    }
1739
1740    impl Debug for FlacDecoderWrap<'_> {
1741        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
1742            f.debug_struct("FlacDecoderWrap")
1743                .field("decoder", &self.decoder)
1744                .field("resampler", &self.resampler)
1745                .field("channels", &self.channels)
1746                .field("sample_rate", &self.sample_rate)
1747                .field("data_offset", &self.data_offset)
1748                .field("data_length", &self.data_length)
1749                .field(
1750                    "decoded_frames",
1751                    &format_args!("[i32; {}]", self.decoded_frames.len()),
1752                )
1753                .field("decoded_frames_index", &self.decoded_frames_index)
1754                .field("frame_index", &self.frame_index)
1755                .field("total_frames", &self.total_frames)
1756                .field("self_ptr", &self.self_ptr)
1757                .finish()
1758        }
1759    }
1760
1761    use flac::errors::*;
1762    impl From<FlacEncoderInitError> for AudioReadError {
1763        fn from(err: FlacEncoderInitError) -> Self {
1764            let err_code = err.code;
1765            let err_func = err.function;
1766            let err_desc = err.message;
1767            use FlacEncoderInitErrorCode::*;
1768            let err_code = FlacEncoderInitErrorCode::from(err_code);
1769            let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
1770            match err_code {
1771                StreamEncoderInitStatusOk => Self::OtherReason(err_string),
1772                StreamEncoderInitStatusEncoderError => Self::OtherReason(err_string),
1773                StreamEncoderInitStatusUnsupportedContainer => Self::OtherReason(err_string),
1774                StreamEncoderInitStatusInvalidCallbacks => Self::InvalidArguments(err_string),
1775                StreamEncoderInitStatusInvalidNumberOfChannels => Self::InvalidArguments(err_string),
1776                StreamEncoderInitStatusInvalidBitsPerSample => Self::InvalidArguments(err_string),
1777                StreamEncoderInitStatusInvalidSampleRate => Self::InvalidArguments(err_string),
1778                StreamEncoderInitStatusInvalidBlockSize => Self::InvalidArguments(err_string),
1779                StreamEncoderInitStatusInvalidMaxLpcOrder => Self::InvalidArguments(err_string),
1780                StreamEncoderInitStatusInvalidQlpCoeffPrecision => Self::InvalidArguments(err_string),
1781                StreamEncoderInitStatusBlockSizeTooSmallForLpcOrder => Self::BufferTooSmall(err_string),
1782                StreamEncoderInitStatusNotStreamable => Self::OtherReason(err_string),
1783                StreamEncoderInitStatusInvalidMetadata => Self::FormatError(err_string),
1784                StreamEncoderInitStatusAlreadyInitialized => Self::InvalidArguments(err_string),
1785            }
1786        }
1787    }
1788
1789    impl From<FlacDecoderError> for AudioReadError {
1790        fn from(err: FlacDecoderError) -> Self {
1791            let err_code = err.code;
1792            let err_func = err.function;
1793            let err_desc = err.message;
1794            use FlacDecoderInitErrorCode::*;
1795            let err_code = FlacDecoderInitErrorCode::from(err_code);
1796            let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
1797            match err_code {
1798                StreamDecoderInitStatusOk => Self::OtherReason(err_string),
1799                StreamDecoderInitStatusUnsupportedContainer => Self::Unsupported(err_string),
1800                StreamDecoderInitStatusInvalidCallbacks => Self::InvalidArguments(err_string),
1801                StreamDecoderInitStatusMemoryAllocationError => Self::OtherReason(err_string),
1802                StreamDecoderInitStatusErrorOpeningFile => {
1803                    Self::IOError(IOErrorInfo::new(ErrorKind::Other, err_string))
1804                }
1805                StreamDecoderInitStatusAlreadyInitialized => Self::InvalidArguments(err_string),
1806            }
1807        }
1808    }
1809
1810    impl From<FlacDecoderInitError> for AudioReadError {
1811        fn from(err: FlacDecoderInitError) -> Self {
1812            let err_code = err.code;
1813            let err_func = err.function;
1814            let err_desc = err.message;
1815            use FlacDecoderErrorCode::*;
1816            let err_code = FlacDecoderErrorCode::from(err_code);
1817            let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
1818            match err_code {
1819                StreamDecoderSearchForMetadata => Self::OtherReason(err_string),
1820                StreamDecoderReadMetadata => Self::OtherReason(err_string),
1821                StreamDecoderSearchForFrameSync => Self::OtherReason(err_string),
1822                StreamDecoderReadFrame => Self::OtherReason(err_string),
1823                StreamDecoderEndOfStream => Self::OtherReason(err_string),
1824                StreamDecoderOggError => Self::OtherReason(err_string),
1825                StreamDecoderSeekError => Self::OtherReason(err_string),
1826                StreamDecoderAborted => Self::OtherReason(err_string),
1827                StreamDecoderMemoryAllocationError => Self::OtherReason(err_string),
1828                StreamDecoderUninitialized => Self::InvalidArguments(err_string),
1829            }
1830        }
1831    }
1832
1833    impl From<&dyn FlacError> for AudioReadError {
1834        fn from(err: &dyn FlacError) -> Self {
1835            let err_code = err.get_code();
1836            let err_func = err.get_function();
1837            let err_desc = err.get_message();
1838            if let Some(encoder_err) = err.as_any().downcast_ref::<FlacEncoderError>() {
1839                AudioReadError::from(*encoder_err)
1840            } else if let Some(encoder_err) = err.as_any().downcast_ref::<FlacEncoderInitError>()
1841            {
1842                AudioReadError::from(*encoder_err)
1843            } else if let Some(decoder_err) = err.as_any().downcast_ref::<FlacDecoderError>() {
1844                AudioReadError::from(*decoder_err)
1845            } else if let Some(decoder_err) = err.as_any().downcast_ref::<FlacDecoderInitError>()
1846            {
1847                AudioReadError::from(*decoder_err)
1848            } else {
1849                Self::OtherReason(format!(
1850                    "Unknown error type from `FlacError`: `{err_func}`: {err_code}: {err_desc}"
1851                ))
1852            }
1853        }
1854    }
1855
1856    impl From<FlacEncoderError> for AudioReadError {
1857        fn from(err: FlacEncoderError) -> Self {
1858            let err_code = err.code;
1859            let err_func = err.function;
1860            let err_desc = err.message;
1861            use FlacEncoderErrorCode::*;
1862            let err_code = FlacEncoderErrorCode::from(err_code);
1863            let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
1864            match err_code {
1865                StreamEncoderOk => Self::OtherReason(err_string),
1866                StreamEncoderUninitialized => Self::OtherReason(err_string),
1867                StreamEncoderOggError => Self::OtherReason(err_string),
1868                StreamEncoderVerifyDecoderError => Self::OtherReason(err_string),
1869                StreamEncoderVerifyMismatchInAudioData => Self::OtherReason(err_string),
1870                StreamEncoderClientError => Self::OtherReason(err_string),
1871                StreamEncoderIOError => Self::IOError(IOErrorInfo::new(ErrorKind::Other, err_string)),
1872                StreamEncoderFramingError => Self::FormatError(err_string),
1873                StreamEncoderMemoryAllocationError => Self::OtherReason(err_string),
1874            }
1875        }
1876    }
1877}
1878
1879/// * The OggVorbis decoder for `WaveReader`
1880#[cfg(feature = "oggvorbis")]
1881pub mod oggvorbis_dec {
1882    use std::{
1883        fmt::{self, Debug, Formatter},
1884        io::{self, ErrorKind, Read, Write, Seek, SeekFrom},
1885        rc::Rc,
1886        cell::RefCell,
1887        ops::{Deref, DerefMut},
1888    };
1889
1890    use ogg::{OggPacket, OggStreamWriter};
1891    use io_utils::{Reader, SharedReader, CombinedReader, CursorVecU8, SharedCursor, DishonestReader};
1892    use vorbis_rs::VorbisDecoder;
1893    use downmixer::Downmixer;
1894    use sampletypes::SampleType;
1895    use crate::errors::{AudioReadError, IOErrorInfo};
1896    use crate::chunks::{FmtChunk, ext::ExtensionData};
1897    use crate::options::{OggVorbisMode, OggVorbisEncoderParams};
1898
1899    type OggVorbisHeaderToBodyCombinedReader = CombinedReader<CursorVecU8, SharedReader<Box<dyn Reader>>>;
1900    type OggVorbisDecoderReader = SharedReader<DishonestReader<OggVorbisHeaderToBodyCombinedReader>>;
1901
1902    /// * The OggVorbis decoder for `WaveReader`
1903    pub struct OggVorbisDecoderWrap {
1904        /// The shared reader for the decoder to use
1905        reader: OggVorbisDecoderReader,
1906
1907        /// Let the decoder use the shared reader. Because the decoder did't need the reader to implement the `Seek` trait, we can control where to let it decode from.
1908        decoder: VorbisDecoder<OggVorbisDecoderReader>,
1909
1910        /// The data offset of the OggVorbis data in the WAV file.
1911        data_offset: u64,
1912
1913        /// The size of the data
1914        data_length: u64,
1915
1916        /// How many audio frames in total
1917        total_frames: u64,
1918
1919        /// Channels, it seems that OggVorbis supports up to 8 channels
1920        channels: u16,
1921
1922        /// Sample rate
1923        sample_rate: u32,
1924
1925        /// The decoded samples as waveform arrays. If the decoder hits the end of the file, this field is set to `None`
1926        decoded_samples: Option<Vec<Vec<f32>>>,
1927
1928        /// Current frame index
1929        cur_frame_index: u64,
1930
1931        /// Current block frame index. The start index of the decoded samples.
1932        cur_block_frame_index: u64,
1933
1934        /// The downmixer for multiple channels audio to decode into 2 or 1 channels
1935        pub downmixer: Downmixer,
1936    }
1937
1938    // ## An shared `OggStreamWriteToCursor`
1939    #[derive(Debug)]
1940    pub struct SharedOggStreamWriteToCursor(Rc<RefCell<OggStreamWriteToCursor>>);
1941
1942    impl SharedOggStreamWriteToCursor {
1943        pub fn new(stream_id: u32) -> Self {
1944            Self(Rc::new(RefCell::new(OggStreamWriteToCursor::new(stream_id))))
1945        }
1946    }
1947
1948    impl Clone for SharedOggStreamWriteToCursor {
1949        fn clone(&self) -> Self {
1950            Self(self.0.clone())
1951        }
1952    }
1953
1954    impl Deref for SharedOggStreamWriteToCursor {
1955        type Target = OggStreamWriteToCursor;
1956
1957        fn deref(&self) -> &Self::Target {
1958            unsafe{&*self.0.as_ptr()}
1959        }
1960    }
1961
1962    impl DerefMut for SharedOggStreamWriteToCursor {
1963        fn deref_mut(&mut self) -> &mut Self::Target {
1964            unsafe{&mut *self.0.as_ptr()}
1965        }
1966    }
1967
1968    impl OggVorbisDecoderWrap {
1969        pub fn new(
1970            reader: Box<dyn Reader>,
1971            data_offset: u64,
1972            data_length: u64,
1973            fmt: &FmtChunk,
1974            total_samples: u64,
1975            downmixer: Option<Downmixer>,
1976        ) -> Result<Self, AudioReadError> {
1977            use crate::wavcore::format_tags::*;
1978            let mut ogg_stream_writer: Option<SharedOggStreamWriteToCursor> = None;
1979            let vorbis_header = if let Some(extension) = &fmt.extension {
1980                match &extension.data {
1981                    ExtensionData::OggVorbis(_) => {
1982                        if [
1983                            FORMAT_TAG_OGG_VORBIS1,
1984                            FORMAT_TAG_OGG_VORBIS1P,
1985                        ].contains(&fmt.format_tag) {
1986                            Vec::new()
1987                        } else if [
1988                            FORMAT_TAG_OGG_VORBIS3,
1989                            FORMAT_TAG_OGG_VORBIS3P,
1990                        ].contains(&fmt.format_tag) {
1991                            let header = SharedCursor::new();
1992                            OggVorbisEncoderParams {
1993                                mode: OggVorbisMode::HaveNoCodebookHeader,
1994                                channels: fmt.channels,
1995                                sample_rate: fmt.sample_rate,
1996                                stream_serial: None,
1997                                bitrate: None,
1998                                minimum_page_data_size: None
1999                            }.create_vorbis_builder(header.clone()).unwrap().build()?;
2000                            header.get_vec()
2001                        } else {
2002                            return Err(AudioReadError::FormatError("For `format_tag` is `FORMAT_TAG_OGG_VORBIS2` or `FORMAT_TAG_OGG_VORBIS2P`, the `fmt ` chunk must provide the Ogg Vorbis header data.".to_string()));
2003                        }
2004                    }
2005                    ExtensionData::OggVorbisWithHeader(data) => {
2006                        if [
2007                            FORMAT_TAG_OGG_VORBIS2,
2008                            FORMAT_TAG_OGG_VORBIS2P,
2009                        ].contains(&fmt.format_tag) {
2010                            data.header.clone()
2011                        } else {
2012                            return Err(AudioReadError::FormatError("The extension data of the `fmt ` chunk provides the Ogg Vorbis header data, but the `format_tag` value indicates that there shouldn't need to be any Ogg Vorbis header data in the `fmt ` chunk.".to_string()));
2013                        }
2014                    }
2015                    o => return Err(AudioReadError::FormatError(format!("The extension data type is not for Ogg Vorbis, it is {:?}", o))),
2016                }
2017            } else {
2018                Vec::new()
2019            };
2020
2021            use std::fs::File;
2022            let debug_file = RefCell::new(File::create("test.ogg")?);
2023            let total_frames = total_samples / fmt.channels as u64;
2024
2025            let vorbis_header_len = vorbis_header.len();
2026            let cursor = CursorVecU8::new(vorbis_header);
2027            let combined_reader = CombinedReader::new(cursor, 0, vorbis_header_len as u64, SharedReader::new(reader), data_offset, data_length);
2028            let data_offset = 0;
2029            let data_length = vorbis_header_len as u64 + data_length;
2030            let on_read = move |reader: &mut OggVorbisHeaderToBodyCombinedReader, buflen: usize| -> io::Result<Vec<u8>> {
2031                let mut debug_file = debug_file.borrow_mut();
2032                let mut body_bytes_written = 0u64;
2033                if let Some(ref mut ogg_stream_writer) = ogg_stream_writer {
2034                    // There's an Ogg stream encapsulator.
2035                    // The data read from the reader is the naked Vorbis data.
2036                    // There should check if the decoder wants to parse the Vorbis header.
2037                    let current_position = reader.stream_position()?;
2038                    if current_position == 0 {
2039                        // When reading the header, ignore the size of bytes the decoder asked for.
2040                        // Just excrete all of the header packets, and the `DishonestReader` will cache the extra data for the decoder to read.
2041                        // After all of the cached data is read by the decoder, it will ask for more data, then this closure will be called again, and we just excrete data normally as it asks for the size.
2042                        let fields = u8::read_le(reader)?;
2043                        if fields != 2 {
2044                            return Err(io::Error::new(io::ErrorKind::InvalidData, format!("There should be 2 fields of data at the beginning of the header indicating the size of the Vorbis headers, but we got {fields} of fields.")));
2045                        }
2046                        let size_of_identification_header = u8::read_le(reader)?;
2047                        let size_of_comment_header = u8::read_le(reader)?;
2048                        let size_of_setup_header = vorbis_header_len - size_of_comment_header as usize - size_of_identification_header as usize - 3;
2049                        let mut identification_header = vec![0u8; size_of_identification_header as usize];
2050                        let mut comment_header = vec![0u8; size_of_comment_header as usize];
2051                        let mut setup_header = vec![0u8; size_of_setup_header as usize];
2052                        reader.read_exact(&mut identification_header)?;
2053                        reader.read_exact(&mut comment_header)?;
2054                        reader.read_exact(&mut setup_header)?;
2055                        assert_eq!(reader.stream_position()?, vorbis_header_len as u64);
2056                        // https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-132000A.2
2057                        ogg_stream_writer.reset();
2058                        ogg_stream_writer.write_all(&identification_header)?;
2059                        ogg_stream_writer.seal_packet(0, false)?;
2060                        ogg_stream_writer.write_all(&comment_header)?;
2061                        ogg_stream_writer.write_all(&setup_header)?;
2062                        ogg_stream_writer.seal_packet(0, false)?;
2063                        ogg_stream_writer.flush()?;
2064                        let data = ogg_stream_writer.get_cursor_data_and_clear();
2065                        debug_file.write_all(&data)?;
2066                        debug_file.flush()?;
2067                        Ok(data)
2068                    } else if current_position < vorbis_header_len as u64 {
2069                        panic!("Unexpected read position that's in the middle of the Vorbis header.")
2070                    } else if current_position >= vorbis_header_len as u64 && current_position < data_length {
2071
2072                        let body_length = data_length - vorbis_header_len as u64;
2073                        let buflen = body_length as usize;
2074
2075                        let mut buf = vec![0u8; buflen];
2076                        let len = reader.read(&mut buf)?;
2077
2078                        let current_position = current_position + len as u64;
2079                        let data_position = current_position - vorbis_header_len as u64;
2080
2081                        let granule_position;
2082                        let is_eos;
2083
2084                        if len < buflen || current_position == data_length {
2085                            is_eos = true;
2086                            buf.truncate(len);
2087                            granule_position = total_frames;
2088                        } else {
2089                            is_eos = false;
2090                            granule_position = data_position * body_length as u64 / total_frames;
2091                        }
2092                        let mut ogg_stream_writer_cb = ogg_stream_writer.clone();
2093                        ogg_stream_writer.set_on_seal_callback(Box::new(move |cur_packet_size| -> u64 {
2094                            body_bytes_written += cur_packet_size as u64;
2095                            let granule_position = body_bytes_written * body_length as u64 / total_frames;
2096                            let is_eos = granule_position == total_frames;
2097                            if is_eos {
2098                                ogg_stream_writer_cb.mark_cur_packet_as_end_of_stream();
2099                            }
2100                            granule_position
2101                        }));
2102                        ogg_stream_writer.write_all(&buf)?;
2103                        if is_eos && ogg_stream_writer.get_cur_packet().get_inner_data_size() > 0 {
2104                            ogg_stream_writer.seal_packet(granule_position, is_eos)?;
2105                        }
2106                        ogg_stream_writer.flush()?;
2107
2108                        let data = ogg_stream_writer.get_cursor_data_and_clear();
2109                        debug_file.write_all(&data)?;
2110                        debug_file.flush()?;
2111                        Ok(data)
2112                    } else {
2113                        Ok(Vec::new())
2114                    }
2115                } else {
2116                    // The data is the Ogg encapsulated Vorbis audio, just feed them to the decoder.
2117                    let mut buf = vec![0u8; buflen];
2118                    let len = reader.read(&mut buf)?;
2119                    buf.truncate(len);
2120                    Ok(buf)
2121                }
2122            };
2123            let on_seek = move |reader: &mut OggVorbisHeaderToBodyCombinedReader, pos: SeekFrom| -> io::Result<u64>{
2124                reader.seek(pos)
2125            };
2126            let ogg_encapsulator = DishonestReader::new(combined_reader,
2127                Box::new(on_read),
2128                Box::new(on_seek),
2129            );
2130            let reader = SharedReader::new(ogg_encapsulator);
2131            let decoder = VorbisDecoder::new(reader.clone())?;
2132            let channels = decoder.channels().get() as u16;
2133            let sample_rate = decoder.sampling_frequency().get();
2134            let downmixer = if let Some(downmixer) = downmixer {
2135                downmixer
2136            } else {
2137                use downmixer::{speaker_positions::*, DownmixerParams};
2138                let channel_mask = match channels {
2139                    1 => MONO_LAYOUT,
2140                    2 => STEREO_LAYOUT,
2141                    3 => SURROUND_LAYOUT,
2142                    4 => STEREO_LAYOUT | BACK_LR_BITS,
2143                    5 => SURROUND_LAYOUT | BACK_LR_BITS,
2144                    6 => DOLBY_5_1_FRONT_SIDE_LAYOUT,
2145                    7 => DOLBY_6_1_LAYOUT,
2146                    8 => DOLBY_7_1_LAYOUT,
2147                    o => return Err(AudioReadError::InvalidArguments(format!("Bad channel number: {o}"))),
2148                };
2149                Downmixer::new(channel_mask, DownmixerParams::new())
2150            };
2151            let mut ret = Self {
2152                reader,
2153                decoder,
2154                data_offset,
2155                data_length,
2156                total_frames,
2157                channels,
2158                sample_rate,
2159                decoded_samples: None,
2160                cur_frame_index: 0,
2161                cur_block_frame_index: 0,
2162                downmixer,
2163            };
2164            assert_eq!(fmt.channels, ret.channels);
2165            assert_eq!(fmt.sample_rate, ret.sample_rate);
2166            ret.decode()?;
2167            Ok(ret)
2168        }
2169
2170        fn cur_block_frames(&self) -> usize {
2171            match self.decoded_samples {
2172                None => 0,
2173                Some(ref samples) => samples[0].len(),
2174            }
2175        }
2176
2177        fn decode(&mut self) -> Result<(), AudioReadError> {
2178            self.cur_block_frame_index += self.cur_block_frames() as u64;
2179            self.cur_frame_index = self.cur_block_frame_index;
2180            self.decoded_samples = self.decoder.decode_audio_block()?.map(|samples| {
2181                samples
2182                    .samples()
2183                    .iter()
2184                    .map(|frame| frame.to_vec())
2185                    .collect()
2186            });
2187            Ok(())
2188        }
2189
2190        /// Get how many channels in the OggVorbis audio data
2191        pub fn get_channels(&self) -> u16 {
2192            self.channels
2193        }
2194
2195        /// Get the current decoding audio frame index. The audio frame is an array for all channels' one sample.
2196        pub fn get_cur_frame_index(&self) -> u64 {
2197            self.cur_frame_index
2198        }
2199
2200        /// Seek to the block that contains the specific frame index of the audio frame.
2201        pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
2202            let frame_index = match seek_from {
2203                SeekFrom::Start(fi) => fi,
2204                SeekFrom::Current(ci) => (self.cur_frame_index as i64 + ci) as u64,
2205                SeekFrom::End(ei) => (self.cur_frame_index as i64 + ei) as u64,
2206            };
2207            if frame_index < self.cur_block_frame_index {
2208                self.reader.seek(SeekFrom::Start(self.data_offset))?;
2209                self.cur_block_frame_index = 0;
2210            }
2211            self.cur_frame_index = frame_index;
2212            while self.cur_block_frame_index + (self.cur_block_frames() as u64) < self.cur_frame_index {
2213                self.decode()?;
2214                if self.decoded_samples.is_none() {
2215                    return Ok(());
2216                }
2217            }
2218            Ok(())
2219        }
2220
2221        /// Decode as audio frames. The audio frame is an array for all channels' one sample.
2222        pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
2223        where
2224            S: SampleType,
2225        {
2226            match self.decoded_samples {
2227                None => Ok(None),
2228                Some(ref samples) => {
2229                    let cache_frame_index = (self.cur_frame_index - self.cur_block_frame_index) as usize;
2230                    if cache_frame_index < samples[0].len() {
2231                        let ret: Vec<S> = (0..self.channels)
2232                            .map(|channel| {
2233                                S::scale_from(samples[channel as usize][cache_frame_index])
2234                            })
2235                            .collect();
2236                        self.cur_frame_index += 1;
2237                        Ok(Some(ret))
2238                    } else {
2239                        self.decode()?;
2240                        self.decode_frame()
2241                    }
2242                }
2243            }
2244        }
2245
2246        /// Decode as stereo audio
2247        pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
2248        where
2249            S: SampleType,
2250        {
2251            match self.decode_frame()? {
2252                None => Ok(None),
2253                Some(frame) => Ok(Some(self.downmixer.downmix_frame_to_stereo(&frame))),
2254            }
2255        }
2256
2257        /// Decode as mono audio. All channel samples will be mixed into one.
2258        pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
2259        where
2260            S: SampleType,
2261        {
2262            match self.decode_frame()? {
2263                None => Ok(None),
2264                Some(frame) => Ok(Some(self.downmixer.downmix_frame_to_mono(&frame))),
2265            }
2266        }
2267    }
2268
2269    impl Debug for OggVorbisDecoderWrap {
2270        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
2271            f.debug_struct("OggVorbisDecoderWrap")
2272                .field("reader", &self.reader)
2273                .field("decoder", &format_args!("VorbisDecoder<Reader>"))
2274                .field("data_offset", &self.data_offset)
2275                .field("data_length", &self.data_length)
2276                .field("total_frames", &self.total_frames)
2277                .field("channels", &self.channels)
2278                .field("sample_rate", &self.sample_rate)
2279                .field(
2280                    "decoded_samples",
2281                    &match self.decoded_samples {
2282                        None => "None".to_string(),
2283                        Some(_) => format!("Some([f32; {}])", self.cur_block_frames()),
2284                    },
2285                )
2286                .field("cur_frame_index", &self.cur_frame_index)
2287                .field("cur_block_frame_index", &self.cur_block_frame_index)
2288                .finish()
2289        }
2290    }
2291
2292    /// * An ogg packet as a stream container
2293    #[derive(Debug)]
2294    pub struct OggStreamWriteToCursor {
2295        pub ogg_stream_writer: OggStreamWriter<SharedCursor>,
2296        pub cursor: SharedCursor,
2297    }
2298
2299    impl OggStreamWriteToCursor {
2300        pub fn new(stream_id: u32) -> Self {
2301            let cursor = SharedCursor::new();
2302            Self {
2303                ogg_stream_writer: OggStreamWriter::new(cursor.clone(), stream_id),
2304                cursor,
2305            }
2306        }
2307
2308        pub fn set_granule_position(&mut self, position: u64) {
2309            self.ogg_stream_writer.set_granule_position(position)
2310        }
2311
2312        pub fn get_granule_position(&self) -> u64 {
2313            self.ogg_stream_writer.get_granule_position()
2314        }
2315
2316        pub fn get_cursor_data_len(&self) -> usize {
2317            self.cursor.len()
2318        }
2319
2320        pub fn get_cursor_data(&self) -> Vec<u8> {
2321            self.cursor.get_vec()
2322        }
2323
2324        pub fn get_cursor_data_and_clear(&mut self) -> Vec<u8> {
2325            let data = self.get_cursor_data();
2326            self.cursor.clear();
2327            data
2328        }
2329
2330        pub fn get_cur_packet(&self) -> &OggPacket {
2331            &self.ogg_stream_writer.cur_packet
2332        }
2333
2334        pub fn set_on_seal_callback(&mut self, on_seal: Box<dyn FnMut(usize) -> u64>) {
2335            self.ogg_stream_writer.set_on_seal_callback(on_seal)
2336        }
2337
2338        pub fn reset(&mut self) {
2339            self.ogg_stream_writer.reset();
2340            self.cursor.clear();
2341        }
2342
2343        pub fn mark_cur_packet_as_end_of_stream(&mut self) {
2344            self.ogg_stream_writer.mark_cur_packet_as_end_of_stream();
2345        }
2346
2347        pub fn seal_packet(&mut self, granule_position: u64, is_end_of_stream: bool) -> io::Result<()> {
2348            self.ogg_stream_writer.seal_packet(granule_position, is_end_of_stream)
2349        }
2350    }
2351
2352    impl Read for OggStreamWriteToCursor {
2353        fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
2354            let data = self.cursor.get_vec();
2355            let len = std::cmp::min(buf.len(), data.len());
2356            if len > 0 {
2357                buf[..len].copy_from_slice(&data[..len]);
2358                let data = data[len..].to_vec();
2359                self.cursor.set_vec(&data, data.len() as u64);
2360            }
2361            Ok(len)
2362        }
2363    }
2364
2365    impl Write for OggStreamWriteToCursor {
2366        fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
2367            self.cursor.seek(SeekFrom::End(0))?;
2368            self.ogg_stream_writer.write(buf)
2369        }
2370        fn flush(&mut self) -> io::Result<()> {
2371            self.cursor.seek(SeekFrom::End(0))?;
2372            self.ogg_stream_writer.flush()
2373        }
2374    }
2375
2376    impl From<vorbis_rs::VorbisError> for AudioReadError {
2377        fn from(err: vorbis_rs::VorbisError) -> Self {
2378            use vorbis_rs::VorbisError::*;
2379            match err {
2380                LibraryError(liberr) => {
2381                    let lib = liberr.library();
2382                    let func = liberr.function();
2383                    let kind = liberr.kind();
2384                    let message =
2385                        format!("OggVorbis library error: lib: {lib}, function: {func}, kind: {kind}");
2386                    use vorbis_rs::VorbisLibraryErrorKind::*;
2387                    match kind {
2388                        False | InternalFault => Self::OtherReason(message),
2389                        NotVorbis | BadHeader | BadPacket | BadLink => Self::InvalidData(message),
2390                        BadVorbisVersion | NotAudio => Self::FormatError(message),
2391                        Hole => Self::IOError(IOErrorInfo::new(ErrorKind::Interrupted, message)),
2392                        Eof => Self::IOError(IOErrorInfo::new(ErrorKind::UnexpectedEof, message)),
2393                        Io => Self::IOError(IOErrorInfo::new(ErrorKind::Other, message)),
2394                        NotImplemented => Self::Unimplemented(message),
2395                        InvalidValue => Self::InvalidArguments(message),
2396                        NotSeekable => Self::IOError(IOErrorInfo::new(ErrorKind::NotSeekable, message)),
2397                        Other { result_code: code } => Self::OtherReason(format!(
2398                            "OggVorbis library error: lib: {lib}, function: {func}, kind: {kind} code: {code}"
2399                        )),
2400                        o => Self::OtherReason(format!(
2401                            "OggVorbis library error: lib: {lib}, function: {func}, kind: {kind}, error: {o}"
2402                        )),
2403                    }
2404                }
2405                InvalidAudioBlockChannelCount { expected, actual } => Self::InvalidArguments(format!(
2406                    "Channel error: expected: {expected}, actual: {actual}"
2407                )),
2408                InvalidAudioBlockSampleCount { expected, actual } => Self::InvalidArguments(format!(
2409                    "Invalid audio block sample count: expected: {expected}, actual: {actual}"
2410                )),
2411                UnsupportedStreamChaining => {
2412                    Self::InvalidArguments("Unsupported stream chaining".to_string())
2413                }
2414                InvalidCommentString(err_char) => {
2415                    Self::InvalidArguments(format!("Invalid comment string char {err_char}"))
2416                }
2417                RangeExceeded(try_error) => {
2418                    Self::InvalidArguments(format!("Invalid parameters range exceeded: {try_error}"))
2419                }
2420                Io(ioerr) => Self::IOError(IOErrorInfo::new(ioerr.kind(), format!("{:?}", ioerr))),
2421                Rng(rngerr) => Self::OtherReason(format!("Random number generator error: {rngerr}")),
2422                ConsumedEncoderBuilderSink => {
2423                    Self::InvalidArguments("The `writer` was already consumed".to_string())
2424                }
2425                o => Self::OtherReason(format!("Unknown error: {o}")),
2426            }
2427        }
2428    }
2429}