Merge "remove dependency on SurfaceTexture::connect()"
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h
index 70f79c6..ef77692 100644
--- a/include/media/AudioRecord.h
+++ b/include/media/AudioRecord.h
@@ -27,6 +27,7 @@
 #include <utils/Errors.h>
 #include <binder/IInterface.h>
 #include <binder/IMemory.h>
+#include <cutils/sched_policy.h>
 #include <utils/threads.h>
 
 #include <system/audio.h>
@@ -393,7 +394,7 @@
     audio_io_handle_t       mInput;
     int                     mSessionId;
     int                     mPreviousPriority;          // before start()
-    int                     mPreviousSchedulingGroup;
+    SchedPolicy             mPreviousSchedulingGroup;
 };
 
 }; // namespace android
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h
index 98b1f3e..639d6d2 100644
--- a/include/media/AudioTrack.h
+++ b/include/media/AudioTrack.h
@@ -28,6 +28,7 @@
 #include <utils/Errors.h>
 #include <binder/IInterface.h>
 #include <binder/IMemory.h>
+#include <cutils/sched_policy.h>
 #include <utils/threads.h>
 
 namespace android {
@@ -536,7 +537,7 @@
     status_t                mRestoreStatus;
     bool                    mIsTimed;
     int                     mPreviousPriority;          // before start()
-    int                     mPreviousSchedulingGroup;
+    SchedPolicy             mPreviousSchedulingGroup;
 };
 
 class TimedAudioTrack : public AudioTrack
diff --git a/media/libeffects/downmix/EffectDownmix.c b/media/libeffects/downmix/EffectDownmix.c
index 5439b87..f37cd5e 100644
--- a/media/libeffects/downmix/EffectDownmix.c
+++ b/media/libeffects/downmix/EffectDownmix.c
@@ -24,6 +24,27 @@
 
 #define MINUS_3_DB_IN_Q19_12 2896 // -3dB = 0.707 * 2^12 = 2896
 
+typedef enum {
+    CHANNEL_MASK_SURROUND = AUDIO_CHANNEL_OUT_SURROUND,
+    CHANNEL_MASK_QUAD_BACK = AUDIO_CHANNEL_OUT_QUAD,
+    // like AUDIO_CHANNEL_OUT_QUAD with *_SIDE_* instead of *_BACK_*, same channel order
+    CHANNEL_MASK_QUAD_SIDE =
+            AUDIO_CHANNEL_OUT_FRONT_LEFT |
+            AUDIO_CHANNEL_OUT_FRONT_RIGHT |
+            AUDIO_CHANNEL_OUT_SIDE_LEFT |
+            AUDIO_CHANNEL_OUT_SIDE_RIGHT,
+    CHANNEL_MASK_5POINT1_BACK = AUDIO_CHANNEL_OUT_5POINT1,
+    // like AUDIO_CHANNEL_OUT_5POINT1 with *_SIDE_* instead of *_BACK_*, same channel order
+    CHANNEL_MASK_5POINT1_SIDE =
+            AUDIO_CHANNEL_OUT_FRONT_LEFT |
+            AUDIO_CHANNEL_OUT_FRONT_RIGHT |
+            AUDIO_CHANNEL_OUT_FRONT_CENTER |
+            AUDIO_CHANNEL_OUT_LOW_FREQUENCY |
+            AUDIO_CHANNEL_OUT_SIDE_LEFT |
+            AUDIO_CHANNEL_OUT_SIDE_RIGHT,
+    CHANNEL_MASK_7POINT1_SIDE_BACK = AUDIO_CHANNEL_OUT_7POINT1,
+} downmix_input_channel_mask_t;
+
 // effect_handle_t interface implementation for downmix effect
 const struct effect_interface_s gDownmixInterface = {
         Downmix_Process,
@@ -236,17 +257,19 @@
 
       case DOWNMIX_TYPE_FOLD:
         // optimize for the common formats
-        switch(pDwmModule->config.inputCfg.channels) {
-        case AUDIO_CHANNEL_OUT_QUAD:
+        switch((downmix_input_channel_mask_t)pDwmModule->config.inputCfg.channels) {
+        case CHANNEL_MASK_QUAD_BACK:
+        case CHANNEL_MASK_QUAD_SIDE:
             Downmix_foldFromQuad(pSrc, pDst, numFrames, accumulate);
             break;
-        case AUDIO_CHANNEL_OUT_SURROUND:
+        case CHANNEL_MASK_SURROUND:
             Downmix_foldFromSurround(pSrc, pDst, numFrames, accumulate);
             break;
-        case AUDIO_CHANNEL_OUT_5POINT1:
+        case CHANNEL_MASK_5POINT1_BACK:
+        case CHANNEL_MASK_5POINT1_SIDE:
             Downmix_foldFrom5Point1(pSrc, pDst, numFrames, accumulate);
             break;
-        case AUDIO_CHANNEL_OUT_7POINT1:
+        case CHANNEL_MASK_7POINT1_SIDE_BACK:
             Downmix_foldFrom7Point1(pSrc, pDst, numFrames, accumulate);
             break;
         default:
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index 950f5c6..c21979b 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -79,7 +79,7 @@
 
 AudioRecord::AudioRecord()
     : mStatus(NO_INIT), mSessionId(0),
-      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
+      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT)
 {
 }
 
@@ -95,7 +95,7 @@
         int notificationFrames,
         int sessionId)
     : mStatus(NO_INIT), mSessionId(0),
-      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
+      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT)
 {
     mStatus = set(inputSource, sampleRate, format, channelMask,
             frameCount, flags, cbf, user, notificationFrames, sessionId);
@@ -342,7 +342,7 @@
                 mCondition.signal();
             } else {
                 mPreviousPriority = getpriority(PRIO_PROCESS, 0);
-                mPreviousSchedulingGroup = androidGetThreadSchedulingGroup(0);
+                get_sched_policy(0, &mPreviousSchedulingGroup);
                 androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
             }
         } else {
@@ -374,7 +374,7 @@
             t->requestExit();
         } else {
             setpriority(PRIO_PROCESS, 0, mPreviousPriority);
-            androidSetThreadSchedulingGroup(0, mPreviousSchedulingGroup);
+            set_sched_policy(0, mPreviousSchedulingGroup);
         }
     }
 
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 9d338f3..b1be8b1 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -84,7 +84,7 @@
     : mStatus(NO_INIT),
       mIsTimed(false),
       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
-      mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
+      mPreviousSchedulingGroup(SP_DEFAULT)
 {
 }
 
@@ -102,7 +102,7 @@
     : mStatus(NO_INIT),
       mIsTimed(false),
       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
-      mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
+      mPreviousSchedulingGroup(SP_DEFAULT)
 {
     mStatus = set(streamType, sampleRate, format, channelMask,
             frameCount, flags, cbf, user, notificationFrames,
@@ -123,7 +123,7 @@
         int sessionId)
     : mStatus(NO_INIT),
       mIsTimed(false),
-      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
+      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT)
 {
     mStatus = set((audio_stream_type_t)streamType, sampleRate, (audio_format_t)format, channelMask,
             frameCount, (audio_output_flags_t)flags, cbf, user, notificationFrames,
@@ -144,7 +144,7 @@
     : mStatus(NO_INIT),
       mIsTimed(false),
       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
-      mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT)
+      mPreviousSchedulingGroup(SP_DEFAULT)
 {
     mStatus = set(streamType, sampleRate, format, channelMask,
             0 /*frameCount*/, flags, cbf, user, notificationFrames,
@@ -378,7 +378,7 @@
             t->resume();
         } else {
             mPreviousPriority = getpriority(PRIO_PROCESS, 0);
-            mPreviousSchedulingGroup = androidGetThreadSchedulingGroup(0);
+            get_sched_policy(0, &mPreviousSchedulingGroup);
             androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
         }
 
@@ -403,7 +403,7 @@
                 t->pause();
             } else {
                 setpriority(PRIO_PROCESS, 0, mPreviousPriority);
-                androidSetThreadSchedulingGroup(0, mPreviousSchedulingGroup);
+                set_sched_policy(0, mPreviousSchedulingGroup);
             }
         }
     }
@@ -436,7 +436,7 @@
             t->pause();
         } else {
             setpriority(PRIO_PROCESS, 0, mPreviousPriority);
-            androidSetThreadSchedulingGroup(0, mPreviousSchedulingGroup);
+            set_sched_policy(0, mPreviousSchedulingGroup);
         }
     }
 
@@ -1402,7 +1402,10 @@
             return true;
         }
     }
-    return mReceiver.processAudioBuffer(this);
+    if (!mReceiver.processAudioBuffer(this)) {
+        pause();
+    }
+    return true;
 }
 
 status_t AudioTrack::AudioTrackThread::readyToRun()