summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2012-10-30 19:03:22 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2012-10-30 19:03:22 -0700
commit90b0fbd13f97127e29ea565c09b64cc25ab6e9c9 (patch)
tree9d33d0b60b7559b2bf3c46820b5e063683c73665
parent20c7f50cd5d60ee7d76f2f502866187992e7675b (diff)
downloadhardware_libhardware-90b0fbd13f97127e29ea565c09b64cc25ab6e9c9.zip
hardware_libhardware-90b0fbd13f97127e29ea565c09b64cc25ab6e9c9.tar.gz
hardware_libhardware-90b0fbd13f97127e29ea565c09b64cc25ab6e9c9.tar.bz2
Shutdown audio pipe when closing input stream
Writing to the audio pipe for the remote submix is blocking, unless the audio output pipe is in shutdown mode. The playback thread could stay blocked on the write if the input stream has already been closed. The change consists in shutting down the pipe also when the input stream gets closed. When the pipe is in this state, simulate timing in the write operation so we don't drain the output faster than realtime. Bug 7424646 Change-Id: I5feb3be642b0ee7eef10dee0141308684ee9c811
-rwxr-xr-xmodules/audio_remote_submix/audio_hw.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/modules/audio_remote_submix/audio_hw.cpp b/modules/audio_remote_submix/audio_hw.cpp
index b24608f..3756274 100755
--- a/modules/audio_remote_submix/audio_hw.cpp
+++ b/modules/audio_remote_submix/audio_hw.cpp
@@ -233,12 +233,22 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
ssize_t written_frames = 0;
struct submix_stream_out *out = reinterpret_cast<struct submix_stream_out *>(stream);
+ const size_t frame_size = audio_stream_frame_size(&stream->common);
+ const size_t frames = bytes / frame_size;
+
pthread_mutex_lock(&out->dev->lock);
out->dev->output_standby = false;
MonoPipe* sink = out->dev->rsxSink.get();
if (sink != NULL) {
+ if (sink->isShutdown()) {
+ pthread_mutex_unlock(&out->dev->lock);
+ // the pipe has already been shutdown, this buffer will be lost but we must
+ // simulate timing so we don't drain the output faster than realtime
+ usleep(frames * 1000000 / out_get_sample_rate(&stream->common));
+ return bytes;
+ }
sink->incStrong(buffer);
} else {
pthread_mutex_unlock(&out->dev->lock);
@@ -249,8 +259,6 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
pthread_mutex_unlock(&out->dev->lock);
- const size_t frame_size = audio_stream_frame_size(&stream->common);
- const size_t frames = bytes / frame_size;
written_frames = sink->write(buffer, frames);
if (written_frames < 0) {
if (written_frames == (ssize_t)NEGOTIATE) {
@@ -741,6 +749,12 @@ static void adev_close_input_stream(struct audio_hw_device *dev,
pthread_mutex_lock(&rsxadev->lock);
+ MonoPipe* sink = rsxadev->rsxSink.get();
+ if (sink != NULL) {
+ ALOGI("shutdown");
+ sink->shutdown(true);
+ }
+
free(stream);
pthread_mutex_unlock(&rsxadev->lock);