This commit is contained in:
jaby 2024-11-19 19:14:19 +00:00
parent eaff234841
commit c4a7fbe441
2 changed files with 12 additions and 8 deletions

View File

@ -26,12 +26,16 @@ pub fn audio_conversion_settings(arguments: &Arguments) -> Settings {
} }
pub fn encode(input: I16Samples, output: &mut dyn Write, arguments: &Arguments) -> Result<(), Error> { pub fn encode(input: I16Samples, output: &mut dyn Write, arguments: &Arguments) -> Result<(), Error> {
let mut encoder = xapcm::Encoder::default();
let (samples_per_block, sample_count) = init_values(&input, arguments); let (samples_per_block, sample_count) = init_values(&input, arguments);
for (sectors, sampled_id) in (0..sample_count).step_by(samples_per_block).enumerate() { for (sector, iteration) in (0..sample_count).step_by(samples_per_block).enumerate() {
let slice = &input[sampled_id..]; let mut block = [0u8; 0x914];
let slice = &input[sector..(sector + samples_per_block)];
print!("\rIteration: {}; Sample: {}", iteration, sampled_id); encoder.encode_xa(slice, (sample_count - sector) as i32, &mut block, arguments)?;
print!("\rSector: {}; Sample_id: {}", sector, iteration);
} }
println!(); println!();
Err(Error::not_implemented("XA conversion")) Err(Error::not_implemented("XA conversion"))

View File

@ -11,28 +11,28 @@ impl Encoder {
const FILTER_K1: [i16; 5] = [0, 60, 115, 98, 122]; const FILTER_K1: [i16; 5] = [0, 60, 115, 98, 122];
const FILTER_K2: [i16; 5] = [0, 0, -52, -55, -60]; const FILTER_K2: [i16; 5] = [0, 0, -52, -55, -60];
pub fn encode_xa(&mut self, samples: &[i16], sample_limit: i32, data: &mut [u8], args: Arguments) -> Result<(), Error> { pub fn encode_xa(&mut self, samples: &[i16], sample_limit: i32, data: &mut [u8], args: &Arguments) -> Result<(), Error> {
const SHIFT_RANGE_4BPS: i32 = 12; const SHIFT_RANGE_4BPS: i32 = 12;
const SHIFT_RANGE_8BPS: i32 = 8; const SHIFT_RANGE_8BPS: i32 = 8;
let channels = [&mut self.left, &mut self.right]; let channels = [&mut self.left, &mut self.right];
match args.sample_depth { match args.sample_depth {
SampleDepth::Normal => { SampleDepth::Normal => {
let offset = if args.orality == Orality::Stereo {&STEREO_4BIT} else {&MONO_4BIT}; let (modulo, offset) = if args.orality == Orality::Stereo {(2, &STEREO_4BIT)} else {(1, &MONO_4BIT)};
let (first_offset, second_offset) = offset; let (first_offset, second_offset) = offset;
for (offset_idx, offset_set) in [first_offset, second_offset].iter().enumerate() { for (offset_idx, offset_set) in [first_offset, second_offset].iter().enumerate() {
for (idx, offset) in offset_set.iter().enumerate() { for (idx, offset) in offset_set.iter().enumerate() {
let byte = Self::encode(channels[idx%2], &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 => {
let offset_set = if args.orality == Orality::Stereo {&STEREO_8BIT} else {&MONO_8BIT}; let (modulo, offset_set) = if args.orality == Orality::Stereo {(2, &STEREO_8BIT)} else {(1, &MONO_8BIT)};
for (idx, offset) in offset_set.iter().enumerate() { for (idx, offset) in offset_set.iter().enumerate() {
let byte = Self::encode(channels[idx%2], &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_8BPS)?; 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_8BPS)?;
data[idx] = byte; data[idx] = byte;
data[idx + 4] = byte; data[idx + 4] = byte;
} }