sound: track audio api's use of u32 for sample data Change-Id: I2496828ac69f24771d1938ccb27ae6e75f66f90b
diff --git a/apps/rust/sound/sound.rs b/apps/rust/sound/sound.rs index 24d2874..4fad4b7 100644 --- a/apps/rust/sound/sound.rs +++ b/apps/rust/sound/sound.rs
@@ -6,6 +6,7 @@ #![no_std] #![no_main] +use core::mem::size_of; use libcantrip::sdk_init; use log::{error, info, trace}; use log::{set_max_level, LevelFilter}; @@ -14,6 +15,9 @@ // NB: must match what the model uses; no way to get this out (yet) const ENCODER_INPUT_DATA_SIZE: usize = 640; +// Input data region size in audio sample units. +const ENCODER_INPUT_DATA_SAMPLES: usize = ENCODER_INPUT_DATA_SIZE / size_of::<u32>(); + // Audio is recorded at 1MHz const RECORD_FREQ_HZ: usize = 1_000_000; // 1MHz @@ -27,7 +31,7 @@ }; } -fn sdk_audio_record(data: &mut [u8]) -> Result<usize, SDKError> { +fn sdk_audio_record(data: &mut [u32]) -> Result<usize, SDKError> { sdk_audio_record_start( /*rate=*/ RECORD_FREQ_HZ, /*buffer_size=*/ ENCODER_INPUT_DATA_SIZE, @@ -35,18 +39,17 @@ ) .expect("sdk_audio_record_start"); - fn is_silence(data: &[u8]) -> bool { - // All-zero's is silence... - data.iter().all(|&x| x == 0) - } + // Works only for renode where zero's are returned after the + // input file data are exhausted. + fn is_silence(data: &[u32]) -> bool { data.iter().all(|&x| x == 0) } loop { - let mut total_count: usize = 0; - while total_count < data.len() { - let data_count = sdk_audio_record_collect(&mut data[total_count..]) + let mut total_samples: usize = 0; + while total_samples < data.len() { + let sample_count = sdk_audio_record_collect(&mut data[total_samples..]) .expect("sdk_audio_record_collect"); - trace!("collected {data_count} bytes of audio data"); - total_count += data_count; - if total_count < data.len() { + trace!("collected {sample_count} samples of audio data"); + total_samples += sample_count; + if sample_count < data.len() { sleep(10); } } @@ -83,18 +86,20 @@ loop { if !model_running { - let mut audio_data: [u8; ENCODER_INPUT_DATA_SIZE] = [0u8; ENCODER_INPUT_DATA_SIZE]; // XXX MaybeUninit - let data_count = sdk_audio_record(&mut audio_data).expect("sdk_audio_record"); - if data_count > 0 { + let mut audio_data: [u32; ENCODER_INPUT_DATA_SAMPLES] = + [0u32; ENCODER_INPUT_DATA_SAMPLES]; // XXX MaybeUninit + let sample_count = sdk_audio_record(&mut audio_data).expect("sdk_audio_record"); + if sample_count > 0 { // Write raw i2s data to the model's input data region. // TODO(sleffler): bypass app when data format is compatible w/ model input? - sdk_model_get_input_params(model_name).expect("sdk_model_get_input_params"); // XXX force model load - info!("input {:x?}", &audio_data[..data_count]); - match sdk_model_set_input( - model_id, - /*input_data_offset=*/ 0, - &audio_data[..data_count], - ) { + // NB: sdk_model_get_input_params loads the model if needed + sdk_model_get_input_params(model_name).expect("sdk_model_get_input_params"); + match sdk_model_set_input(model_id, /*input_data_offset=*/ 0, unsafe { + core::slice::from_raw_parts( + (&audio_data[..sample_count]).as_ptr() as _, // XXX + sample_count * size_of::<u32>(), + ) + }) { Ok(_) => { // Start the model running, the calls to // sdk_model_output (below) effectively poll for