bug 7253033 clean up before closing an output

An output can only be closed if there is no lock contention that
 prevents ThreadBase::exit() from being blocked. If an output
 device is waiting for an operation to complete (here a write
 in the remote_submix module, because the pipe is full), signal
 the module that it's entering the "exiting" state.

Change-Id: I8248add60da543e90c25a4c809866cdb26255651
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 9689654..1388671 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1163,6 +1163,8 @@
 void AudioFlinger::ThreadBase::exit()
 {
     ALOGV("ThreadBase::exit");
+    // do any cleanup required for exit to succeed
+    preExit();
     {
         // This lock prevents the following race in thread (uniprocessor for illustration):
         //  if (!exitPending()) {
@@ -1694,6 +1696,15 @@
     run(mName, ANDROID_PRIORITY_URGENT_AUDIO);
 }
 
+// ThreadBase virtuals
+void AudioFlinger::PlaybackThread::preExit()
+{
+    ALOGV("  preExit()");
+    // 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
+    mOutput->stream->common.set_parameters(&mOutput->stream->common, "exiting=1");
+}
+
 // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
         const sp<AudioFlinger::Client>& client,