64 lines
2.1 KiB
Rust
64 lines
2.1 KiB
Rust
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)?)
|
|
}
|
|
})
|
|
}
|
|
}
|