summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2020-03-23 17:34:47 -0700
committerEric Laurent <elaurent@google.com>2020-03-23 17:34:47 -0700
commit8349affbf8e47bd9ba633d58a53ab51a4a63c795 (patch)
tree21b05a2f10714d7cff7a9cf2f2d39642f9f67d8f /modules
parent353924555ed8dfdea437d7f5833573963e0755b4 (diff)
audio remote submix: fix write blocked on input standby
Do not block in out_write() when the peer input is in standby to avoid remaining stuck when writing to the blocking mono pipe. Bug: 141878993 Test: atest AudioHostTest#testTwoChannelCapturing Change-Id: Ie92d59529ac1018a6785c3ac31696dcccdbb204a Merged-In: Ie92d59529ac1018a6785c3ac31696dcccdbb204a
Diffstat (limited to 'modules')
-rw-r--r--modules/audio_remote_submix/audio_hw.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/modules/audio_remote_submix/audio_hw.cpp b/modules/audio_remote_submix/audio_hw.cpp
index dda0d0ef..30b96eea 100644
--- a/modules/audio_remote_submix/audio_hw.cpp
+++ b/modules/audio_remote_submix/audio_hw.cpp
@@ -821,12 +821,21 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
return 0;
}
- // If the write to the sink would block when no input stream is present, flush enough frames
+ // If the write to the sink would block, flush enough frames
// from the pipe to make space to write the most recent data.
+ // We DO NOT block if:
+ // - no peer input stream is present
+ // - the peer input is in standby AFTER having been active.
+ // We DO block if:
+ // - the input was never activated to avoid discarding first frames
+ // in the pipe in case capture start was delayed
{
const size_t availableToWrite = sink->availableToWrite();
sp<MonoPipeReader> source = rsxadev->routes[out->route_handle].rsxSource;
- if (rsxadev->routes[out->route_handle].input == NULL && availableToWrite < frames) {
+ const struct submix_stream_in *in = rsxadev->routes[out->route_handle].input;
+ const bool dont_block = (in == NULL)
+ || (in->input_standby && (in->read_counter_frames != 0));
+ if (dont_block && availableToWrite < frames) {
static uint8_t flush_buffer[64];
const size_t flushBufferSizeFrames = sizeof(flush_buffer) / frame_size;
size_t frames_to_flush_from_source = frames - availableToWrite;