core: Refactor PCM decoder a bit

Extract a `read_sample` method to avoid code duplication, and use
the byteorder crate as already done in other places.
This commit is contained in:
relrelb 2021-07-09 18:57:50 +03:00 committed by relrelb
parent 939d467897
commit 25b8013a99
4 changed files with 21 additions and 29 deletions

1
Cargo.lock generated
View File

@ -2977,6 +2977,7 @@ dependencies = [
"approx",
"bitflags",
"bitstream-io",
"byteorder",
"chrono",
"downcast-rs",
"encoding_rs",

View File

@ -6,6 +6,7 @@ edition = "2018"
license = "MIT OR Apache-2.0"
[dependencies]
byteorder = "1.4"
bitstream-io = "1.1.0"
flate2 = "1.0.20"
fnv = "1.0.7"

View File

@ -1,4 +1,5 @@
use super::{Decoder, SeekableDecoder};
use byteorder::{LittleEndian, ReadBytesExt};
use std::io::{Cursor, Read};
/// Decoder for PCM audio data in a Flash file.
@ -13,47 +14,36 @@ pub struct PcmDecoder<R: Read> {
impl<R: Read> PcmDecoder<R> {
pub fn new(inner: R, is_stereo: bool, sample_rate: u16, is_16_bit: bool) -> Self {
PcmDecoder {
Self {
inner,
is_stereo,
sample_rate,
is_16_bit,
}
}
#[inline]
fn read_sample(&mut self) -> Option<i16> {
let sample = if self.is_16_bit {
self.inner.read_i16::<LittleEndian>().ok()?
} else {
(i16::from(self.inner.read_u8().ok()?) - 127) * 128
};
Some(sample)
}
}
impl<R: Read> Iterator for PcmDecoder<R> {
type Item = [i16; 2];
#[allow(unknown_lints, clippy::branches_sharing_code)]
fn next(&mut self) -> Option<Self::Item> {
if self.is_stereo {
if self.is_16_bit {
let mut left = [0u8; 2];
let mut right = [0u8; 2];
self.inner.read_exact(&mut left).ok()?;
self.inner.read_exact(&mut right).ok()?;
let left = i16::from_le_bytes(left);
let right = i16::from_le_bytes(right);
Some([left, right])
} else {
let mut bytes = [0u8; 2];
self.inner.read_exact(&mut bytes).ok()?;
let left = (i16::from(bytes[0]) - 127) * 128;
let right = (i16::from(bytes[1]) - 127) * 128;
Some([left, right])
}
} else if self.is_16_bit {
let mut bytes = [0u8; 2];
self.inner.read_exact(&mut bytes).ok()?;
let sample = i16::from_le_bytes(bytes);
Some([sample, sample])
let left = self.read_sample()?;
let right = if self.is_stereo {
self.read_sample()?
} else {
let mut bytes = [0u8];
self.inner.read_exact(&mut bytes).ok()?;
let sample = (i16::from(bytes[0]) - 127) * 128;
Some([sample, sample])
}
left
};
Some([left, right])
}
}

View File

@ -21,7 +21,7 @@ canvas = ["ruffle_render_canvas"]
webgl = ["ruffle_render_webgl"]
[dependencies]
byteorder = "1.4.3"
byteorder = "1.4"
console_error_panic_hook = { version = "0.1.1", optional = true }
console_log = { version = "0.2", optional = true }
fnv = "1.0.7"