From 6dec9ba5a5c90704567022f68ecddde3d2dfe698 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 29 Apr 2024 20:11:32 -0400 Subject: [PATCH] Add SCD module --- src/lib.rs | 6 ++++++ src/scd.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/scd.rs diff --git a/src/lib.rs b/src/lib.rs index bb5c68d..e4d374d 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -129,3 +129,9 @@ pub const PHYSIS_VERSION: &str = env!("CARGO_PKG_VERSION"); /// Reading ULD files pub mod uld; + +/// Reading SGB files +pub mod sgb; + +/// Reading SCD files +pub mod scd; diff --git a/src/scd.rs b/src/scd.rs new file mode 100644 index 0000000..214c5b8 --- /dev/null +++ b/src/scd.rs @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +use std::io::Cursor; + +use crate::ByteSpan; +use binrw::binrw; +use binrw::BinRead; + +#[binrw] +#[derive(Debug)] +#[brw(little)] +struct ScdHeader { + #[br(count = 4)] + #[bw(pad_size_to = 4)] + #[bw(map = |x : &String | x.as_bytes())] + #[br(map = | x: Vec | String::from_utf8(x).unwrap().trim_matches(char::from(0)).to_string())] + pub file_type: String, + + #[br(count = 4)] + #[bw(pad_size_to = 4)] + #[bw(map = |x : &String | x.as_bytes())] + #[br(map = | x: Vec | String::from_utf8(x).unwrap().trim_matches(char::from(0)).to_string())] + pub sub_type: String, + + version: u32, + endian_type: u32, + alignment_bits: u8, + offset: u16, + datetime: u64, + + #[br(pad_before = 4)] + sound_count: u16, + track_count: u16, + audio_count: u16, + number: u16, + + track_offset: u32, + audio_offset: u32, + layout_offset: u32, + routing_offset: u32, + attribute_offset: u32, + + #[br(pad_after = 2)] + end_of_file_padding_size: u16, +} + +#[derive(Debug)] +pub struct Scd { + +} + +impl Scd { + /// Reads an existing ULD file + pub fn from_existing(buffer: ByteSpan) -> Option { + let mut cursor = Cursor::new(buffer); + let header = ScdHeader::read(&mut cursor).ok()?; + + Some(Scd{}) + } +}