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
27pub trait Decoder<S>: Debug
29where
30 S: SampleType,
31{
32 fn get_channels(&self) -> u16;
34
35 fn decode_frame(&mut self) -> Result<Option<Vec<S>>, AudioReadError>;
37
38 fn seek(&mut self, seek_from: SeekFrom) -> Result<(), AudioReadError>;
40
41 fn get_cur_frame_index(&mut self) -> Result<u64, AudioReadError>;
43
44 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 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 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 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 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 fn set_downmixer(&mut self, _downmixer: &Downmixer) {
117 eprintln!("This decoder doesn't supports downmixing");
118 }
119
120 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#[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#[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 if self.samples.is_empty() {
586 self.feed_until_output(1)?;
587 }
588
589 if self.samples.is_empty() {
591 Ok(None)
592 } else {
593 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 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 if self.samples.is_empty() {
640 self.feed_until_output(2)?;
641 }
642
643 if self.samples.is_empty() {
645 Ok(None)
646 } else {
647 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 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#[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#[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 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 #[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 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 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#[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 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 self.decoded_samples_index = 0;
1277
1278 let frames =
1280 self.decoder
1281 .decode_float(&buf, &mut self.decoded_samples, false)?;
1282
1283 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#[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 pub struct FlacDecoderWrap<'a> {
1466 decoder: Box<FlacDecoderUnmovable<'a, Box<dyn Reader>>>,
1468
1469 resampler: Resampler,
1471
1472 channels: u16,
1474
1475 sample_rate: u32,
1477
1478 data_offset: u64,
1480
1481 data_length: u64,
1483
1484 decoded_frames: Vec<Vec<i32>>,
1486
1487 decoded_frames_index: usize,
1489
1490 frame_index: u64,
1492
1493 total_frames: u64,
1495
1496 self_ptr: Box<*mut FlacDecoderWrap<'a>>,
1498
1499 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 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 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 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 Box::new(move |reader: &mut Box<dyn Reader>| -> io::Result<u64> {
1545 Ok(reader.stream_position()? - data_offset)
1546 }),
1547 Box::new(move |_reader: &mut Box<dyn Reader>| -> io::Result<u64> {
1549 Ok(data_length)
1550 }),
1551 Box::new(move |reader: &mut Box<dyn Reader>| -> bool {
1553 reader.stream_position().unwrap() >= data_offset + data_length
1554 }),
1555 Box::new(
1557 move |frames: &[Vec<i32>],
1558 sample_info: &SamplesInfo|
1559 -> io::Result<()> {
1560 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 Box::new(move |error: FlacInternalDecoderError| {
1597 eprintln!("on_error({error})");
1598 }),
1599 true, true, 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 *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#[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 pub struct OggVorbisDecoderWrap {
1904 reader: OggVorbisDecoderReader,
1906
1907 decoder: VorbisDecoder<OggVorbisDecoderReader>,
1909
1910 data_offset: u64,
1912
1913 data_length: u64,
1915
1916 total_frames: u64,
1918
1919 channels: u16,
1921
1922 sample_rate: u32,
1924
1925 decoded_samples: Option<Vec<Vec<f32>>>,
1927
1928 cur_frame_index: u64,
1930
1931 cur_block_frame_index: u64,
1933
1934 pub downmixer: Downmixer,
1936 }
1937
1938 #[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 let current_position = reader.stream_position()?;
2038 if current_position == 0 {
2039 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 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 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 pub fn get_channels(&self) -> u16 {
2192 self.channels
2193 }
2194
2195 pub fn get_cur_frame_index(&self) -> u64 {
2197 self.cur_frame_index
2198 }
2199
2200 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 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 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 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 #[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}