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