audio: Ask decoder for sound sample rate

Don't rely on the sample rate in the SWF tags, as this could differ
from the actual sample rate of the audio (see #335).
This commit is contained in:
Mike Welsh 2021-10-17 17:48:03 -07:00
parent 5854d4a23f
commit 3dfa5ade18
1 changed files with 6 additions and 5 deletions

View File

@ -232,15 +232,16 @@ impl AudioMixer {
} }
/// Transforms a `Stream` into a new `Stream` that matches the output sample rate. /// Transforms a `Stream` into a new `Stream` that matches the output sample rate.
fn make_resampler(&self, format: &swf::SoundFormat, mut stream: impl Stream) -> impl Stream { fn make_resampler(&self, mut stream: impl Stream) -> impl Stream {
// TODO: Allow interpolator to be user-configurable? // TODO: Allow interpolator to be user-configurable?
let left = stream.next(); let left = stream.next();
let right = stream.next(); let right = stream.next();
let interpolator = dasp::interpolate::linear::Linear::new(left, right); let interpolator = dasp::interpolate::linear::Linear::new(left, right);
let sample_rate = stream.source_sample_rate().into();
ConverterStream(dasp::signal::interpolate::Converter::from_hz_to_hz( ConverterStream(dasp::signal::interpolate::Converter::from_hz_to_hz(
stream, stream,
interpolator, interpolator,
format.sample_rate.into(), sample_rate,
self.output_sample_rate.into(), self.output_sample_rate.into(),
)) ))
} }
@ -266,7 +267,7 @@ impl AudioMixer {
sound.skip_sample_frames, sound.skip_sample_frames,
); );
// Resample the stream to the output sample rate. // Resample the stream to the output sample rate.
let stream = self.make_resampler(&sound.format, stream); let stream = self.make_resampler(stream);
if let Some(envelope) = &settings.envelope { if let Some(envelope) = &settings.envelope {
let envelope_signal = EnvelopeSignal::new(&envelope[..], self.output_sample_rate); let envelope_signal = EnvelopeSignal::new(&envelope[..], self.output_sample_rate);
Ok(Box::new(MulAmpStream::new(stream, envelope_signal)) as Box<dyn Stream>) Ok(Box::new(MulAmpStream::new(stream, envelope_signal)) as Box<dyn Stream>)
@ -290,7 +291,7 @@ impl AudioMixer {
// Convert the `Decoder` to a `Stream`, and resample it to output sample rate. // Convert the `Decoder` to a `Stream`, and resample it to output sample rate.
let stream = DecoderStream::new(decoder); let stream = DecoderStream::new(decoder);
let stream = self.make_resampler(format, stream); let stream = self.make_resampler(stream);
Ok(Box::new(stream)) Ok(Box::new(stream))
} }
@ -305,7 +306,7 @@ impl AudioMixer {
// Convert the `Decoder` to a `Stream`, and resample it to the output sample rate. // Convert the `Decoder` to a `Stream`, and resample it to the output sample rate.
let stream = DecoderStream::new(clip_stream_decoder); let stream = DecoderStream::new(clip_stream_decoder);
let stream = Box::new(self.make_resampler(format, stream)); let stream = Box::new(self.make_resampler(stream));
Ok(stream) Ok(stream)
} }