Revert recent r_submix patches
Revert "r_submix: Fix logspam on pipe corruption" This reverts commitab5b51838c
. Revert "r_submix: Use intermediate pipe in non-blocking mode" This reverts commit1df8a0039f
. Reason: breaks Android Auto projected mode Bug: 74142786 Test: with Android Auto head unit simulator Change-Id: I8e1bc146a131cb5b1ab88cf242b03a6b02a84339
This commit is contained in:
parent
ab5b51838c
commit
16ad46ef48
2 changed files with 38 additions and 20 deletions
|
@ -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);
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in a new issue