Path: blob/main/audio_streams_conformance_test/src/main.rs
5392 views
// Copyright 2022 The ChromiumOS Authors1// Use of this source code is governed by a BSD-style license that can be2// found in the LICENSE file.34use std::io;5use std::time::Instant;67use audio_streams::*;8use cros_async::Executor;910mod args;11mod error;12mod performance_data;13mod sys;1415use crate::args::*;16use crate::error::Error;17use crate::error::Result;18use crate::performance_data::*;19use crate::sys::create_stream_source_generator as sys_create_stream_source_generators;2021fn create_stream_source_generators(args: &Args) -> Box<dyn StreamSourceGenerator> {22match args.stream_source {23StreamSourceEnum::NoopStream => Box::new(NoopStreamSourceGenerator::new()),24StreamSourceEnum::Sys(stream_source) => {25sys_create_stream_source_generators(stream_source, args)26}27}28}2930async fn run_playback(ex: &Executor, args: &Args) -> Result<PerformanceData> {31let mut data = PerformanceData::default();32let generator: Box<dyn StreamSourceGenerator> = create_stream_source_generators(args);33let num_channels = args.channels;34let format = args.format;35let frame_rate = args.rate;36let buffer_size = args.buffer_frames;37let iterations = args.iterations;3839let mut stream_source = generator.generate().map_err(Error::GenerateStreamSource)?;40let start = Instant::now();41let (_, mut stream) = stream_source42.new_async_playback_stream(num_channels, format, frame_rate, buffer_size, ex)43.map_err(Error::CreateStream)?;44data.cold_start = start.elapsed();45let frame_size = args.format.sample_bytes() * args.channels;4647let start = Instant::now();48let mut frames_played = 0;49for _ in 0..iterations {50let mut stream_buffer = stream51.next_playback_buffer(ex)52.await53.map_err(Error::FetchBuffer)?;54let bytes = stream_buffer55.copy_from(&mut io::repeat(0))56.map_err(Error::WriteBuffer)?;57stream_buffer.commit().await;58frames_played += bytes / frame_size;59data.records60.push(BufferConsumptionRecord::new(frames_played, start.elapsed()));61}62Ok(data)63}6465fn main() -> Result<()> {66let args: Args = argh::from_env();67let ex = Executor::new().expect("Failed to create an executor");68let done = run_playback(&ex, &args);6970match ex.run_until(done) {71Ok(Ok(data)) => {72let report = data.gen_report(args)?;73if args.debug {74data.print_records();75}76if args.json {77println!("{}", serde_json::to_string(&report)?);78} else {79print!("{report}");80}81}82Ok(Err(e)) => eprintln!("{e}"),83Err(e) => eprintln!("Error happened in executor: {e}"),84}85Ok(())86}878889