1#![allow(dead_code)]
2#![allow(non_snake_case)]
3
4use std::{fmt::Debug, cmp::min, io::SeekFrom};
5
6use crate::Reader;
7use crate::{SampleType, i24, u24};
8use crate::{AudioError, AudioReadError};
9use crate::adpcm;
10use crate::wavcore::{Spec, WaveSampleType, FmtChunk};
11use crate::xlaw::{XLaw, PcmXLawDecoder};
12
13#[cfg(feature = "mp3dec")]
14use mp3::Mp3Decoder;
15
16#[cfg(feature = "opus")]
17use opus::OpusDecoder;
18
19#[cfg(feature = "flac")]
20use flac::FlacDecoderWrap;
21
22pub trait Decoder<S>: Debug
24 where S: SampleType {
25
26 fn get_channels(&self) -> u16;
28 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError>;
29 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError>;
30 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError>;
31
32 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> {
34 match self.get_channels() {
35 1 => Ok(self.decode_frame()?.map(|samples| samples[0])),
36 2 => Ok(self.decode_frame()?.map(|samples| S::average(samples[0], samples[1]))),
37 o => Err(AudioReadError::Unsupported(format!("Unsupported to merge {o} channels to 1 channels."))),
38 }
39 }
40
41 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> {
43 match self.get_channels() {
44 1 => Ok(self.decode_frame()?.map(|samples| (samples[0], samples[0]))),
45 2 => Ok(self.decode_frame()?.map(|samples| (samples[0], samples[1]))),
46 o => Err(AudioReadError::Unsupported(format!("Unsupported to merge {o} channels to 2 channels."))),
47 }
48 }
49
50 fn decode_frames(&mut self, num_frames: usize) -> Result<Vec<Vec<S>>, AudioReadError> {
52 let mut frames = Vec::<Option<Vec<S>>>::with_capacity(num_frames);
53 for _ in 0..num_frames {
54 frames.push(self.decode_frame()?);
55 }
56 Ok(frames.into_iter().flatten().collect())
57 }
58
59 fn decode_monos(&mut self, num_monos: usize) -> Result<Vec<S>, AudioReadError> {
61 let mut monos = Vec::<Option<S>>::with_capacity(num_monos);
62 for _ in 0..num_monos {
63 monos.push(self.decode_mono()?);
64 }
65 Ok(monos.into_iter().flatten().collect())
66 }
67
68 fn decode_stereos(&mut self, num_stereos: usize) -> Result<Vec<(S, S)>, AudioReadError> {
70 let mut stereos = Vec::<Option<(S, S)>>::with_capacity(num_stereos);
71 for _ in 0..num_stereos {
72 stereos.push(self.decode_stereo()?);
73 }
74 Ok(stereos.into_iter().flatten().collect())
75 }
76}
77
78impl<S> Decoder<S> for PcmDecoder<S>
79 where S: SampleType {
80 fn get_channels(&self) -> u16 { self.spec.channels }
81 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { PcmDecoder::<S>::get_cur_frame_index(self) }
82 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
83 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame() }
84 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo() }
85 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono() }
86}
87
88impl<S, D> Decoder<S> for AdpcmDecoderWrap<D>
89 where S: SampleType,
90 D: adpcm::AdpcmDecoder {
91 fn get_channels(&self) -> u16 { self.channels }
92 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(AdpcmDecoderWrap::<D>::get_cur_frame_index(self)) }
93 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
94 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
95 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
96 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
97}
98
99impl<S> Decoder<S> for PcmXLawDecoderWrap
100 where S: SampleType {
101 fn get_channels(&self) -> u16 { self.channels }
102 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(PcmXLawDecoderWrap::get_cur_frame_index(self)) }
103 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
104 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
105 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
106 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
107}
108
109#[cfg(feature = "mp3dec")]
110impl<S> Decoder<S> for Mp3Decoder
111 where S: SampleType {
112 fn get_channels(&self) -> u16 { Mp3Decoder::get_channels(self) }
113 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(Mp3Decoder::get_cur_frame_index(self)) }
114 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { Mp3Decoder::seek(self, seek_from) }
115 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
116 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
117 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
118}
119
120#[cfg(feature = "opus")]
121impl<S> Decoder<S> for OpusDecoder
122 where S: SampleType {
123 fn get_channels(&self) -> u16 { OpusDecoder::get_channels(self) }
124 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(OpusDecoder::get_cur_frame_index(self)) }
125 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
126 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
127 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
128 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
129}
130
131#[cfg(feature = "flac")]
132impl<'a, S> Decoder<S> for FlacDecoderWrap<'a>
133 where S: SampleType {
134 fn get_channels(&self) -> u16 { FlacDecoderWrap::get_channels(self) }
135 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> { Ok(FlacDecoderWrap::get_cur_frame_index(self)) }
136 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> { self.seek(seek_from) }
137 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> { self.decode_frame::<S>() }
138 fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> { self.decode_stereo::<S>() }
139 fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> { self.decode_mono::<S>() }
140}
141
142fn get_rounded_up_fft_size(sample_rate: u32) -> usize {
143 let mut ret = 1usize;
144 while ret < (sample_rate as usize) {ret <<= 1;}
145 ret
146}
147
148#[derive(Debug)]
149pub struct PcmDecoder<S>
150where S: SampleType {
151 reader: Box<dyn Reader>,
152 data_offset: u64,
153 data_length: u64,
154 block_align: u16,
155 total_frames: u64,
156 spec: Spec,
157 sample_decoder: fn(&mut dyn Reader) -> Result<S, AudioReadError>,
158}
159
160impl<S> PcmDecoder<S>
161where S: SampleType {
162 pub fn new(reader: Box<dyn Reader>, data_offset: u64, data_length: u64, spec: &Spec, fmt: &FmtChunk) -> Result<Self, AudioError> {
163 match fmt.format_tag {
164 1 | 0xFFFE | 3 => (),
165 o => return Err(AudioError::InvalidArguments(format!("`PcmDecoder` can't handle format_tag 0x{:x}", o))),
166 }
167 let wave_sample_type = spec.get_sample_type();
168 Ok(Self {
169 reader,
170 data_offset,
171 data_length,
172 block_align: fmt.block_align,
173 total_frames: data_length / fmt.block_align as u64,
174 spec: *spec,
175 sample_decoder: Self::choose_sample_decoder(wave_sample_type)?,
176 })
177 }
178
179 fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
180 Ok(self.reader.stream_position()? >= self.data_offset + self.data_length)
181 }
182
183 pub fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError> {
184 Ok((self.reader.stream_position()? - self.data_offset) / (self.block_align as u64))
185 }
186
187 pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
188 let frame_index = match seek_from{
189 SeekFrom::Start(fi) => fi,
190 SeekFrom::Current(cur) => {
191 (self.get_cur_frame_index()? as i64 + cur) as u64
192 },
193 SeekFrom::End(end) => {
194 (self.total_frames as i64 + end) as u64
195 }
196 };
197 if frame_index > self.total_frames {
198 self.reader.seek(SeekFrom::Start(self.data_offset + self.data_length))?;
199 Ok(())
200 } else {
201 self.reader.seek(SeekFrom::Start(self.data_offset + frame_index * self.block_align as u64))?;
202 Ok(())
203 }
204 }
205
206 fn decode_sample<T>(&mut self) -> Result<Option<S>, AudioReadError>
207 where T: SampleType {
208 if self.is_end_of_data()? {
209 Ok(None)
210 } else {
211 Ok(Some(S::from(T::read_le(&mut self.reader)?)))
212 }
213 }
214
215 fn decode_sample_to<T>(r: &mut dyn Reader) -> Result<S, AudioReadError>
216 where T: SampleType {
217 Ok(S::from(T::read_le(r)?))
218 }
219
220 fn decode_samples_to<T>(r: &mut dyn Reader, num_samples_to_read: usize) -> Result<Vec<S>, AudioReadError>
221 where T: SampleType {
222 let mut ret = Vec::<S>::with_capacity(num_samples_to_read);
223 for _ in 0..num_samples_to_read {
224 ret.push(Self::decode_sample_to::<T>(r)?);
225 }
226 Ok(ret)
227 }
228
229 #[allow(clippy::type_complexity)]
235 fn choose_sample_decoder(wave_sample_type: WaveSampleType) -> Result<fn(&mut dyn Reader) -> Result<S, AudioReadError>, AudioError> {
236 use WaveSampleType::{Unknown, S8, S16, S24, S32, S64, U8, U16, U24, U32, U64, F32, F64};
237 match wave_sample_type {
238 S8 => Ok(Self::decode_sample_to::<i8 >),
239 S16 => Ok(Self::decode_sample_to::<i16>),
240 S24 => Ok(Self::decode_sample_to::<i24>),
241 S32 => Ok(Self::decode_sample_to::<i32>),
242 S64 => Ok(Self::decode_sample_to::<i64>),
243 U8 => Ok(Self::decode_sample_to::<u8 >),
244 U16 => Ok(Self::decode_sample_to::<u16>),
245 U24 => Ok(Self::decode_sample_to::<u24>),
246 U32 => Ok(Self::decode_sample_to::<u32>),
247 U64 => Ok(Self::decode_sample_to::<u64>),
248 F32 => Ok(Self::decode_sample_to::<f32>),
249 F64 => Ok(Self::decode_sample_to::<f64>),
250 Unknown => Err(AudioError::InvalidArguments(format!("unknown sample type \"{:?}\"", wave_sample_type))),
251 }
252 }
253
254 pub fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError> {
255 if self.is_end_of_data()? {
256 Ok(None)
257 } else {
258 let mut frame = Vec::<S>::with_capacity(self.spec.channels as usize);
259 for _ in 0..self.spec.channels {
260 frame.push((self.sample_decoder)(&mut self.reader)?);
261 }
262 Ok(Some(frame))
263 }
264 }
265
266 pub fn decode_stereo(&mut self) -> Result<Option<(S, S)>, AudioReadError> {
267 if self.is_end_of_data()? {
268 Ok(None)
269 } else {
270 match self.spec.channels {
271 1 => {
272 let sample = (self.sample_decoder)(&mut self.reader)?;
273 Ok(Some((sample, sample)))
274 },
275 2 => {
276 let sample_l = (self.sample_decoder)(&mut self.reader)?;
277 let sample_r = (self.sample_decoder)(&mut self.reader)?;
278 Ok(Some((sample_l, sample_r)))
279 },
280 o => Err(AudioReadError::Unsupported(format!("Unsupported to merge {o} channels to 2 channels."))),
281 }
282 }
283 }
284
285 pub fn decode_mono(&mut self) -> Result<Option<S>, AudioReadError> {
286 if self.is_end_of_data()? {
287 Ok(None)
288 } else {
289 match self.get_channels() {
290 1 => {
291 Ok(Some((self.sample_decoder)(&mut self.reader)?))
292 },
293 2 => {
294 let sample_l = (self.sample_decoder)(&mut self.reader)?;
295 let sample_r = (self.sample_decoder)(&mut self.reader)?;
296 Ok(Some(sample_l / S::from(2) + sample_r / S::from(2)))
297 },
298 o => Err(AudioReadError::Unsupported(format!("Unsupported to merge {o} channels to 1 channels."))),
299 }
300 }
301 }
302}
303
304#[derive(Debug)]
305pub struct AdpcmDecoderWrap<D>
306where D: adpcm::AdpcmDecoder {
307 channels: u16,
308 reader: Box<dyn Reader>,
309 data_offset: u64,
310 data_length: u64,
311 block_align: u16,
312 frame_index: u64,
313 frames_decoded: u64,
314 total_frames: u64,
315 decoder: D,
316 samples: Vec<i16>,
317 first_frame_of_samples: u64,
318}
319
320impl<D> AdpcmDecoderWrap<D>
321where D: adpcm::AdpcmDecoder {
322 pub fn new(reader: Box<dyn Reader>, data_offset: u64, data_length: u64, fmt: &FmtChunk, total_samples: u64) -> Result<Self, AudioReadError> {
323 let decoder = D::new(fmt)?;
324 let total_frames = if total_samples == 0 {
325 let frames_per_block = decoder.frames_per_block() as u64;
326 let total_blocks = data_length / fmt.block_align as u64;
327 total_blocks * frames_per_block
328 } else {
329 total_samples / fmt.channels as u64
330 };
331 Ok(Self {
332 channels: fmt.channels,
333 reader,
334 data_offset,
335 data_length,
336 block_align: fmt.block_align,
337 frame_index: 0,
338 frames_decoded: 0,
339 total_frames,
340 decoder,
341 samples: Vec::<i16>::new(),
342 first_frame_of_samples: 0,
343 })
344 }
345
346 fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
347 let end_of_data = self.data_offset + self.data_length;
348 if self.reader.stream_position()? >= end_of_data { Ok(true) } else { Ok(false) }
349 }
350
351 pub fn get_cur_frame_index(&self) -> u64 {
352 self.frame_index
353 }
354
355 pub fn feed_until_output(&mut self, wanted_length: usize) -> Result<(), AudioReadError>{
356 let end_of_data = self.data_offset + self.data_length;
357 let mut sample_decoded = 0u64;
358 while self.samples.len() < wanted_length {
359 let cur_pos = self.reader.stream_position()?;
360 if cur_pos < end_of_data {
361 let remains = end_of_data - cur_pos;
362 let to_read = min(remains, self.block_align as u64);
363 let mut buf = vec![0u8; to_read as usize];
364 self.reader.read_exact(&mut buf)?;
365 let mut iter = buf.into_iter();
366 self.decoder.decode(|| -> Option<u8> {iter.next()},|sample: i16| {sample_decoded += 1; self.samples.push(sample)})?;
367 } else {
368 self.decoder.flush(|sample: i16| {sample_decoded += 1; self.samples.push(sample)})?;
369 break;
370 }
371 }
372 self.frames_decoded += sample_decoded / self.channels as u64;
373 Ok(())
374 }
375
376 pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
377 let frames_per_block = self.decoder.frames_per_block() as u64;
378 let frame_index = match seek_from{
379 SeekFrom::Start(fi) => fi,
380 SeekFrom::Current(cur) => {
381 (self.frame_index as i64 + cur) as u64
382 },
383 SeekFrom::End(end) => {
384 (self.total_frames as i64 + end) as u64
385 }
386 };
387 let block_index = frame_index / frames_per_block;
388 self.samples.clear();
389 self.decoder.reset_states();
390 if frame_index >= self.total_frames {
391 let end_of_data = self.data_offset + self.data_length;
392 self.reader.seek(SeekFrom::Start(end_of_data))?;
393 self.first_frame_of_samples = self.total_frames;
394 self.frames_decoded = self.total_frames;
395 self.frame_index = frame_index;
396 Ok(())
397 } else {
398 let block_pos = self.data_offset + block_index * self.block_align as u64;
399 self.reader.seek(SeekFrom::Start(block_pos))?;
400 self.first_frame_of_samples = block_index * frames_per_block;
401 self.frames_decoded = self.first_frame_of_samples;
402 self.frame_index = frame_index;
403 Ok(())
404 }
405 }
406
407 pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
408 where S: SampleType {
409 match self.channels {
410 1 => {
411 if self.samples.is_empty() {
413 self.feed_until_output(1)?;
414 }
415
416 if self.samples.is_empty() {
418 Ok(None)
419 } else {
420 if self.frame_index < self.first_frame_of_samples {
422 panic!("Unknown error occured when decoding the ADPCM data: the sample cache was updated while the previous cache is needed: FI = {}, FF = {}", self.frame_index, self.first_frame_of_samples);
423 } else if self.frame_index < self.frames_decoded {
424 let ret = self.samples[(self.frame_index - self.first_frame_of_samples) as usize];
425 self.frame_index += 1;
426 Ok(Some(S::from(ret)))
427 } else {
428 self.first_frame_of_samples += self.samples.len() as u64;
430 self.samples.clear();
431 self.decode_mono::<S>()
432 }
433 }
434 },
435 2 => {
436 let ret = self.decode_stereo::<S>()?;
437 match ret {
438 None => Ok(None),
439 Some((l, r)) => {
440 Ok(Some(S::average(l, r)))
441 }
442 }
443 },
444 o => Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
445 }
446 }
447
448 pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
449 where S: SampleType {
450 match self.channels {
451 1 => {
452 let ret = self.decode_mono::<S>()?;
453 match ret {
454 None => Ok(None),
455 Some(ret) => Ok(Some((ret, ret)))
456 }
457 },
458 2 => {
459 if self.samples.is_empty() {
461 self.feed_until_output(2)?;
462 }
463
464 if self.samples.is_empty() {
466 Ok(None)
467 } else {
468 if self.frame_index < self.first_frame_of_samples {
470 panic!("Unknown error occured when decoding the ADPCM data: the sample cache was updated while the previous cache is needed: FI = {}, FF = {}", self.frame_index, self.first_frame_of_samples);
471 } else if self.frame_index < self.frames_decoded {
472 let index = ((self.frame_index - self.first_frame_of_samples) * 2) as usize;
473 self.frame_index += 1;
474 let l = self.samples[index];
475 let r = self.samples[index + 1];
476 Ok(Some((S::from(l), S::from(r))))
477 } else {
478 self.first_frame_of_samples += (self.samples.len() / 2) as u64;
480 self.samples.clear();
481 self.decode_stereo::<S>()
482 }
483 }
484 },
485 o => Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
486 }
487 }
488
489 pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
490 where S: SampleType {
491 match self.channels {
492 1 => {
493 match self.decode_mono::<S>()? {
494 Some(sample) => Ok(Some(vec![sample])),
495 None => Ok(None),
496 }
497 },
498 2 => {
499 match self.decode_stereo::<S>()? {
500 Some((l, r)) => Ok(Some(vec![l, r])),
501 None => Ok(None),
502 }
503 },
504 o => Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
505 }
506 }
507}
508
509#[derive(Debug)]
510pub struct PcmXLawDecoderWrap {
511 reader: Box<dyn Reader>,
512 channels: u16,
513 data_offset: u64,
514 data_length: u64,
515 total_frames: u64,
516 frame_index: u64,
517 dec: PcmXLawDecoder,
518}
519
520impl PcmXLawDecoderWrap {
521 pub fn new(reader: Box<dyn Reader>, which_law: XLaw, data_offset: u64, data_length: u64, fmt: &FmtChunk, total_samples: u64) -> Result<Self, AudioReadError> {
522 match fmt.channels {
523 1 => (),
524 2 => (),
525 o => return Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
526 }
527 Ok(Self {
528 reader,
529 channels: fmt.channels,
530 data_offset,
531 data_length,
532 total_frames: total_samples / fmt.channels as u64,
533 frame_index: 0,
534 dec: PcmXLawDecoder::new(which_law),
535 })
536 }
537
538 fn decode(&mut self) -> Result<i16, AudioReadError> {
539 Ok(self.dec.decode(u8::read_le(&mut self.reader)?))
540 }
541
542 pub fn get_cur_frame_index(&self) -> u64 {
543 self.frame_index
544 }
545
546 pub fn seek(&mut self, from: SeekFrom) -> Result<(), AudioReadError> {
547 let mut frame_index = match from {
548 SeekFrom::Start(fi) => fi,
549 SeekFrom::Current(cur) => (self.frame_index as i64 + cur) as u64,
550 SeekFrom::End(end) => (self.frame_index as i64 + end) as u64,
551 };
552 if frame_index > self.total_frames {
553 frame_index = self.total_frames;
554 }
555 self.frame_index = frame_index;
556 self.reader.seek(SeekFrom::Start(self.data_offset + self.frame_index * self.channels as u64))?;
557 Ok(())
558 }
559
560 fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
561 let end_of_data = self.data_offset + self.data_length;
562 if self.reader.stream_position()? >= end_of_data { Ok(true) } else { Ok(false) }
563 }
564
565 pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
566 where S: SampleType {
567 if self.is_end_of_data()? {
568 Ok(None)
569 } else {
570 match self.channels {
571 1 => {
572 let s = S::from(self.decode()?);
573 self.frame_index += 1;
574 Ok(Some(s))
575 },
576 2 => {
577 let l = S::from(self.decode()?);
578 let r = S::from(self.decode()?);
579 self.frame_index += 1;
580 Ok(Some(S::average(l, r)))
581 },
582 o => Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
583 }
584 }
585 }
586
587 pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
588 where S: SampleType {
589 if self.is_end_of_data()? {
590 Ok(None)
591 } else {
592 match self.channels {
593 1 => {
594 let s = S::from(self.decode()?);
595 self.frame_index += 1;
596 Ok(Some((s, s)))
597 },
598 2 => {
599 let l = S::from(self.decode()?);
600 let r = S::from(self.decode()?);
601 self.frame_index += 1;
602 Ok(Some((l, r)))
603 },
604 o => Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
605 }
606 }
607 }
608
609 pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
610 where S: SampleType {
611 match self.channels {
612 1 => {
613 match self.decode_mono::<S>()? {
614 Some(sample) => Ok(Some(vec![sample])),
615 None => Ok(None),
616 }
617 },
618 2 => {
619 match self.decode_stereo::<S>()? {
620 Some((l, r)) => Ok(Some(vec![l, r])),
621 None => Ok(None),
622 }
623 },
624 o => Err(AudioReadError::Unsupported(format!("Unsupported channels {o}"))),
625 }
626 }
627}
628
629#[cfg(feature = "mp3dec")]
630pub mod mp3 {
631 use std::{io::{Read, SeekFrom}, fmt::{self, Debug, Formatter}, mem};
632
633 use super::get_rounded_up_fft_size;
634 use crate::AudioReadError;
635 use crate::Reader;
636 use crate::SampleType;
637 use crate::Resampler;
638 use crate::wavcore::FmtChunk;
639 use crate::utils;
640
641 use rmp3::{DecoderOwned, Frame};
642
643 pub struct Mp3Decoder {
644 target_sample_rate: u32,
645 target_channels: u16,
646 the_decoder: DecoderOwned<Vec<u8>>,
647 cur_frame: Option<Mp3AudioData>,
648 sample_pos: u64,
649 total_frames: u64,
650 resampler: Resampler,
651 }
652
653 impl Debug for Mp3Decoder{
654 fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
655 fmt.debug_struct("Mp3Decoder")
656 .field("target_sample_rate", &self.target_sample_rate)
657 .field("target_channels", &self.target_channels)
658 .field("the_decoder", &format_args!("DecoderOwned<Vec<u8>>"))
659 .field("cur_frame", &self.cur_frame)
660 .field("sample_pos", &self.sample_pos)
661 .field("total_frames", &self.total_frames)
662 .field("resampler", &self.resampler)
663 .finish()
664 }
665 }
666
667 #[derive(Clone)]
668 pub struct Mp3AudioData {
669 pub bitrate: u32,
670 pub channels: u16,
671 pub mpeg_layer: u8,
672 pub sample_rate: u32,
673 pub sample_count: usize,
674 pub samples: Vec<i16>,
675 pub buffer_index: usize,
676 }
677
678 impl Debug for Mp3AudioData{
679 fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
680 fmt.debug_struct("Mp3AudioData")
681 .field("bitrate", &self.bitrate)
682 .field("channels", &self.channels)
683 .field("mpeg_layer", &self.mpeg_layer)
684 .field("sample_rate", &self.sample_rate)
685 .field("sample_count", &self.sample_count)
686 .field("samples", &format_args!("[i16; {}]", self.samples.len()))
687 .field("buffer_index", &self.buffer_index)
688 .finish()
689 }
690 }
691
692 impl Mp3Decoder {
693 pub fn new(reader: Box<dyn Reader>, data_offset: u64, data_length: u64, fmt: &FmtChunk, total_samples: u64) -> Result<Self, AudioReadError> {
694 let mut reader = reader;
695 let mut mp3_raw_data = vec![0u8; data_length as usize];
696 reader.seek(SeekFrom::Start(data_offset))?;
697 reader.read_exact(&mut mp3_raw_data)?;
698 let the_decoder = rmp3::DecoderOwned::new(mp3_raw_data);
699 let mut ret = Self {
700 target_sample_rate: fmt.sample_rate,
701 target_channels: fmt.channels,
702 the_decoder,
703 cur_frame: None,
704 sample_pos: 0,
705 total_frames: total_samples,
706 resampler: Resampler::new(get_rounded_up_fft_size(fmt.sample_rate)),
707 };
708 ret.cur_frame = ret.get_next_frame();
709 if let Some(ref mp3frame) = ret.cur_frame {
710 ret.total_frames /= mp3frame.channels as u64;
711 }
712 Ok(ret)
713 }
714
715 fn reset(&mut self) {
716 self.the_decoder.set_position(0);
717 self.cur_frame = self.get_next_frame();
718 self.sample_pos = 0;
719 }
720
721 fn do_resample(&self, samples: &[i16], channels: u16, src_sample_rate: u32) -> Vec<i16> {
722 let process_size = self.resampler.get_process_size(self.resampler.get_fft_size(), src_sample_rate, self.target_sample_rate);
723 let mut monos = utils::interleaved_samples_to_monos(samples, channels).unwrap();
724 for mono in monos.iter_mut() {
725 let mut iter = mem::take(mono).into_iter();
726 loop {
727 let block: Vec<i16> = iter.by_ref().take(process_size).collect();
728 if block.is_empty() {
729 break;
730 }
731 mono.extend(&utils::do_resample_mono(&self.resampler, &block, src_sample_rate, self.target_sample_rate));
732 }
733 }
734 utils::monos_to_interleaved_samples(&monos).unwrap()
735 }
736
737 fn get_next_frame(&mut self) -> Option<Mp3AudioData> {
738 while let Some(frame) = self.the_decoder.next() {
739 if let Frame::Audio(audio) = frame {
740 if let Some(cur_frame) = &self.cur_frame {
741 self.sample_pos += cur_frame.sample_count as u64;
742 }
743
744 let mut ret = Mp3AudioData{
745 bitrate: audio.bitrate(),
746 channels: audio.channels(),
747 mpeg_layer: audio.mpeg_layer(),
748 sample_rate: audio.sample_rate(),
749 sample_count: audio.sample_count(),
750 samples: audio.samples().to_vec(),
751 buffer_index: 0,
752 };
753
754 match (ret.channels, self.target_channels) {
756 (1, t) => {
757 ret.samples = mem::take(&mut ret.samples).into_iter().flat_map(|s| -> Vec<i16> {vec![s; t as usize]}).collect();
758 ret.channels = self.target_channels;
759 },
760 (t, 1) => {
761 let mut iter = mem::take(&mut ret.samples).into_iter();
762 loop {
763 let frame: Vec<i32> = iter.by_ref().take(t as usize).map(|s|{s as i32}).collect();
764 if frame.is_empty() {
765 break;
766 }
767 ret.samples.push((frame.iter().sum::<i32>() / frame.len() as i32) as i16);
768 }
769 ret.channels = self.target_channels;
770 },
771 (s, t) => {
772 if s != t {
773 eprintln!("Can't change {s} channels to {t} channels.");
774 }
775 },
776 }
777
778 ret.samples = self.do_resample(&ret.samples, ret.channels, ret.sample_rate);
780 ret.sample_rate = self.target_sample_rate;
781 ret.sample_count = ret.samples.len() / ret.channels as usize;
782
783 return Some(ret);
784 }
785 }
786 None
787 }
788
789 pub fn get_cur_frame_index(&self) -> u64 {
790 if let Some(frame) = &self.cur_frame {
791 self.sample_pos + (frame.buffer_index as u64)
792 } else {
793 0u64
794 }
795 }
796
797 pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
798 let frame_index = match seek_from{
799 SeekFrom::Start(fi) => fi,
800 SeekFrom::Current(cur) => {
801 (self.get_cur_frame_index() as i64 + cur) as u64
802 },
803 SeekFrom::End(end) => {
804 (self.total_frames as i64 + end) as u64
805 }
806 };
807 if self.sample_pos > frame_index {
808 self.reset();
809 }
810 loop {
811 if let Some(cur_frame) = &self.cur_frame {
812 if self.sample_pos + (cur_frame.sample_count as u64) > frame_index {
813 break;
814 } else {
815 self.cur_frame = self.get_next_frame();
816 }
817 } else {
818 return Ok(())
819 }
820 }
821 for _ in 0..(frame_index - self.sample_pos) {
822 let _ = self.decode_stereo_raw()?;
823 }
824 Ok(())
825 }
826
827 pub fn get_channels(&self) -> u16 {
828 self.target_channels
829 }
830
831 pub fn get_sample_rate(&self) -> u32 {
832 self.target_sample_rate
833 }
834
835 pub fn get_cur_frame(&self) -> &Option<Mp3AudioData> {
836 &self.cur_frame
837 }
838
839 pub fn decode_mono_raw(&mut self) -> Result<Option<i16>, AudioReadError> {
840 match self.cur_frame {
841 None => Ok(None),
842 Some(ref mut frame) => {
843 match frame.channels {
844 1 => {
845 let sample = frame.samples[frame.buffer_index];
846 frame.buffer_index += 1;
847 if frame.buffer_index >= frame.sample_count {
848 self.cur_frame = self.get_next_frame();
849 }
850 Ok(Some(sample))
851 },
852 2 => {
853 let l = frame.samples[frame.buffer_index * 2];
854 let r = frame.samples[frame.buffer_index * 2 + 1];
855 frame.buffer_index += 1;
856 if frame.buffer_index >= frame.sample_count {
857 self.cur_frame = self.get_next_frame();
858 }
859 Ok(Some(((l as i32 + r as i32) / 2i32) as i16))
860 },
861 o => Err(AudioReadError::DataCorrupted(format!("Unknown channel count {o}."))),
862 }
863 }
864 }
865 }
866
867 pub fn decode_stereo_raw(&mut self) -> Result<Option<(i16, i16)>, AudioReadError> {
868 match self.cur_frame {
869 None => Ok(None),
870 Some(ref mut frame) => {
871 match frame.channels {
872 1 => {
873 let sample = frame.samples[frame.buffer_index];
874 frame.buffer_index += 1;
875 if frame.buffer_index >= frame.sample_count {
876 self.cur_frame = self.get_next_frame();
877 }
878 Ok(Some((sample, sample)))
879 },
880 2 => {
881 let l = frame.samples[frame.buffer_index * 2];
882 let r = frame.samples[frame.buffer_index * 2 + 1];
883 frame.buffer_index += 1;
884 if frame.buffer_index >= frame.sample_count {
885 self.cur_frame = self.get_next_frame();
886 }
887 Ok(Some((l, r)))
888 },
889 o => Err(AudioReadError::DataCorrupted(format!("Unknown channel count {o}."))),
890 }
891 }
892 }
893 }
894
895 pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
896 where S: SampleType {
897 match self.decode_mono_raw()? {
898 None => Ok(None),
899 Some(s) => {
900 Ok(Some(S::from(s)))
901 },
902 }
903 }
904
905 pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
906 where S: SampleType {
907 match self.decode_stereo_raw()? {
908 None => Ok(None),
909 Some((l, r)) => Ok(Some((S::from(l), S::from(r)))),
910 }
911 }
912
913 pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
914 where S: SampleType {
915 let stereo = self.decode_stereo::<S>()?;
916 match stereo {
917 None => Ok(None),
918 Some((l, r)) => {
919 match self.target_channels {
920 1 => Ok(Some(vec![S::from(l)])),
921 2 => Ok(Some(vec![S::from(l), S::from(r)])),
922 o => Err(AudioReadError::DataCorrupted(format!("Unknown channel count {o}."))),
923 }
924 },
925 }
926 }
927 }
928}
929
930#[cfg(feature = "opus")]
931pub mod opus {
932 use std::{io::SeekFrom, fmt::{self, Debug, Formatter}};
933
934 use crate::Reader;
935 use crate::AudioReadError;
936 use crate::SampleType;
937 use crate::wavcore::FmtChunk;
938
939 use opus::{Decoder, Channels};
940
941 pub struct OpusDecoder {
942 reader: Box<dyn Reader>,
943 decoder: Decoder,
944 channels: u16,
945 sample_rate: u32,
946 data_offset: u64,
947 data_length: u64,
948 total_frames: u64,
949 block_align: usize,
950 decoded_samples: Vec<f32>,
951 decoded_samples_index: usize,
952 frame_index: u64,
953 }
954
955 impl OpusDecoder {
956 pub fn new(mut reader: Box<dyn Reader>, data_offset: u64, data_length: u64, fmt: &FmtChunk, total_samples: u64) -> Result<Self, AudioReadError> {
957 let channels = fmt.channels;
958 let sample_rate = fmt.sample_rate;
959 let opus_channels = match channels {
960 1 => Channels::Mono,
961 2 => Channels::Stereo,
962 o => return Err(AudioReadError::InvalidArguments(format!("Bad channels: {o} for the opus decoder."))),
963 };
964 let decoder = Decoder::new(sample_rate, opus_channels)?;
965 reader.seek(SeekFrom::Start(data_offset))?;
966 Ok(Self{
967 reader,
968 decoder,
969 channels,
970 sample_rate,
971 data_offset,
972 data_length,
973 total_frames: total_samples / channels as u64,
974 block_align: fmt.block_align as usize,
975 decoded_samples: Vec::<f32>::new(),
976 decoded_samples_index: 0,
977 frame_index: 0,
978 })
979 }
980
981 pub fn get_channels(&self) -> u16 {
982 self.channels
983 }
984
985 pub fn get_sample_rate(&self) -> u32 {
986 self.sample_rate
987 }
988
989 pub fn get_cur_frame_index(&self) -> u64 {
990 self.frame_index
991 }
992
993 fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
994 if self.reader.stream_position()? >= self.data_offset + self.data_length { Ok(true) } else { Ok(false) }
995 }
996
997 fn get_num_samples_in_ms(&self, ms_val: f32) -> usize {
998 (self.sample_rate as f32 * ms_val / 1000.0) as usize * self.channels as usize
999 }
1000
1001 fn clear_decoded_samples_buffer(&mut self) {
1002 self.decoded_samples.clear();
1003 self.decoded_samples_index = 0;
1004 }
1005
1006 fn get_samples_per_block(&self) -> usize {
1007 self.block_align as usize
1008 }
1009
1010 fn decode_block(&mut self) -> Result<(), AudioReadError> {
1011 if self.is_end_of_data()? {
1012 self.clear_decoded_samples_buffer();
1013 return Ok(());
1014 }
1015
1016 let mut buf = vec![0u8; self.block_align];
1018 let samples_to_get = self.get_samples_per_block();
1019 self.reader.read_exact(&mut buf)?;
1020 self.decoded_samples = vec![0.0; samples_to_get];
1021
1022 self.decoded_samples_index = 0;
1024
1025 let frames = self.decoder.decode_float(&buf, &mut self.decoded_samples, false)?;
1027
1028 let samples = frames * self.channels as usize;
1030 if samples != samples_to_get {
1031 Err(AudioReadError::IncompleteData(format!("Expected {samples_to_get} samples will be decoded, got {samples} samples.")))
1032 } else {
1033 Ok(())
1034 }
1035 }
1036
1037 pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
1038 let frame_index = match seek_from{
1039 SeekFrom::Start(fi) => fi,
1040 SeekFrom::Current(cur) => {
1041 (self.frame_index as i64 + cur) as u64
1042 },
1043 SeekFrom::End(end) => {
1044 (self.total_frames as i64 + end) as u64
1045 }
1046 };
1047 self.frame_index = frame_index;
1048 let block_align = self.block_align as u64;
1049 let block_index = frame_index / block_align;
1050 let seek_to = self.data_offset + block_index * block_align;
1051 if seek_to < self.data_offset + self.data_length {
1052 self.reader.seek(SeekFrom::Start(seek_to))?;
1053 self.decode_block()?;
1054 self.decoded_samples_index = ((frame_index * self.channels as u64) - block_index * self.get_samples_per_block() as u64) as usize;
1055 }
1056 Ok(())
1057 }
1058
1059 fn decode_sample(&mut self) -> Result<Option<f32>, AudioReadError> {
1060 if self.decoded_samples.is_empty() {
1061 Ok(None)
1062 } else if self.decoded_samples_index >= self.decoded_samples.len() {
1063 self.decode_block()?;
1064 self.decode_sample()
1065 } else {
1066 let ret = self.decoded_samples[self.decoded_samples_index];
1067 self.decoded_samples_index += 1;
1068 Ok(Some(ret))
1069 }
1070 }
1071
1072 pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
1073 where S: SampleType {
1074 match self.channels {
1075 1 => {
1076 let s = self.decode_sample()?;
1077 if let Some(s) = s {self.frame_index += 1; Ok(Some(S::from(s)))} else {Ok(None)}
1078 },
1079 2 => {
1080 let l = self.decode_sample()?;
1081 let r = self.decode_sample()?;
1082 let l = if let Some(l) = l {S::from(l)} else {return Ok(None);};
1083 let r = if let Some(r) = r {S::from(r)} else {return Ok(None);};
1084 self.frame_index += 1;
1085 Ok(Some(S::average(l, r)))
1086 },
1087 o => Err(AudioReadError::DataCorrupted(format!("Bad channels: {o} for the opus decoder."))),
1088 }
1089 }
1090
1091 pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
1092 where S: SampleType {
1093 match self.channels {
1094 1 => {
1095 let s = self.decode_sample()?;
1096 if let Some(s) = s {self.frame_index += 1; let s = S::from(s); Ok(Some((s, s)))} else {Ok(None)}
1097 }
1098 2 => {
1099 let l = self.decode_sample()?;
1100 let r = self.decode_sample()?;
1101 let l = if let Some(l) = l {S::from(l)} else {return Ok(None);};
1102 let r = if let Some(r) = r {S::from(r)} else {return Ok(None);};
1103 self.frame_index += 1;
1104 Ok(Some((l, r)))
1105 },
1106 o => Err(AudioReadError::DataCorrupted(format!("Bad channels: {o} for the opus decoder."))),
1107 }
1108 }
1109
1110 pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
1111 where S: SampleType {
1112 let stereo = self.decode_stereo::<S>()?;
1113 match stereo {
1114 None => Ok(None),
1115 Some((l, r)) => {
1116 match self.channels {
1117 1 => Ok(Some(vec![S::from(l)])),
1118 2 => Ok(Some(vec![S::from(l), S::from(r)])),
1119 o => Err(AudioReadError::DataCorrupted(format!("Unknown channel count {o}."))),
1120 }
1121 },
1122 }
1123 }
1124 }
1125
1126 impl Debug for OpusDecoder {
1127 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
1128 f.debug_struct("OpusDecoder")
1129 .field("reader", &self.reader)
1130 .field("decoder", &self.decoder)
1131 .field("channels", &self.channels)
1132 .field("sample_rate", &self.sample_rate)
1133 .field("data_offset", &self.data_offset)
1134 .field("data_length", &self.data_length)
1135 .field("total_frames", &self.total_frames)
1136 .field("block_align", &self.block_align)
1137 .field("decoded_samples", &format_args!("[f32; {}]", self.decoded_samples.len()))
1138 .field("decoded_samples_index", &self.decoded_samples_index)
1139 .field("frame_index", &self.frame_index)
1140 .finish()
1141 }
1142 }
1143}
1144
1145#[cfg(feature = "flac")]
1146pub mod flac {
1147 use std::{io::{self, SeekFrom}, cmp::Ordering, fmt::{self, Debug, Formatter}, ptr};
1148
1149 use crate::Reader;
1150 use crate::SampleType;
1151 use crate::AudioReadError;
1152 use crate::wavcore::FmtChunk;
1153 use crate::flac::*;
1154 use crate::resampler::Resampler;
1155 use crate::utils::{sample_conv, sample_conv_batch, do_resample_frames};
1156 use super::get_rounded_up_fft_size;
1157
1158 pub struct FlacDecoderWrap<'a> {
1159 reader: Box<dyn Reader>,
1160 decoder: Box<FlacDecoderUnmovable<'a>>,
1161 resampler: Resampler,
1162 channels: u16,
1163 sample_rate: u32,
1164 data_offset: u64,
1165 data_length: u64,
1166 decoded_frames: Vec<Vec<i32>>,
1167 decoded_frames_index: usize,
1168 frame_index: u64,
1169 total_frames: u64,
1170 self_ptr: Box<*mut FlacDecoderWrap<'a>>
1171 }
1172
1173 impl<'a> FlacDecoderWrap<'a> {
1174 pub fn new(reader: Box<dyn Reader>, data_offset: u64, data_length: u64, fmt: &FmtChunk, total_samples: u64) -> Result<Self, AudioReadError> {
1175 let mut self_ptr: Box<*mut FlacDecoderWrap> = Box::new(ptr::null_mut());
1177 let self_ptr_ptr = (&mut *self_ptr) as *mut *mut Self;
1178 let reader_ptr = Box::into_raw(reader); let decoder = Box::new(FlacDecoderUnmovable::new(
1180 unsafe {&mut *reader_ptr},
1181 Box::new(move |reader: &mut dyn ReadSeek, buffer: &mut [u8]| -> (usize, FlacReadStatus) {
1183 let to_read = buffer.len();
1184 match reader.read(buffer) {
1185 Ok(size) => {
1186 match size.cmp(&to_read) {
1187 Ordering::Equal => (size, FlacReadStatus::GoOn),
1188 Ordering::Less => (size, FlacReadStatus::Eof),
1189 Ordering::Greater => panic!("`reader.read()` returns a size greater than the desired size."),
1190 }
1191 },
1192 Err(e) => {
1193 eprintln!("on_read(): {:?}", e);
1194 (0, FlacReadStatus::Abort)
1195 }
1196 }
1197 }),
1198 Box::new(move |reader: &mut dyn ReadSeek, position: u64|-> Result<(), io::Error> {
1200 reader.seek(SeekFrom::Start(data_offset + position))?;
1201 Ok(())
1202 }),
1203 Box::new(move |reader: &mut dyn ReadSeek| -> Result<u64, io::Error> {
1205 Ok(reader.stream_position()? - data_offset)
1206 }),
1207 Box::new(move |_reader: &mut dyn ReadSeek| -> Result<u64, io::Error> {
1209 Ok(data_length)
1210 }),
1211 Box::new(move |reader: &mut dyn ReadSeek| -> bool {
1213 reader.stream_position().unwrap() >= data_offset + data_length
1214 }),
1215 Box::new(move |frames: &[Vec<i32>], sample_info: &SamplesInfo| -> Result<(), io::Error> {
1217 let this = unsafe{&mut (**self_ptr_ptr) as &mut Self};
1219 this.decoded_frames_index = 0;
1220 if sample_info.sample_rate != this.sample_rate {
1221 this.decoded_frames.clear();
1222 let process_size = this.resampler.get_process_size(this.resampler.get_fft_size(), sample_info.sample_rate, this.sample_rate);
1223 let mut iter = frames.iter();
1224 loop {
1225 let block: Vec<Vec<i32>> = iter.by_ref().take(process_size).cloned().collect();
1226 if block.is_empty() {
1227 break;
1228 }
1229 this.decoded_frames.extend(sample_conv_batch(&do_resample_frames(&this.resampler, &block, sample_info.sample_rate, this.sample_rate)).to_vec());
1230 }
1231 this.decoded_frames.shrink_to_fit();
1232 } else {
1233 this.decoded_frames = frames.to_vec();
1234 }
1235
1236 Ok(())
1237 }),
1238 Box::new(move |error: FlacInternalDecoderError| {
1240 eprintln!("on_error({error})");
1241 }),
1242 true, true, FlacAudioForm::FrameArray,
1245 )?);
1246 let mut ret = Self{
1247 reader: unsafe {Box::from_raw(reader_ptr)},
1248 decoder,
1249 resampler: Resampler::new(get_rounded_up_fft_size(fmt.sample_rate)),
1250 channels: fmt.channels,
1251 sample_rate: fmt.sample_rate,
1252 data_offset,
1253 data_length,
1254 decoded_frames: Vec::<Vec<i32>>::new(),
1255 decoded_frames_index: 0,
1256 frame_index: 0,
1257 total_frames: total_samples / fmt.channels as u64,
1258 self_ptr,
1259 };
1260 *ret.self_ptr = &mut ret as *mut Self;
1261 ret.decoder.initialize()?;
1262 Ok(ret)
1263 }
1264
1265 fn is_end_of_data(&mut self) -> Result<bool, AudioReadError> {
1266 Ok(self.decoder.eof())
1267 }
1268
1269 fn clear_decoded_frames(&mut self) {
1270 self.decoded_frames.clear();
1271 self.decoded_frames_index = 0;
1272 }
1273
1274 fn decode_block(&mut self) -> Result<(), AudioReadError> {
1275 if self.is_end_of_data()? {
1276 self.clear_decoded_frames();
1277 Ok(())
1278 } else {
1279 *self.self_ptr = self as *mut Self;
1282 self.decoder.decode()?;
1283 Ok(())
1284 }
1285 }
1286
1287 pub fn get_channels(&self) -> u16 {
1288 self.channels
1289 }
1290
1291 pub fn get_sample_rate(&self) -> u32 {
1292 self.sample_rate
1293 }
1294
1295 pub fn get_cur_frame_index(&self) -> u64 {
1296 self.frame_index
1297 }
1298
1299 pub fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError> {
1300 let frame_index = match seek_from{
1301 SeekFrom::Start(fi) => fi,
1302 SeekFrom::Current(cur) => {
1303 (self.frame_index as i64 + cur) as u64
1304 },
1305 SeekFrom::End(end) => {
1306 (self.total_frames as i64 + end) as u64
1307 }
1308 };
1309 self.clear_decoded_frames();
1310 self.frame_index = frame_index;
1311 self.decoder.seek(frame_index)?;
1312
1313 Ok(())
1314 }
1315
1316 pub fn decode_frame<S>(&mut self) -> Result<Option<Vec<S>>, AudioReadError>
1317 where S: SampleType {
1318 if self.is_end_of_data()? {
1319 Ok(None)
1320 } else if self.decoded_frames_index < self.decoded_frames.len() {
1321 let ret = sample_conv(&self.decoded_frames[self.decoded_frames_index]);
1322 self.decoded_frames_index += 1;
1323 self.frame_index += 1;
1324 Ok(Some(ret.to_vec()))
1325 } else {
1326 self.decode_block()?;
1327 self.decoded_frames_index = 0;
1328 self.decode_frame::<S>()
1329 }
1330 }
1331
1332 pub fn decode_stereo<S>(&mut self) -> Result<Option<(S, S)>, AudioReadError>
1333 where S: SampleType {
1334 if let Some(frame) = self.decode_frame::<S>()? {
1335 match frame.len() {
1336 1 => Ok(Some((frame[0], frame[0]))),
1337 2 => Ok(Some((frame[0], frame[1]))),
1338 o => Err(AudioReadError::Unsupported(format!("Unsupported to merge {o} channels to 2 channels."))),
1339 }
1340 } else {
1341 Ok(None)
1342 }
1343 }
1344
1345 pub fn decode_mono<S>(&mut self) -> Result<Option<S>, AudioReadError>
1346 where S: SampleType {
1347 if let Some(frame) = self.decode_frame::<S>()? {
1348 Ok(Some(S::average_arr(&frame)))
1349 } else {
1350 Ok(None)
1351 }
1352 }
1353 }
1354
1355 impl Debug for FlacDecoderWrap<'_> {
1356 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
1357 f.debug_struct("FlacDecoderWrap")
1358 .field("reader", &self.reader)
1359 .field("decoder", &self.decoder)
1360 .field("resampler", &self.resampler)
1361 .field("channels", &self.channels)
1362 .field("sample_rate", &self.sample_rate)
1363 .field("data_offset", &self.data_offset)
1364 .field("data_length", &self.data_length)
1365 .field("decoded_frames", &format_args!("[i32; {}]", self.decoded_frames.len()))
1366 .field("decoded_frames_index", &self.decoded_frames_index)
1367 .field("frame_index", &self.frame_index)
1368 .field("total_frames", &self.total_frames)
1369 .field("self_ptr", &self.self_ptr)
1370 .finish()
1371 }
1372 }
1373}