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:
parent
5854d4a23f
commit
3dfa5ade18
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue