Fix for 3369917 Audio skips at clip edit points

Change-Id: Iba66585cc2e679475d8db529d6113586b58e626e
diff --git a/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp b/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
index 48d43b4..f33bd0a 100755
--- a/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
+++ b/libvideoeditor/lvpp/VideoEditorAudioPlayer.cpp
@@ -48,6 +48,7 @@
     mBGAudioStoryBoardCurrentMediaBeginCutTS = 0;
     mBGAudioStoryBoardCurrentMediaVolumeVal = 0;
     mSeekTimeUs = 0;
+    mSource = NULL;
 }
 
 VideoEditorAudioPlayer::~VideoEditorAudioPlayer() {
@@ -61,9 +62,30 @@
         mAudioProcess = NULL;
     }
 }
+void VideoEditorAudioPlayer::setSource(const sp<MediaSource> &source) {
+    Mutex::Autolock autoLock(mLock);
+    mSource = source;
+    mReachedEOS = false;
+}
+
+sp<MediaSource> VideoEditorAudioPlayer::getSource() {
+    Mutex::Autolock autoLock(mLock);
+    return mSource;
+}
+
+void VideoEditorAudioPlayer::setObserver(AwesomePlayer *observer) {
+    LOGV("setObserver");
+    //CHECK(!mStarted);
+    mObserver = observer;
+}
+
+
+bool VideoEditorAudioPlayer::isStarted() {
+    return mStarted;
+}
 
 status_t VideoEditorAudioPlayer::start(bool sourceAlreadyStarted) {
-
+    Mutex::Autolock autoLock(mLock);
     CHECK(!mStarted);
     CHECK(mSource != NULL);
     LOGV("Start");
@@ -85,11 +107,16 @@
     veAudMixSettings audioMixSettings;
 
     // Pass on the audio ducking parameters
-    audioMixSettings.lvInDucking_threshold = mAudioMixSettings->uiInDucking_threshold;
-    audioMixSettings.lvInDucking_lowVolume = ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0;
-    audioMixSettings.lvInDucking_enable = mAudioMixSettings->bInDucking_enable;
-    audioMixSettings.lvPTVolLevel = ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0;
-    audioMixSettings.lvBTVolLevel = ((M4OSA_Float)mAudioMixSettings->uiAddVolume) /100.0;
+    audioMixSettings.lvInDucking_threshold =
+        mAudioMixSettings->uiInDucking_threshold;
+    audioMixSettings.lvInDucking_lowVolume =
+        ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0;
+    audioMixSettings.lvInDucking_enable =
+        mAudioMixSettings->bInDucking_enable;
+    audioMixSettings.lvPTVolLevel =
+        ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0;
+    audioMixSettings.lvBTVolLevel =
+        ((M4OSA_Float)mAudioMixSettings->uiAddVolume) / 100.0;
     audioMixSettings.lvBTChannelCount = mAudioMixSettings->uiBTChannelCount;
     audioMixSettings.lvPTChannelCount = mAudioMixSettings->uiNbChannels;
 
@@ -306,6 +333,33 @@
     return OK;
 }
 
+void VideoEditorAudioPlayer::resume() {
+
+    veAudMixSettings audioMixSettings;
+
+    // Single audio player is used;
+    // Pass on the audio ducking parameters
+    // which might have changed with new audio source
+    audioMixSettings.lvInDucking_threshold =
+        mAudioMixSettings->uiInDucking_threshold;
+    audioMixSettings.lvInDucking_lowVolume =
+        ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0;
+    audioMixSettings.lvInDucking_enable =
+        mAudioMixSettings->bInDucking_enable;
+    audioMixSettings.lvPTVolLevel =
+        ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0;
+    audioMixSettings.lvBTVolLevel =
+        ((M4OSA_Float)mAudioMixSettings->uiAddVolume) / 100.0;
+    audioMixSettings.lvBTChannelCount = mAudioMixSettings->uiBTChannelCount;
+    audioMixSettings.lvPTChannelCount = mAudioMixSettings->uiNbChannels;
+
+    // Call to Audio mix param setting
+    mAudioProcess->veSetAudioProcessingParams(audioMixSettings);
+
+    //Call the base class
+    AudioPlayer::resume();
+}
+
 void VideoEditorAudioPlayer::reset() {
 
     LOGV("reset");
@@ -336,9 +390,9 @@
     size_t size_remaining = size;
 
     M4OSA_ERR err = M4NO_ERROR;
-    M4AM_Buffer bgFrame = {NULL, 0};
-    M4AM_Buffer mixFrame = {NULL, 0};
-    M4AM_Buffer ptFrame = {NULL, 0};
+    M4AM_Buffer16 bgFrame = {NULL, 0};
+    M4AM_Buffer16 mixFrame = {NULL, 0};
+    M4AM_Buffer16 ptFrame = {NULL, 0};
     int64_t currentSteamTS = 0;
     int64_t startTimeForBT = 0;
     M4OSA_Float fPTVolLevel =
@@ -384,7 +438,11 @@
 
                 mIsFirstBuffer = false;
             } else {
-                status = mSource->read(&mInputBuffer, &options);
+
+                {
+                    Mutex::Autolock autoLock(mLock);
+                    status = mSource->read(&mInputBuffer, &options);
+                }
                 // Data is Primary Track, mix with background track
                 // after reading same size from Background track PCM file
                 if (status == OK)
@@ -395,9 +453,9 @@
                           (int64_t)(mAudioMixSettings->uiAddCts * 1000)) {
 
                         LOGV("VideoEditorAudioPlayer::INSIDE MIXING");
-                        LOGV("Checking %lld <= %lld - %d",
+                        LOGV("Checking %lld <= %lld",
                             mBGAudioPCMFileSeekPoint-mBGAudioPCMFileOriginalSeekPoint,
-                            mBGAudioPCMFileTrimmedLength, len);
+                            mBGAudioPCMFileTrimmedLength);
 
 
                         M4OSA_Void* ptr;