From 16ad46ef48d037635b9a8c890b6c5845fbfaf00c Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Mon, 5 Mar 2018 12:24:45 -0800 Subject: [PATCH] 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 --- modules/audio_remote_submix/audio_hw.cpp | 37 ++++++++++++++----- .../tests/remote_submix_tests.cpp | 21 ++++++----- 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 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 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";