pile-audio refactor
This commit is contained in:
63
crates/pile-flac/src/reader/block.rs
Normal file
63
crates/pile-flac/src/reader/block.rs
Normal file
@@ -0,0 +1,63 @@
|
||||
use std::io::Write;
|
||||
|
||||
use crate::{
|
||||
FlacDecodeError, FlacEncodeError,
|
||||
blocks::{
|
||||
FlacApplicationBlock, FlacAudioFrame, FlacCommentBlock, FlacCuesheetBlock,
|
||||
FlacMetablockDecode, FlacMetablockEncode, FlacMetablockType, FlacPaddingBlock,
|
||||
FlacPictureBlock, FlacSeektableBlock, FlacStreaminfoBlock,
|
||||
},
|
||||
};
|
||||
|
||||
#[derive(Debug)]
|
||||
#[expect(missing_docs)]
|
||||
pub enum FlacBlock {
|
||||
Streaminfo(FlacStreaminfoBlock),
|
||||
Picture(FlacPictureBlock),
|
||||
Padding(FlacPaddingBlock),
|
||||
Application(FlacApplicationBlock),
|
||||
SeekTable(FlacSeektableBlock),
|
||||
VorbisComment(FlacCommentBlock),
|
||||
CueSheet(FlacCuesheetBlock),
|
||||
AudioFrame(FlacAudioFrame),
|
||||
}
|
||||
|
||||
impl FlacBlock {
|
||||
/// Encode this block
|
||||
pub fn encode(
|
||||
&self,
|
||||
is_last: bool,
|
||||
with_header: bool,
|
||||
target: &mut impl Write,
|
||||
) -> Result<(), FlacEncodeError> {
|
||||
match self {
|
||||
Self::Streaminfo(b) => b.encode(is_last, with_header, target),
|
||||
Self::SeekTable(b) => b.encode(is_last, with_header, target),
|
||||
Self::Picture(b) => b.encode(is_last, with_header, target),
|
||||
Self::Padding(b) => b.encode(is_last, with_header, target),
|
||||
Self::Application(b) => b.encode(is_last, with_header, target),
|
||||
Self::VorbisComment(b) => b.encode(is_last, with_header, target),
|
||||
Self::CueSheet(b) => b.encode(is_last, with_header, target),
|
||||
Self::AudioFrame(b) => b.encode(target),
|
||||
}
|
||||
}
|
||||
|
||||
/// Try to decode the given data as a block
|
||||
pub fn decode(block_type: FlacMetablockType, data: &[u8]) -> Result<Self, FlacDecodeError> {
|
||||
Ok(match block_type {
|
||||
FlacMetablockType::Streaminfo => {
|
||||
FlacBlock::Streaminfo(FlacStreaminfoBlock::decode(data)?)
|
||||
}
|
||||
FlacMetablockType::Application => {
|
||||
FlacBlock::Application(FlacApplicationBlock::decode(data)?)
|
||||
}
|
||||
FlacMetablockType::Cuesheet => FlacBlock::CueSheet(FlacCuesheetBlock::decode(data)?),
|
||||
FlacMetablockType::Padding => FlacBlock::Padding(FlacPaddingBlock::decode(data)?),
|
||||
FlacMetablockType::Picture => FlacBlock::Picture(FlacPictureBlock::decode(data)?),
|
||||
FlacMetablockType::Seektable => FlacBlock::SeekTable(FlacSeektableBlock::decode(data)?),
|
||||
FlacMetablockType::VorbisComment => {
|
||||
FlacBlock::VorbisComment(FlacCommentBlock::decode(data)?)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user