use std::path::PathBuf;
use maudio::{
audio::{formats::SampleBuffer, sample_rate::SampleRate},
data_source::sources::pcm_ring_buffer::PcmRingBuffer,
engine::{engine_builder::EngineBuilder, EngineOps},
sound::sound_builder::SoundBuilder,
MaResult,
};
fn main() -> MaResult<()> {
let channels = 2;
let chunk_frames = 128;
let ring_capacity = 1024;
let path = PathBuf::from(concat!(
env!("CARGO_MANIFEST_DIR"),
"/../maudio-sys/native/miniaudio/data/16-44100-stereo.flac"
));
let engine = EngineBuilder::new()
.no_device(channels, SampleRate::Sr48000)
.build()?;
let mut sound = SoundBuilder::new(&engine).file_path(&path).build()?;
sound.play_sound()?;
let (mut send, mut recv) = PcmRingBuffer::new_f32(ring_capacity, 2)?;
let mut consume_buf = SampleBuffer::<f32>::new_zeroed(chunk_frames, channels)?;
let mut total_from_engine = 0;
let mut total_into_ring = 0;
let mut total_from_ring = 0;
for i in 0..20 {
let written =
send.write_with(100, |slice| engine.read_pcm_frames_into(slice).unwrap_or(0))?;
total_from_engine += written;
total_into_ring += written;
if i % 2 == 1 {
let read = recv.read(&mut consume_buf)?;
total_from_ring += read;
println!(
"iteration {i:02}: wrote {written:3} frames into ring, read {read:3} frames out"
);
} else {
println!("iteration {i:02}: wrote {written:3} frames into ring");
}
}
loop {
let read = recv.read(&mut consume_buf)?;
if read == 0 {
break;
}
total_from_ring += read;
println!("drain: read {read} more frames");
}
println!("----------------------------------");
println!("total frames read from engine: {total_from_engine}");
println!("total frames written to ring: {total_into_ring}");
println!("total frames read from ring: {total_from_ring}");
Ok(())
}