summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Naganov <mnaganov@google.com>2018-03-05 12:24:45 -0800
committerMikhail Naganov <mnaganov@google.com>2018-03-05 20:39:30 +0000
commit16ad46ef48d037635b9a8c890b6c5845fbfaf00c (patch)
tree7a5d1851317daf669a7dce6f87e442c2e0ceeefc
parentab5b51838c94afc60f9979cdde2117930ef90ea9 (diff)
downloadlibhardware-16ad46ef48d037635b9a8c890b6c5845fbfaf00c.tar.gz
Revert recent r_submix patches
Revert "r_submix: Fix logspam on pipe corruption" This reverts commit ab5b51838c94afc60f9979cdde2117930ef90ea9. Revert "r_submix: Use intermediate pipe in non-blocking mode" This reverts commit 1df8a0039ffaa5161e1ecdfda3ae3f7e5c7068c2. Reason: breaks Android Auto projected mode Bug: 74142786 Test: with Android Auto head unit simulator Change-Id: I8e1bc146a131cb5b1ab88cf242b03a6b02a84339
-rw-r--r--modules/audio_remote_submix/audio_hw.cpp37
-rw-r--r--modules/audio_remote_submix/tests/remote_submix_tests.cpp21
2 files changed, 38 insertions, 20 deletions
diff --git a/modules/audio_remote_submix/audio_hw.cpp b/modules/audio_remote_submix/audio_hw.cpp
index e826ac31..8c0c0971 100644
--- a/modules/audio_remote_submix/audio_hw.cpp
+++ b/modules/audio_remote_submix/audio_hw.cpp
@@ -418,8 +418,8 @@ static void submix_audio_device_create_pipe_l(struct submix_audio_device * const
config->format);
const NBAIO_Format offers[1] = {format};
size_t numCounterOffers = 0;
- // Create a MonoPipe with optional blocking set to false.
- MonoPipe* sink = new MonoPipe(buffer_size_frames, format, false /*writeCanBlock*/);
+ // Create a MonoPipe with optional blocking set to true.
+ MonoPipe* sink = new MonoPipe(buffer_size_frames, format, true /*writeCanBlock*/);
// Negotiation between the source and sink cannot fail as the device open operation
// creates both ends of the pipe using the same audio format.
ssize_t index = sink->negotiate(offers, 1, NULL, numCounterOffers);
@@ -714,8 +714,30 @@ static int out_dump(const struct audio_stream *stream, int fd)
static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
{
- (void)stream;
+ int exiting = -1;
+ AudioParameter parms = AudioParameter(String8(kvpairs));
SUBMIX_ALOGV("out_set_parameters() kvpairs='%s'", kvpairs);
+
+ // FIXME this is using hard-coded strings but in the future, this functionality will be
+ // converted to use audio HAL extensions required to support tunneling
+ if ((parms.getInt(String8("exiting"), exiting) == NO_ERROR) && (exiting > 0)) {
+ struct submix_audio_device * const rsxadev =
+ audio_stream_get_submix_stream_out(stream)->dev;
+ pthread_mutex_lock(&rsxadev->lock);
+ { // using the sink
+ sp<MonoPipe> sink =
+ rsxadev->routes[audio_stream_get_submix_stream_out(stream)->route_handle]
+ .rsxSink;
+ if (sink == NULL) {
+ pthread_mutex_unlock(&rsxadev->lock);
+ return 0;
+ }
+
+ ALOGD("out_set_parameters(): shutting down MonoPipe sink");
+ sink->shutdown(true);
+ } // done using the sink
+ pthread_mutex_unlock(&rsxadev->lock);
+ }
return 0;
}
@@ -783,12 +805,12 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
return 0;
}
- // If the write to the sink would block, flush enough frames
+ // If the write to the sink would block when no input stream is present, flush enough frames
// from the pipe to make space to write the most recent data.
{
const size_t availableToWrite = sink->availableToWrite();
sp<MonoPipeReader> source = rsxadev->routes[out->route_handle].rsxSource;
- if (availableToWrite < frames) {
+ if (rsxadev->routes[out->route_handle].input == NULL && 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;
@@ -821,11 +843,6 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
written_frames = 0;
return 0;
- } else if (written_frames == -EIO) {
- // receiving -EIO means that the underlying FIFO has shut itself down
- // due to reader/writer indices corruption. This state is irreversible,
- // so shut down the monopipe. It will be destroyed on the next call to 'write.'
- sink->shutdown(true);
} else {
// write() returned UNDERRUN or WOULD_BLOCK, retry
ALOGE("out_write() write to pipe returned unexpected %zd", written_frames);
diff --git a/modules/audio_remote_submix/tests/remote_submix_tests.cpp b/modules/audio_remote_submix/tests/remote_submix_tests.cpp
index 36650e76..2c01c921 100644
--- a/modules/audio_remote_submix/tests/remote_submix_tests.cpp
+++ b/modules/audio_remote_submix/tests/remote_submix_tests.cpp
@@ -198,16 +198,17 @@ TEST_F(RemoteSubmixTest, OutputDoesNotBlockWhenNoInput) {
}
// Verifies that when input is opened but not reading, writing into an output stream does not block.
-TEST_F(RemoteSubmixTest, OutputDoesNotBlockWhenInputStuck) {
- const char* address = "1";
- audio_stream_out_t* streamOut;
- OpenOutputStream(address, true /*mono*/, 48000, &streamOut);
- audio_stream_in_t* streamIn;
- OpenInputStream(address, true /*mono*/, 48000, &streamIn);
- WriteSomethingIntoStream(streamOut, 1024, 16);
- mDev->close_input_stream(mDev, streamIn);
- mDev->close_output_stream(mDev, streamOut);
-}
+// !!! Currently does not finish because requires setting a parameter from another thread !!!
+// TEST_F(RemoteSubmixTest, OutputDoesNotBlockWhenInputStuck) {
+// const char* address = "1";
+// audio_stream_out_t* streamOut;
+// OpenOutputStream(address, true /*mono*/, 48000, &streamOut);
+// audio_stream_in_t* streamIn;
+// OpenInputStream(address, true /*mono*/, 48000, &streamIn);
+// WriteSomethingIntoStream(streamOut, 1024, 16);
+// mDev->close_input_stream(mDev, streamIn);
+// mDev->close_output_stream(mDev, streamOut);
+// }
TEST_F(RemoteSubmixTest, OutputAndInput) {
const char* address = "1";