LBAs are track relative

This commit is contained in:
2022-10-19 20:42:58 +02:00
parent 97c4f0a05d
commit 840ca74e6d
7 changed files with 41 additions and 35 deletions

View File

@@ -1,15 +1,13 @@
use cdtypes::types::{sector::*, time::Time};
use cdtypes::types::sector::*;
pub fn create_xa_data_for_data(lba: usize, data: &[u8; Mode2Form1::DATA_SIZE]) -> Mode2Form1 {
pub fn create_xa_data_for_data(data: &[u8; Mode2Form1::DATA_SIZE]) -> Mode2Form1 {
let mut sector = Mode2Form1::new();
sector.header.set_time(Time::from_lba(lba));
sector.sub_header.sub_mode.set_data();
sector.data = *data;
sector
}
pub fn create_xa_data_zero(lba: usize) -> Mode2Form1 {
create_xa_data_for_data(lba, &[0u8; Mode2Form1::DATA_SIZE])
pub fn create_xa_data_zero() -> Mode2Form1 {
create_xa_data_for_data(&[0u8; Mode2Form1::DATA_SIZE])
}

View File

@@ -12,7 +12,7 @@ pub fn encode_psx_image(cd_desc: CDDesc, sec_writer: &mut dyn SectorWriter) -> R
Err(Error::not_implemented("encode_psx_image"))
}
fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
fn process_system_area(_: &SystemArea, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
sec_writer.write(Sector::CDXAData(builder::create_xa_data_zero(system_area.properties.lba)))
sec_writer.write(Sector::CDXAData(builder::create_xa_data_zero()))
}

View File

@@ -1,20 +1,32 @@
use std::io::Write;
use super::{Error, Sector, SectorWriter};
use cdtypes::types::time::Time;
use std::io::Write;
pub struct BinCueWriter {
_bin_out: std::boxed::Box<dyn Write>,
sector_count: usize
cd_time: Time,
}
impl BinCueWriter {
pub fn new<T: Write + 'static>(writer: T) -> BinCueWriter {
BinCueWriter{_bin_out: std::boxed::Box::new(writer), sector_count: 0}
BinCueWriter{_bin_out: std::boxed::Box::new(writer), cd_time: Time::cd_start()}
}
fn finalize(&mut self, sector: &mut Sector) -> Result<(), Error> {
sector.finalize();
if let Some(header) = sector.get_header_mut() {
header.set_time(self.cd_time.clone());
}
self.cd_time.add_sector()?;
Ok(())
}
}
impl SectorWriter for BinCueWriter {
fn write(&mut self, mut sector: Sector) -> Result<(), Error> {
self.finalize_sector(&mut sector)?;
self.finalize(&mut sector)?;
match sector {
Sector::Empty(_) => Err(Error::not_implemented("Empty sector encoding")),
@@ -24,8 +36,4 @@ impl SectorWriter for BinCueWriter {
Sector::CDXAAudio(_) => Err(Error::not_implemented("CD XA Audio sector encoding"))
}
}
fn sector_written_count(&self) -> usize {
self.sector_count
}
}

View File

@@ -13,20 +13,6 @@ pub enum ImageType {
pub trait SectorWriter {
fn write(&mut self, sector: Sector) -> Result<(), Error>;
fn sector_written_count(&self) -> usize;
fn finalize_sector(&self, sector: &mut Sector) -> Result<(), Error> {
let sectors_written = self.sector_written_count();
if let Some(header) = sector.get_header() {
let sector_lba = header.get_time().to_lba();
if sector_lba != sectors_written {
return Err(Error::from_text(format!("Header LBA {} doesn't match written sector count of {}", sector_lba, sectors_written)));
}
}
sector.finalize();
Ok(())
}
}
pub fn write_image(cd_desc: CDDesc, encoder: EncoderFunction, image_type: ImageType, output_path: PathBuf) -> Result<(), Error> {