Merge pull request #925 from pdeljanov/new-api-symphonia-fixes

Handle reset and decode errors
This commit is contained in:
Roderick van Domburg 2022-01-06 11:10:02 +01:00 committed by GitHub
commit 6c25fb79dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -171,6 +171,7 @@ impl AudioDecoder for SymphoniaDecoder {
} }
fn next_packet(&mut self) -> DecoderResult<Option<(u32, AudioPacket)>> { fn next_packet(&mut self) -> DecoderResult<Option<(u32, AudioPacket)>> {
loop {
let packet = match self.format.next_packet() { let packet = match self.format.next_packet() {
Ok(packet) => packet, Ok(packet) => packet,
Err(Error::IoError(err)) => { Err(Error::IoError(err)) => {
@ -180,10 +181,6 @@ impl AudioDecoder for SymphoniaDecoder {
return Err(DecoderError::SymphoniaDecoder(err.to_string())); return Err(DecoderError::SymphoniaDecoder(err.to_string()));
} }
} }
Err(Error::ResetRequired) => {
self.decoder.reset();
return self.next_packet();
}
Err(err) => { Err(err) => {
return Err(err.into()); return Err(err.into());
} }
@ -203,11 +200,15 @@ impl AudioDecoder for SymphoniaDecoder {
let sample_buffer = self.sample_buffer.as_mut().unwrap(); // guaranteed above let sample_buffer = self.sample_buffer.as_mut().unwrap(); // guaranteed above
sample_buffer.copy_interleaved_ref(decoded); sample_buffer.copy_interleaved_ref(decoded);
let samples = AudioPacket::Samples(sample_buffer.samples().to_vec()); let samples = AudioPacket::Samples(sample_buffer.samples().to_vec());
Ok(Some((position_ms, samples))) return Ok(Some((position_ms, samples)));
}
Err(Error::DecodeError(_)) => {
// The packet failed to decode due to corrupted or invalid data, get a new
// packet and try again.
continue;
}
Err(err) => return Err(err.into()),
} }
// Also propagate `ResetRequired` errors from the decoder to the player,
// so that it will skip to the next track and reload the entire Symphonia decoder.
Err(err) => Err(err.into()),
} }
} }
} }