Encode first sector

This commit is contained in:
jaby 2022-10-19 19:44:52 +02:00
parent 55673b3afe
commit 97c4f0a05d
7 changed files with 73 additions and 9 deletions

View File

@ -115,4 +115,14 @@ impl Sector {
Sector::CDXAAudio(_) => ()
}
}
pub fn finalize(&mut self) {
match self {
Sector::Audio(_) => (),
Sector::Empty(_) => (),
Sector::CDData(sector) => sector.finalize(),
Sector::CDXAData(sector) => sector.finalize(),
Sector::CDXAAudio(sector) => sector.finalize(),
}
}
}

View File

@ -80,6 +80,10 @@ impl Header {
self.sector = sector;
}
pub fn get_time(&self) -> Time {
Time::from((self.minute.clone(), self.second.clone(), self.sector.clone()))
}
pub fn get_mode(&self) -> Result<HeaderMode, u8> {
match self.mode {
0 => Ok(HeaderMode::Mode0),

View File

@ -0,0 +1,15 @@
use cdtypes::types::{sector::*, time::Time};
pub fn create_xa_data_for_data(lba: usize, 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])
}

View File

@ -1,5 +1,6 @@
use super::{file_writer::SectorWriter, types::{CDDesc, Error}};
use super::{file_writer::{Sector, SectorWriter}, types::{CDDesc, Error}};
pub mod psx;
pub mod builder;
pub type EncoderFunction = fn(CDDesc, &mut dyn SectorWriter) -> Result<(), Error>;

View File

@ -1,5 +1,18 @@
use super::{SectorWriter, {CDDesc, Error}};
use super::{*, Sector, SectorWriter, {CDDesc, Error}};
use super::super::types::{layout::Layout, SystemArea};
pub fn encode_psx_image(cd_desc: CDDesc, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
for element in cd_desc.get_memory_layout() {
match element {
Layout::SystemArea(system_area) => process_system_area(&system_area.borrow(), sec_writer)?,
_ => ()
}
}
pub fn encode_psx_image(_: CDDesc, _: &mut dyn SectorWriter) -> Result<(), Error> {
Err(Error::not_implemented("encode_psx_image"))
}
fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
sec_writer.write(Sector::CDXAData(builder::create_xa_data_zero(system_area.properties.lba)))
}

View File

@ -1,5 +1,5 @@
use std::io::Write;
use super::{Error, SectorWriter};
use super::{Error, Sector, SectorWriter};
pub struct BinCueWriter {
_bin_out: std::boxed::Box<dyn Write>,
@ -13,10 +13,16 @@ impl BinCueWriter {
}
impl SectorWriter for BinCueWriter {
fn write(&mut self) -> Result<(), Error> {
self.sector_count += 1;
fn write(&mut self, mut sector: Sector) -> Result<(), Error> {
self.finalize_sector(&mut sector)?;
Err(Error::not_implemented("write for BinCueWriter"))
match sector {
Sector::Empty(_) => Err(Error::not_implemented("Empty sector encoding")),
Sector::Audio(_) => Err(Error::not_implemented("Audio sector encoding")),
Sector::CDData(_) => Err(Error::not_implemented("CD Data sector encoding")),
Sector::CDXAData(_) => Err(Error::not_implemented("CD XA Data sector encoding")),
Sector::CDXAAudio(_) => Err(Error::not_implemented("CD XA Audio sector encoding"))
}
}
fn sector_written_count(&self) -> usize {

View File

@ -1,5 +1,7 @@
pub mod bin_cue;
pub use cdtypes::cd::sector::Sector;
use super::{encoder::EncoderFunction, types::CDDesc};
use bin_cue::BinCueWriter;
use std::path::PathBuf;
@ -10,8 +12,21 @@ pub enum ImageType {
}
pub trait SectorWriter {
fn write(&mut self) -> Result<(), Error>;
fn sector_written_count(&self) -> usize;
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> {