Merge pull request #967 from JasonLG1979/SymphoniaDecoder

Refactor Symphonia decoder
This commit is contained in:
Roderick van Domburg 2022-03-04 11:58:17 +01:00 committed by GitHub
commit dd8155b044
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -104,38 +104,36 @@ impl SymphoniaDecoder {
pub fn normalisation_data(&mut self) -> Option<NormalisationData> { pub fn normalisation_data(&mut self) -> Option<NormalisationData> {
let mut metadata = self.format.metadata(); let mut metadata = self.format.metadata();
// Advance to the latest metadata revision.
// None means we hit the latest.
loop { loop {
if let Some(_discarded_revision) = metadata.pop() { if metadata.pop().is_none() {
// Advance to the latest metadata revision. break;
continue;
} else {
let revision = metadata.current()?;
let tags = revision.tags();
if tags.is_empty() {
// The latest metadata entry in the log is empty.
return None;
}
let mut data = NormalisationData::default();
let mut i = 0;
while i < tags.len() {
if let Value::Float(value) = tags[i].value {
#[allow(non_snake_case)]
match tags[i].std_key {
Some(StandardTagKey::ReplayGainAlbumGain) => data.album_gain_db = value,
Some(StandardTagKey::ReplayGainAlbumPeak) => data.album_peak = value,
Some(StandardTagKey::ReplayGainTrackGain) => data.track_gain_db = value,
Some(StandardTagKey::ReplayGainTrackPeak) => data.track_peak = value,
_ => (),
}
}
i += 1;
}
break Some(data);
} }
} }
let tags = metadata.current()?.tags();
if tags.is_empty() {
None
} else {
let mut data = NormalisationData::default();
for tag in tags {
if let Value::Float(value) = tag.value {
match tag.std_key {
Some(StandardTagKey::ReplayGainAlbumGain) => data.album_gain_db = value,
Some(StandardTagKey::ReplayGainAlbumPeak) => data.album_peak = value,
Some(StandardTagKey::ReplayGainTrackGain) => data.track_gain_db = value,
Some(StandardTagKey::ReplayGainTrackPeak) => data.track_peak = value,
_ => (),
}
}
}
Some(data)
}
} }
fn ts_to_ms(&self, ts: u64) -> u32 { fn ts_to_ms(&self, ts: u64) -> u32 {
@ -200,14 +198,15 @@ impl AudioDecoder for SymphoniaDecoder {
match self.decoder.decode(&packet) { match self.decoder.decode(&packet) {
Ok(decoded) => { Ok(decoded) => {
if self.sample_buffer.is_none() { let sample_buffer = match self.sample_buffer.as_mut() {
let spec = *decoded.spec(); Some(buffer) => buffer,
let duration = decoded.capacity() as u64; None => {
self.sample_buffer let spec = *decoded.spec();
.replace(SampleBuffer::new(duration, spec)); let duration = decoded.capacity() as u64;
} self.sample_buffer.insert(SampleBuffer::new(duration, spec))
}
};
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());