FLAC error edits
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user