diff options
-rwxr-xr-x | modules/audio_remote_submix/audio_hw.cpp | 18 |
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 b24608f2..37562742 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); |