Skip to content

Commit

Permalink
feat: better error handling in mania-codec
Browse files Browse the repository at this point in the history
  • Loading branch information
pk5ls20 committed Feb 21, 2025
1 parent 9d95b50 commit 5d8e603
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 13 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ logs/

# direnv
/.direnv
*.silk
5 changes: 4 additions & 1 deletion mania-codec/src/audio/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ use crate::audio::{AudioResampleStream, AudioRwStream, DecodeSample};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum AudioCodecDecoderError {}
pub enum AudioCodecDecoderError {
#[error("Symphonia decoder error: {0}")]
SymphoniaError(#[from] symphonia::core::errors::Error),
}

pub trait AudioDecoder<T: DecodeSample> {
fn decode(
Expand Down
6 changes: 2 additions & 4 deletions mania-codec/src/audio/decoder/symphonia_decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,7 @@ impl<T: DecodeSample> AudioDecoder<T> for SymphoniaDecoder<T> {
let hint = Hint::new();
let meta_opts: MetadataOptions = Default::default();
let fmt_opts: FormatOptions = Default::default();
let probed = symphonia::default::get_probe()
.format(&hint, mss, &fmt_opts, &meta_opts)
.unwrap();
let probed = symphonia::default::get_probe().format(&hint, mss, &fmt_opts, &meta_opts)?;
let mut format = probed.format;
let track = format
.tracks()
Expand All @@ -114,7 +112,7 @@ impl<T: DecodeSample> AudioDecoder<T> for SymphoniaDecoder<T> {
if packet.track_id() != track_id {
continue;
}
match decoder.decode(&packet).unwrap() {
match decoder.decode(&packet)? {
AudioBufferRef::F32(data) => conv(&mut pcm_data, data),
AudioBufferRef::U8(data) => conv(&mut pcm_data, data),
AudioBufferRef::U16(data) => conv(&mut pcm_data, data),
Expand Down
7 changes: 6 additions & 1 deletion mania-codec/src/audio/resampler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ use crate::audio::{AudioResampleStream, ResampleSample};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum AudioCodecResamplerError {}
pub enum AudioCodecResamplerError {
#[error("Rubato resampler error: {0}")]
RubatoResampleError(#[from] rubato::ResampleError),
#[error("Rubato resampler construction error: {0}")]
RubatoResamplerConstructionError(#[from] rubato::ResamplerConstructionError),
}

pub trait AudioResampler<T: ResampleSample, U: ResampleSample> {
fn resample(
Expand Down
15 changes: 8 additions & 7 deletions mania-codec/src/audio/resampler/rubato_resampler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,23 @@ impl AudioResampler<f32, i16> for RubatoResampler<i16> {
(pcm_in.len() as f64 * sr_out as f64 / sr_in as f64) as usize + 1024,
);
// TODO: channel
let mut resampler = rubato::FftFixedInOut::<f32>::new(sr_in, sr_out, 1024, 1).unwrap();
let mut resampler = rubato::FftFixedInOut::<f32>::new(sr_in, sr_out, 1024, 1)?;
let mut output_buffer = resampler.output_buffer_allocate(true);
let mut pos_in = 0;

while pos_in + resampler.input_frames_next() < pcm_in.len() {
let (in_len, out_len) = resampler
.process_into_buffer(&[&pcm_in[pos_in..]], &mut output_buffer, None)
.unwrap();
let (in_len, out_len) =
resampler.process_into_buffer(&[&pcm_in[pos_in..]], &mut output_buffer, None)?;
pos_in += in_len;
pcm_out.extend_from_slice(&output_buffer[0][..out_len]);
}

if pos_in < pcm_in.len() {
let (_, out_len) = resampler
.process_partial_into_buffer(Some(&[&pcm_in[pos_in..]]), &mut output_buffer, None)
.unwrap();
let (_, out_len) = resampler.process_partial_into_buffer(
Some(&[&pcm_in[pos_in..]]),
&mut output_buffer,
None,
)?;
pcm_out.extend_from_slice(&output_buffer[0][..out_len]);
}

Expand Down

0 comments on commit 5d8e603

Please sign in to comment.