Fix XA conversion issue

This commit is contained in:
jaby 2024-12-15 15:53:43 +01:00
parent b8196c8811
commit d33ee87c7a
2 changed files with 15 additions and 6 deletions

View File

@ -21,18 +21,18 @@ pub enum Orality {
pub struct CDAudioSamples { pub struct CDAudioSamples {
samples: Vec::<i16>, samples: Vec::<i16>,
orality: Orality, orality: Orality,
frequency: u32, _frequency: u32,
} }
impl CDAudioSamples { impl CDAudioSamples {
pub fn new(samples: Vec<i16>, channels: usize, frequency: u32) -> Result<CDAudioSamples, Error> { pub fn new(samples: Vec<i16>, channels: usize, _frequency: u32) -> Result<CDAudioSamples, Error> {
let orality = match channels { let orality = match channels {
0 => return Err(Error::from_str("Input file has no audio channels")), 0 => return Err(Error::from_str("Input file has no audio channels")),
1 => Orality::Mono, 1 => Orality::Mono,
2 => Orality::Stereo, 2 => Orality::Stereo,
_ => return Err(Error::from_str("Only Mono and Stereo input are supported")), _ => return Err(Error::from_str("Only Mono and Stereo input are supported")),
}; };
Ok(CDAudioSamples{samples, orality, frequency}) Ok(CDAudioSamples{samples, orality, _frequency})
} }
pub fn samples(&self) -> &Vec::<i16> { pub fn samples(&self) -> &Vec::<i16> {
@ -105,7 +105,7 @@ fn _test_write_wav(audio_samples: CDAudioSamples) -> Result<(), Error> {
Orality::Mono => 1, Orality::Mono => 1,
Orality::Stereo => 2, Orality::Stereo => 2,
}, },
sample_rate: audio_samples.frequency, sample_rate: audio_samples._frequency,
bits_per_sample: 16, bits_per_sample: 16,
sample_format: hound::SampleFormat::Int, sample_format: hound::SampleFormat::Int,
}; };

View File

@ -29,12 +29,21 @@ impl<'a> Encoder<'a> {
} }
let mut sector = [0u8; 0x930]; let mut sector = [0u8; 0x930];
for i in 0..10 {
sector[0x01+i] = 0xFF;
}
sector[0x0F] = 0x02;
sector[0x12] = 0x24 | 0x40; sector[0x12] = 0x24 | 0x40;
sector[0x13] = 1 | 0 | 0; // < TODO: Actually consider settings sector[0x13] = 1 | 0 | 0; // < TODO: Actually consider settings
for i in 0..4 {
sector[0x14+i] = sector[0x10+i];
}
let mut dst = &mut sector[0x18..]; let mut dst = &mut sector[0x18..];
for _ in 0..Self::BLOCKS_PER_SECTOR { for _ in 0..Self::BLOCKS_PER_SECTOR {
if self.source.len() < self.samples_per_block as usize { if self.source.len() < self.samples_per_block as usize {
self.source = &self.source[self.source.len()..];
break; break;
} }
@ -63,7 +72,7 @@ impl<'a> Encoder<'a> {
let byte = Self::encode(channels[idx%modulo], &samples[offset.sample..], sample_limit + offset.sample_limit, offset.pitch, &mut data[offset.data..], offset.data_shift, offset.data_pitch, Self::XA_ADPCM_FILTER_COUNT, SHIFT_RANGE_4BPS)?; let byte = Self::encode(channels[idx%modulo], &samples[offset.sample..], sample_limit + offset.sample_limit, offset.pitch, &mut data[offset.data..], offset.data_shift, offset.data_pitch, Self::XA_ADPCM_FILTER_COUNT, SHIFT_RANGE_4BPS)?;
data[idx + (offset_idx*8)] = byte; data[idx + (offset_idx*8)] = byte;
data[idx + 4 + (offset_idx*8)] = byte; data[idx + 4 + (offset_idx*8)] = byte;
} }
} }
}, },
SampleDepth::High => { SampleDepth::High => {
@ -145,7 +154,7 @@ impl<'a> Encoder<'a> {
return Err(Error::from_text(format!("Sample error exceeds 30bit: {}", sample_error))); return Err(Error::from_text(format!("Sample error exceeds 30bit: {}", sample_error)));
} }
data[(i*data_pitch) as usize] = ((data[(i*pitch) as usize] & nondata_mask) as i32 | (sample_enc << data_shift)) as u8; data[(i*data_pitch) as usize] = ((data[(i*data_pitch) as usize] & nondata_mask) as i32 | (sample_enc << data_shift)) as u8;
out_channel_state.mse += (sample_error as u64*sample_error as u64) as i64; out_channel_state.mse += (sample_error as u64*sample_error as u64) as i64;
out_channel_state.prev2 = out_channel_state.prev1; out_channel_state.prev2 = out_channel_state.prev1;