Merge "AAC DRC reference level for mobile is -16dB" into jb-mr1-dev
diff --git a/media/libeffects/lvm/lib/Bass/src/LVDBE_Init.c b/media/libeffects/lvm/lib/Bass/src/LVDBE_Init.c
index 3b3c07c..32c4ce0 100644
--- a/media/libeffects/lvm/lib/Bass/src/LVDBE_Init.c
+++ b/media/libeffects/lvm/lib/Bass/src/LVDBE_Init.c
@@ -232,6 +232,10 @@
     pInstance->pData->AGCInstance.AGC_Gain = pInstance->pData->AGCInstance.AGC_MaxGain;
                                                 /* Default to the bass boost setting */
 
+    // initialize the mixer with some fixes values since otherwise LVDBE_SetVolume ends up
+    // reading uninitialized data
+    pMixer_Instance = &pInstance->pData->BypassVolume;
+    LVC_Mixer_Init(&pMixer_Instance->MixerStream[0],0x00007FFF,0x00007FFF);
 
     /*
      * Initialise the volume
@@ -242,7 +246,6 @@
     pInstance->pData->AGCInstance.Volume = pInstance->pData->AGCInstance.Target;
                                                 /* Initialise as the target */
 
-    pMixer_Instance = &pInstance->pData->BypassVolume;
     MixGain = LVC_Mixer_GetTarget(&pMixer_Instance->MixerStream[0]);
     LVC_Mixer_Init(&pMixer_Instance->MixerStream[0],MixGain,MixGain);
 
diff --git a/media/libeffects/lvm/lib/Eq/src/LVEQNB_Init.c b/media/libeffects/lvm/lib/Eq/src/LVEQNB_Init.c
index e83e515..c4767a8 100644
--- a/media/libeffects/lvm/lib/Eq/src/LVEQNB_Init.c
+++ b/media/libeffects/lvm/lib/Eq/src/LVEQNB_Init.c
@@ -264,6 +264,9 @@
     MemSize = (pCapabilities->MaxBands * sizeof(LVEQNB_BandDef_t));
     pInstance->pBandDefinitions  = (LVEQNB_BandDef_t *)InstAlloc_AddMember(&AllocMem,
                                                                            MemSize);
+    // clear all the bands, setting their gain to 0, otherwise when applying new params,
+    // it will compare against uninitialized values
+    memset(pInstance->pBandDefinitions, 0, MemSize);
     MemSize = (pCapabilities->MaxBands * sizeof(LVEQNB_BiquadType_en));
     pInstance->pBiquadType = (LVEQNB_BiquadType_en *)InstAlloc_AddMember(&AllocMem,
                                                                          MemSize);
diff --git a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
index 2eae7df..d706c2d 100644
--- a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+++ b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
@@ -2737,7 +2737,7 @@
                 outBuffer->s16[i] =
                         clamp16((LVM_INT32)outBuffer->s16[i] + (LVM_INT32)inBuffer->s16[i]);
             }
-        } else {
+        } else if (outBuffer->raw != inBuffer->raw) {
             memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount*sizeof(LVM_INT16)*2);
         }
     }
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 6a35053..76d6447 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -3033,7 +3033,7 @@
                             (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
                     size_t framesWritten =
                             mBytesWritten / audio_stream_frame_size(&mOutput->stream->common);
-                    if (!track->presentationComplete(framesWritten, audioHALFrames)) {
+                    if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
                         // track stays in active list until presentation is complete
                         break;
                     }
@@ -3278,7 +3278,7 @@
                 size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
                 size_t framesWritten =
                         mBytesWritten / audio_stream_frame_size(&mOutput->stream->common);
-                if (track->presentationComplete(framesWritten, audioHALFrames)) {
+                if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
                     if (track->isStopped()) {
                         track->reset();
                     }
@@ -3801,7 +3801,7 @@
                 size_t audioHALFrames = (latency_l() * mSampleRate) / 1000;
                 size_t framesWritten =
                         mBytesWritten / audio_stream_frame_size(&mOutput->stream->common);
-                if (track->presentationComplete(framesWritten, audioHALFrames)) {
+                if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
                     if (track->isStopped()) {
                         track->reset();
                     }
diff --git a/services/camera/libcameraservice/Camera2Client.cpp b/services/camera/libcameraservice/Camera2Client.cpp
index 98332f9..0675400 100644
--- a/services/camera/libcameraservice/Camera2Client.cpp
+++ b/services/camera/libcameraservice/Camera2Client.cpp
@@ -529,15 +529,19 @@
         return NO_ERROR;
     }
 
-    SharedParameters::Lock l(mParameters);
-    switch (l.mParameters.state) {
+    Parameters::State state;
+    {
+        SharedParameters::Lock l(mParameters);
+        state = l.mParameters.state;
+    }
+    switch (state) {
         case Parameters::DISCONNECTED:
         case Parameters::RECORD:
         case Parameters::STILL_CAPTURE:
         case Parameters::VIDEO_SNAPSHOT:
             ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
                     __FUNCTION__, mCameraId,
-                    Parameters::getStateName(l.mParameters.state));
+                    Parameters::getStateName(state));
             return INVALID_OPERATION;
         case Parameters::STOPPED:
         case Parameters::WAITING_FOR_PREVIEW_WINDOW:
@@ -545,10 +549,8 @@
             break;
         case Parameters::PREVIEW:
             // Already running preview - need to stop and create a new stream
-            // TODO: Optimize this so that we don't wait for old stream to drain
-            // before spinning up new stream
             mStreamingProcessor->stopStream();
-            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
+            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
             break;
     }
 
@@ -560,7 +562,9 @@
         return res;
     }
 
-    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
+    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
+        SharedParameters::Lock l(mParameters);
+        l.mParameters.state = state;
         return startPreviewL(l.mParameters, false);
     }