Revert recent r_submix patches

Revert "r_submix: Fix logspam on pipe corruption"
This reverts commit ab5b51838c.
Revert "r_submix: Use intermediate pipe in non-blocking mode"
This reverts commit 1df8a0039f.

Reason: breaks Android Auto projected mode

Bug: 74142786
Test: with Android Auto head unit simulator
Change-Id: I8e1bc146a131cb5b1ab88cf242b03a6b02a84339
This commit is contained in:
Mikhail Naganov 2018-03-05 12:24:45 -08:00
parent ab5b51838c
commit 16ad46ef48
2 changed files with 38 additions and 20 deletions

View file

@ -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);

View file

@ -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";