From 5ec7acb80375c5c9ef3b1d3bd7f877d4ea365b2a Mon Sep 17 00:00:00 2001 From: jaby Date: Sun, 28 Jul 2024 13:22:39 -0500 Subject: [PATCH] Improve psxcdread --- src/Tools/cdtypes/Cargo.toml | 2 +- src/Tools/cdtypes/src/cd/mod.rs | 6 ++-- src/Tools/cdtypes/src/cd/reader.rs | 50 ++++++++++++++++++++--------- src/Tools/cdtypes/src/types/time.rs | 2 +- src/Tools/psxcdread/Cargo.toml | 2 +- src/Tools/psxcdread/src/main.rs | 6 ++-- 6 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/Tools/cdtypes/Cargo.toml b/src/Tools/cdtypes/Cargo.toml index 8ade8d47..a0aa2654 100644 --- a/src/Tools/cdtypes/Cargo.toml +++ b/src/Tools/cdtypes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cdtypes" -version = "0.7.1" +version = "0.7.2" edition = "2021" [profile.release] diff --git a/src/Tools/cdtypes/src/cd/mod.rs b/src/Tools/cdtypes/src/cd/mod.rs index 3c64cfc9..6b5193f7 100644 --- a/src/Tools/cdtypes/src/cd/mod.rs +++ b/src/Tools/cdtypes/src/cd/mod.rs @@ -2,7 +2,7 @@ pub mod reader; pub mod sector; use sector::*; -use reader::Reader as CDReader; +use reader::{UnknownSectorBehavior, Reader as CDReader}; use super::{Error, types as types}; use types::{cue::{Specifier, DataType, DataTypeEnd}, lsb_msb::ReadWriteEndian, pvd::PrimaryVolumeDescriptor, sector::{Mode2Form1, SubHeaderForm}}; use std::fs::File; @@ -191,7 +191,7 @@ pub struct CD { } impl CD { - pub fn from_file(file: File, specifier: Option>) -> Result { + pub fn from_file(file: File, specifier: Option>, unk_sector_behav: UnknownSectorBehavior) -> Result { let data_type_ends = { if let Some(specifier) = specifier { DataTypeEnd::parse_cue_specifier(specifier)? @@ -201,7 +201,7 @@ impl CD { Vec::new() } }; - let reader = CDReader::new(file, &data_type_ends)?; + let reader = CDReader::new(file, &data_type_ends, unk_sector_behav)?; let mut sectors = Vec::new(); for sector in reader { diff --git a/src/Tools/cdtypes/src/cd/reader.rs b/src/Tools/cdtypes/src/cd/reader.rs index 31115edd..ed25726c 100644 --- a/src/Tools/cdtypes/src/cd/reader.rs +++ b/src/Tools/cdtypes/src/cd/reader.rs @@ -2,17 +2,27 @@ use super::{sector::Sector, types::time::Time}; use super::super::{Error, types::{cue::{DataType, DataTypeEnd}, sector::*}}; use std::io::Read; +#[derive(Copy, Clone)] +pub enum UnknownSectorBehavior { + CauseError, + CauseWarningAddEmpty, + TreatAsAudio, +} + pub struct Reader<'a> { file: std::fs::File, data_type_guide: &'a Vec, lba: usize, + unk_sector_behav: UnknownSectorBehavior, active: bool } impl<'a> Reader<'a> { - pub fn new(file: std::fs::File, data_type_guide: &'a Vec) -> Result { + const CD_PREGAP_SECTORS:usize = Time::cd_pregap().as_sectors(); + + pub fn new(file: std::fs::File, data_type_guide: &'a Vec, unk_sector_behav: UnknownSectorBehavior) -> Result { Ok(Reader{ - file, data_type_guide, lba: Time::cd_pregap().as_sectors(), active: true + file, data_type_guide, unk_sector_behav, lba: Self::CD_PREGAP_SECTORS, active: true }) } @@ -23,11 +33,10 @@ impl<'a> Reader<'a> { return Some(data_type.r#type.clone()); } } - None } - fn process_audio_sector(&mut self, _force: bool) -> Result, Error> { + fn process_audio_sector(&mut self, _unk_sector_behav: UnknownSectorBehavior) -> Result, Error> { let mut buffer = [0;std::mem::size_of::