let audio_data: &[u8] = [....]; // Raw Data
let sample_rate = Rate::from_hz(16000);
let data_format = Data16Channel16;
println!("Setup DMA buffer");
// let (_, _, mut tx_buffer, tx_descriptors) = esp_hal::dma_buffers!(0, 4 * 4092);
let mut i2s_buffer = esp_hal::dma_tx_stream_buffer!(4092 * 4, 2048);
let i2s = esp_hal::i2s::master::I2s::new(
peripherals.I2S0,
peripherals.DMA_CH1,
esp_hal::i2s::master::TdmConfig::new_tdm_philips()
.with_sample_rate(sample_rate)
//.with_data_format(esp_hal::i2s::master::DataFormat::Data16Channel16)
//.with_data_format(esp_hal::i2s::master::DataFormat::Data32Channel32)
.with_data_format(data_format)
.with_signal_loopback(true),
)
.unwrap()
.into_async();
let i2s = i2s.with_mclk(peripherals.GPIO19);
let mut idx = 0;
i2s_buffer.push_with(|buf| {
for b in buf.iter_mut() {
*b = audio_data[idx];
idx += 1;
if idx >= audio_data.len() {
idx = 0;
}
}
buf.len()
});
println!("audio start");
es8311.set_output_volume(65).unwrap();
let mut transaction = i2s_tx.write(i2s_buffer).ok().unwrap();
transaction.wait_for_available_async().await.unwrap();
let avail = transaction.available_bytes();
let mut audio_written = 0;
let audio_len = audio_data.len();
while audio_written < audio_len {
if avail > 0 {
let end = if audio_written + avail > audio_len {
audio_len
} else {
audio_written + avail
};
let written = transaction.push(&audio_data[audio_written..end]);
audio_written += written;
}
}
let (_res, _i2s_tx, _i2s_buffer) = transaction.wait_async().await;