FLAC error edits

This commit is contained in:
2026-03-16 19:17:51 -07:00
parent b1f76b0741
commit f2f5726d7b

View File

@@ -1,10 +1,20 @@
use std::io::{Read, Seek, SeekFrom}; use std::io::{ErrorKind, Read, Seek, SeekFrom};
use crate::{ use crate::{
FlacBlock, FlacDecodeError, FlacBlock, FlacDecodeError,
blocks::{FlacAudioFrame, FlacMetablockHeader, FlacMetablockType}, blocks::{FlacAudioFrame, FlacMetablockHeader, FlacMetablockType},
}; };
fn read_exact_flac<R: Read>(reader: &mut R, buf: &mut [u8]) -> Result<(), FlacDecodeError> {
reader.read_exact(buf).map_err(|e| {
if e.kind() == ErrorKind::UnexpectedEof {
FlacDecodeError::MalformedBlock
} else {
e.into()
}
})
}
// TODO: quickly skip blocks we do not need // TODO: quickly skip blocks we do not need
/// The next block we expect to read /// The next block we expect to read
@@ -42,9 +52,9 @@ impl<R: Read + Seek> Iterator for FlacReader<R> {
ReaderState::MagicBits => { ReaderState::MagicBits => {
let mut data = [0u8; 4]; let mut data = [0u8; 4];
if let Err(e) = self.inner.read_exact(&mut data[..4]) { if let Err(e) = read_exact_flac(&mut self.inner, &mut data[..4]) {
self.state = ReaderState::Done; self.state = ReaderState::Done;
return Some(Err(e.into())); return Some(Err(e));
} }
if data != [0x66, 0x4C, 0x61, 0x43] { if data != [0x66, 0x4C, 0x61, 0x43] {
@@ -57,9 +67,9 @@ impl<R: Read + Seek> Iterator for FlacReader<R> {
ReaderState::MetablockHeader { is_first } => { ReaderState::MetablockHeader { is_first } => {
let mut data = [0u8; 4]; let mut data = [0u8; 4];
if let Err(e) = self.inner.read_exact(&mut data[..]) { if let Err(e) = read_exact_flac(&mut self.inner, &mut data[..]) {
self.state = ReaderState::Done; self.state = ReaderState::Done;
return Some(Err(e.into())); return Some(Err(e));
} }
let header = match FlacMetablockHeader::decode(&data) { let header = match FlacMetablockHeader::decode(&data) {
@@ -80,9 +90,9 @@ impl<R: Read + Seek> Iterator for FlacReader<R> {
ReaderState::MetaBlock { header } => { ReaderState::MetaBlock { header } => {
let mut data = vec![0u8; header.length as usize]; let mut data = vec![0u8; header.length as usize];
if let Err(e) = self.inner.read_exact(&mut data) { if let Err(e) = read_exact_flac(&mut self.inner, &mut data) {
self.state = ReaderState::Done; self.state = ReaderState::Done;
return Some(Err(e.into())); return Some(Err(e));
} }
let block = match FlacBlock::decode(header.block_type, &data) { let block = match FlacBlock::decode(header.block_type, &data) {