mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-24 12:34:31 +00:00
Refactor android_audio
This commit does some refactors to android_audio: 1. Makes unused trait function unimplemented!() 2. Replaces match with Ok Bug=b:325930215 Test=play and capture sound on a Pixel device Test=arecord -D hw:0,0 -f dat /tmp/tmp Test=aplay -D hw:0,0 -f dat /tmp/tmp Test=./tools/dev_container Test=cargo build Test=cargo build -F audio_aaudio,libaaudio_stub Test=./tools/run_tests Test=./tools/presubmit Change-Id: Ie983e317f3cbea9c187b34126a4c260de55852cc Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/5632640 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Mu-Le Lee <mulelee@google.com> Reviewed-by: Frederick Mayle <fmayle@google.com> Reviewed-by: Chih-Yang Hsia <paulhsia@chromium.org>
This commit is contained in:
parent
6a64d4078d
commit
6fb22fbab0
1 changed files with 14 additions and 65 deletions
|
@ -6,7 +6,6 @@
|
||||||
mod libaaudio_stub;
|
mod libaaudio_stub;
|
||||||
|
|
||||||
use std::os::raw::c_void;
|
use std::os::raw::c_void;
|
||||||
use std::thread;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
|
@ -130,33 +129,9 @@ struct AndroidAudioStreamCommit {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BufferCommit for AndroidAudioStreamCommit {
|
impl BufferCommit for AndroidAudioStreamCommit {
|
||||||
fn commit(&mut self, nwritten: usize) {
|
fn commit(&mut self, _nwritten: usize) {
|
||||||
match self.direction {
|
// This traits function is never called.
|
||||||
AndroidAudioStreamDirection::Input => {}
|
unimplemented!();
|
||||||
AndroidAudioStreamDirection::Output => {
|
|
||||||
// SAFETY:
|
|
||||||
// The AAudioStream_write reads buffer for nwritten * frame_size bytes
|
|
||||||
// It is safe since nwritten < buffer_size and the buffer.len() == buffer_size *
|
|
||||||
// frame_size
|
|
||||||
let frames_written: i32 = unsafe {
|
|
||||||
AAudioStream_write(
|
|
||||||
self.stream.stream_ptr,
|
|
||||||
self.buffer_ptr as *const c_void,
|
|
||||||
nwritten as i32,
|
|
||||||
0, // this call will not wait.
|
|
||||||
)
|
|
||||||
};
|
|
||||||
if frames_written < 0 {
|
|
||||||
warn!("AAudio stream write failed.");
|
|
||||||
} else if (frames_written as usize) < nwritten {
|
|
||||||
// Currently, the frames unable to write by the AAudio API are dropped.
|
|
||||||
warn!(
|
|
||||||
"Android Audio Stream: Drop {} frames",
|
|
||||||
nwritten - (frames_written as usize)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,24 +228,8 @@ impl AudioStream {
|
||||||
|
|
||||||
impl PlaybackBufferStream for AudioStream {
|
impl PlaybackBufferStream for AudioStream {
|
||||||
fn next_playback_buffer<'b, 's: 'b>(&'s mut self) -> Result<PlaybackBuffer<'b>, BoxError> {
|
fn next_playback_buffer<'b, 's: 'b>(&'s mut self) -> Result<PlaybackBuffer<'b>, BoxError> {
|
||||||
self.total_frames += (self.buffer.len() / self.frame_size) as i32;
|
// This traits function is never called.
|
||||||
let start_time = match self.start_time {
|
unimplemented!();
|
||||||
Some(time) => {
|
|
||||||
thread::sleep(self.next_frame.saturating_duration_since(Instant::now()));
|
|
||||||
time
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
let now = Instant::now();
|
|
||||||
self.start_time = Some(now);
|
|
||||||
now
|
|
||||||
}
|
|
||||||
};
|
|
||||||
self.next_frame = start_time
|
|
||||||
+ Duration::from_millis(self.total_frames as u64 * 1000 / self.frame_rate as u64);
|
|
||||||
Ok(
|
|
||||||
PlaybackBuffer::new(self.frame_size, self.buffer.as_mut(), &mut self.buffer_drop)
|
|
||||||
.map_err(Box::new)?,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,21 +351,13 @@ impl StreamSource for AndroidAudioStreamSource {
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
fn new_playback_stream(
|
fn new_playback_stream(
|
||||||
&mut self,
|
&mut self,
|
||||||
num_channels: usize,
|
_num_channels: usize,
|
||||||
format: SampleFormat,
|
_format: SampleFormat,
|
||||||
frame_rate: u32,
|
_frame_rate: u32,
|
||||||
buffer_size: usize,
|
_buffer_size: usize,
|
||||||
) -> Result<(Box<dyn StreamControl>, Box<dyn PlaybackBufferStream>), BoxError> {
|
) -> Result<(Box<dyn StreamControl>, Box<dyn PlaybackBufferStream>), BoxError> {
|
||||||
match AudioStream::new(
|
// This traits function is never called.
|
||||||
num_channels,
|
unimplemented!();
|
||||||
format,
|
|
||||||
frame_rate,
|
|
||||||
buffer_size,
|
|
||||||
AndroidAudioStreamDirection::Output,
|
|
||||||
) {
|
|
||||||
Ok(audio_stream) => Ok((Box::new(NoopStreamControl::new()), Box::new(audio_stream))),
|
|
||||||
Err(err) => Err(err),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
|
@ -418,16 +369,14 @@ impl StreamSource for AndroidAudioStreamSource {
|
||||||
buffer_size: usize,
|
buffer_size: usize,
|
||||||
_ex: &dyn AudioStreamsExecutor,
|
_ex: &dyn AudioStreamsExecutor,
|
||||||
) -> Result<(Box<dyn StreamControl>, Box<dyn AsyncPlaybackBufferStream>), BoxError> {
|
) -> Result<(Box<dyn StreamControl>, Box<dyn AsyncPlaybackBufferStream>), BoxError> {
|
||||||
match AudioStream::new(
|
let audio_stream = AudioStream::new(
|
||||||
num_channels,
|
num_channels,
|
||||||
format,
|
format,
|
||||||
frame_rate,
|
frame_rate,
|
||||||
buffer_size,
|
buffer_size,
|
||||||
AndroidAudioStreamDirection::Output,
|
AndroidAudioStreamDirection::Output,
|
||||||
) {
|
)?;
|
||||||
Ok(audio_stream) => Ok((Box::new(NoopStreamControl::new()), Box::new(audio_stream))),
|
Ok((Box::new(NoopStreamControl::new()), Box::new(audio_stream)))
|
||||||
Err(err) => Err(err),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
|
|
Loading…
Reference in a new issue