19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
173bd45591402b94ed4481ea0ee0a9140840979c84James Dong//#define LOG_NDEBUG 0
189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "VideoEditorBGAudioProcessing"
199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <utils/Log.h>
209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorBGAudioProcessing.h"
219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android {
239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorBGAudioProcessing::VideoEditorBGAudioProcessing() {
253bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("Constructor");
269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mAudVolArrIndex = 0;
289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mDoDucking = 0;
299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mDucking_enable = 0;
309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mDucking_lowVolume = 0;
319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mDucking_threshold = 0;
329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mDuckingFactor = 0;
339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mBTVolLevel = 0;
359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPTVolLevel = 0;
369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mIsSSRCneeded = 0;
389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mChannelConversion = 0;
399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mBTFormat = MONO_16_BIT;
419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mInSampleRate = 8000;
439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mOutSampleRate = 16000;
449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPTChannelCount = 2;
459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mBTChannelCount = 1;
469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
483bd45591402b94ed4481ea0ee0a9140840979c84James DongM4OSA_Int32 VideoEditorBGAudioProcessing::mixAndDuck(
493bd45591402b94ed4481ea0ee0a9140840979c84James Dong        void *primaryTrackBuffer,
503bd45591402b94ed4481ea0ee0a9140840979c84James Dong        void *backgroundTrackBuffer,
513bd45591402b94ed4481ea0ee0a9140840979c84James Dong        void *outBuffer) {
529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
533bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("mixAndDuck: track buffers (primary: 0x%x and background: 0x%x) "
543bd45591402b94ed4481ea0ee0a9140840979c84James Dong            "and out buffer 0x%x",
553bd45591402b94ed4481ea0ee0a9140840979c84James Dong            primaryTrackBuffer, backgroundTrackBuffer, outBuffer);
569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
573bd45591402b94ed4481ea0ee0a9140840979c84James Dong    M4AM_Buffer16* pPrimaryTrack   = (M4AM_Buffer16*)primaryTrackBuffer;
583bd45591402b94ed4481ea0ee0a9140840979c84James Dong    M4AM_Buffer16* pBackgroundTrack = (M4AM_Buffer16*)backgroundTrackBuffer;
593bd45591402b94ed4481ea0ee0a9140840979c84James Dong    M4AM_Buffer16* pMixedOutBuffer  = (M4AM_Buffer16*)outBuffer;
609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Output size if same as PT size
629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pMixedOutBuffer->m_bufferSize = pPrimaryTrack->m_bufferSize;
639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Before mixing, we need to have only PT as out buffer
659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    memcpy((void *)pMixedOutBuffer->m_dataAddress,
669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        (void *)pPrimaryTrack->m_dataAddress, pMixedOutBuffer->m_bufferSize);
679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
683bd45591402b94ed4481ea0ee0a9140840979c84James Dong    // Initialize ducking variables
699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Initially contains the input primary track
703bd45591402b94ed4481ea0ee0a9140840979c84James Dong    M4OSA_Int16 *pPTMdata2 = (M4OSA_Int16*)pMixedOutBuffer->m_dataAddress;
713bd45591402b94ed4481ea0ee0a9140840979c84James Dong
729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Contains BG track processed data(like channel conversion etc..
733bd45591402b94ed4481ea0ee0a9140840979c84James Dong    M4OSA_Int16 *pBTMdata1 = (M4OSA_Int16*) pBackgroundTrack->m_dataAddress;
749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Since we need to give sample count and not buffer size
763bd45591402b94ed4481ea0ee0a9140840979c84James Dong    M4OSA_UInt32 uiPCMsize = pMixedOutBuffer->m_bufferSize / 2 ;
779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if ((mDucking_enable) && (mPTVolLevel != 0.0)) {
793bd45591402b94ed4481ea0ee0a9140840979c84James Dong        M4OSA_Int32 peakDbValue = 0;
803bd45591402b94ed4481ea0ee0a9140840979c84James Dong        M4OSA_Int32 previousDbValue = 0;
813bd45591402b94ed4481ea0ee0a9140840979c84James Dong        M4OSA_Int16 *pPCM16Sample = (M4OSA_Int16*)pPrimaryTrack->m_dataAddress;
823bd45591402b94ed4481ea0ee0a9140840979c84James Dong        const size_t n = pPrimaryTrack->m_bufferSize / sizeof(M4OSA_Int16);
839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
843bd45591402b94ed4481ea0ee0a9140840979c84James Dong        for (size_t loopIndex = 0; loopIndex < n; ++loopIndex) {
859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (pPCM16Sample[loopIndex] >= 0) {
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                peakDbValue = previousDbValue > pPCM16Sample[loopIndex] ?
879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        previousDbValue : pPCM16Sample[loopIndex];
889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                previousDbValue = peakDbValue;
899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            } else {
909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                peakDbValue = previousDbValue > -pPCM16Sample[loopIndex] ?
919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        previousDbValue: -pPCM16Sample[loopIndex];
929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                previousDbValue = peakDbValue;
939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mAudioVolumeArray[mAudVolArrIndex] = getDecibelSound(peakDbValue);
979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
983bd45591402b94ed4481ea0ee0a9140840979c84James Dong        // Check for threshold is done after kProcessingWindowSize cycles
993bd45591402b94ed4481ea0ee0a9140840979c84James Dong        if (mAudVolArrIndex >= kProcessingWindowSize - 1) {
1003bd45591402b94ed4481ea0ee0a9140840979c84James Dong            mDoDucking = isThresholdBreached(
1013bd45591402b94ed4481ea0ee0a9140840979c84James Dong                    mAudioVolumeArray, mAudVolArrIndex, mDucking_threshold);
1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mAudVolArrIndex = 0;
1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        } else {
1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mAudVolArrIndex++;
1069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        //
1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Below logic controls the mixing weightage
1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // for Background and Primary Tracks
1119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // for the duration of window under analysis,
1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // to give fade-out for Background and fade-in for primary
1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Current fading factor is distributed in equal range over
1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // the defined window size.
1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // For a window size = 25
1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // (500 ms (window under analysis) / 20 ms (sample duration))
1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        //
1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if (mDoDucking) {
1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (mDuckingFactor > mDucking_lowVolume) {
1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // FADE OUT BG Track
1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Increment ducking factor in total steps in factor
1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // of low volume steps to reach low volume level
1243bd45591402b94ed4481ea0ee0a9140840979c84James Dong                mDuckingFactor -= mDucking_lowVolume;
1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            } else {
1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mDuckingFactor = mDucking_lowVolume;
1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        } else {
1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (mDuckingFactor < 1.0 ) {
1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // FADE IN BG Track
1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Increment ducking factor in total steps of
1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // low volume factor to reach orig.volume level
1333bd45591402b94ed4481ea0ee0a9140840979c84James Dong                mDuckingFactor += mDucking_lowVolume;
1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            } else {
1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mDuckingFactor = 1.0;
1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } // end if - mDucking_enable
1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1413bd45591402b94ed4481ea0ee0a9140840979c84James Dong    // Mixing logic
1423bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("Out of Ducking analysis uiPCMsize %d %f %f",
1433bd45591402b94ed4481ea0ee0a9140840979c84James Dong            mDoDucking, mDuckingFactor, mBTVolLevel);
1449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    while (uiPCMsize-- > 0) {
1459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Set vol factor for BT and PT
1479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        *pBTMdata1 = (M4OSA_Int16)(*pBTMdata1*mBTVolLevel);
1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        *pPTMdata2 = (M4OSA_Int16)(*pPTMdata2*mPTVolLevel);
1499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Mix the two samples
1519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if (mDoDucking) {
1529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Duck the BG track to ducking factor value before mixing
1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            *pBTMdata1 = (M4OSA_Int16)((*pBTMdata1)*(mDuckingFactor));
1559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // mix as normal case
1579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            *pBTMdata1 = (M4OSA_Int16)(*pBTMdata1 /2 + *pPTMdata2 /2);
1589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        } else {
1599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            *pBTMdata1 = (M4OSA_Int16)((*pBTMdata1)*(mDuckingFactor));
1619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            *pBTMdata1 = (M4OSA_Int16)(*pBTMdata1 /2 + *pPTMdata2 /2);
1629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1643bd45591402b94ed4481ea0ee0a9140840979c84James Dong        M4OSA_Int32 temp;
1659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if (*pBTMdata1 < 0) {
1669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            temp = -(*pBTMdata1) * 2; // bring to original Amplitude level
1679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (temp > 32767) {
1699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                *pBTMdata1 = -32766; // less then max allowed value
1709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            } else {
1719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                *pBTMdata1 = (M4OSA_Int16)(-temp);
1729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        } else {
1749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            temp = (*pBTMdata1) * 2; // bring to original Amplitude level
1759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if ( temp > 32768) {
1769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                *pBTMdata1 = 32767; // less than max allowed value
1779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            } else {
1789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                *pBTMdata1 = (M4OSA_Int16)temp;
1799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pBTMdata1++;
1839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pPTMdata2++;
1849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1853bd45591402b94ed4481ea0ee0a9140840979c84James Dong
1869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    memcpy((void *)pMixedOutBuffer->m_dataAddress,
1879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        (void *)pBackgroundTrack->m_dataAddress,
1889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pBackgroundTrack->m_bufferSize);
1899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1903bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("mixAndDuck: X");
1913bd45591402b94ed4481ea0ee0a9140840979c84James Dong    return M4NO_ERROR;
1929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Int32 VideoEditorBGAudioProcessing::calculateOutResampleBufSize() {
1959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // This already takes care of channel count in mBTBuffer.m_bufferSize
1979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return (mOutSampleRate / mInSampleRate) * mBTBuffer.m_bufferSize;
1989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2003bd45591402b94ed4481ea0ee0a9140840979c84James Dongvoid VideoEditorBGAudioProcessing::setMixParams(
2013bd45591402b94ed4481ea0ee0a9140840979c84James Dong        const AudioMixSettings& setting) {
2023bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("setMixParams");
2033bd45591402b94ed4481ea0ee0a9140840979c84James Dong
2043bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mDucking_enable       = setting.lvInDucking_enable;
2053bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mDucking_lowVolume    = setting.lvInDucking_lowVolume;
2063bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mDucking_threshold    = setting.lvInDucking_threshold;
2073bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mPTVolLevel           = setting.lvPTVolLevel;
2083bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mBTVolLevel           = setting.lvBTVolLevel ;
2093bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mBTChannelCount       = setting.lvBTChannelCount;
2103bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mPTChannelCount       = setting.lvPTChannelCount;
2113bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mBTFormat             = setting.lvBTFormat;
2123bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mInSampleRate         = setting.lvInSampleRate;
2133bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mOutSampleRate        = setting.lvOutSampleRate;
2143bd45591402b94ed4481ea0ee0a9140840979c84James Dong
2153bd45591402b94ed4481ea0ee0a9140840979c84James Dong    // Reset the following params to default values
2169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mAudVolArrIndex       = 0;
2179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mDoDucking            = 0;
2183bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mDuckingFactor        = 1.0;
2193bd45591402b94ed4481ea0ee0a9140840979c84James Dong
2203bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("ducking enable 0x%x lowVolume %f threshold %d "
2213bd45591402b94ed4481ea0ee0a9140840979c84James Dong            "fPTVolLevel %f BTVolLevel %f",
2223bd45591402b94ed4481ea0ee0a9140840979c84James Dong            mDucking_enable, mDucking_lowVolume, mDucking_threshold,
2233bd45591402b94ed4481ea0ee0a9140840979c84James Dong            mPTVolLevel, mPTVolLevel);
2243bd45591402b94ed4481ea0ee0a9140840979c84James Dong
2253bd45591402b94ed4481ea0ee0a9140840979c84James Dong    // Decides if SSRC support is needed for this mixing
2263bd45591402b94ed4481ea0ee0a9140840979c84James Dong    mIsSSRCneeded = (setting.lvInSampleRate != setting.lvOutSampleRate);
2273bd45591402b94ed4481ea0ee0a9140840979c84James Dong    if (setting.lvBTChannelCount != setting.lvPTChannelCount){
2283bd45591402b94ed4481ea0ee0a9140840979c84James Dong        if (setting.lvBTChannelCount == 2){
2293bd45591402b94ed4481ea0ee0a9140840979c84James Dong            mChannelConversion = 1; // convert to MONO
2309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        } else {
2313bd45591402b94ed4481ea0ee0a9140840979c84James Dong            mChannelConversion = 2; // Convert to STEREO
2329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
2339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else {
2343bd45591402b94ed4481ea0ee0a9140840979c84James Dong        mChannelConversion = 0;
2359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
2369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// Fast way to compute 10 * log(value)
2399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Int32 VideoEditorBGAudioProcessing::getDecibelSound(M4OSA_UInt32 value) {
2403bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("getDecibelSound: %ld", value);
2413bd45591402b94ed4481ea0ee0a9140840979c84James Dong
2429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (value <= 0 || value > 0x8000) {
2439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 0;
2449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x4000) { // 32768
2459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 90;
2469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x2000) { // 16384
2479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 84;
2489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x1000) { // 8192
2499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 78;
2509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0800) { // 4028
2519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 72;
2529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0400) { // 2048
2539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 66;
2549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0200) { // 1024
2559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 60;
2569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0100) { // 512
2579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 54;
2589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0080) { // 256
2599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 48;
2609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0040) { // 128
2619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 42;
2629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0020) { // 64
2639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 36;
2649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0010) { // 32
2659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 30;
2669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0008) { // 16
2679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 24;
2689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0007) { // 8
2699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 24;
2709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0003) { // 4
2719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 18;
2729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if (value > 0x0001) { // 2
2739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 12;
2749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else  { // 1
2759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return 6;
2769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
2779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Bool VideoEditorBGAudioProcessing::isThresholdBreached(
2809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_Int32* averageValue,
2819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_Int32 storeCount,
2829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_Int32 thresholdValue) {
2839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2843bd45591402b94ed4481ea0ee0a9140840979c84James Dong    ALOGV("isThresholdBreached");
2853bd45591402b94ed4481ea0ee0a9140840979c84James Dong
2869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int totalValue = 0;
2879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    for (int i = 0; i < storeCount; ++i) {
2889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        totalValue += averageValue[i];
2899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
2909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return (totalValue / storeCount > thresholdValue);
2919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
2929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}//namespace android
294