merge in jb-mr1-release history after reset to jb-mr1-dev
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 @@
     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 @@
 
     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 @@
 
     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);