12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software 32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project 42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License. 72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at 82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software 122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and 152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License. 162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent INCLUDE FILES 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVC_Mixer_Private.h" 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h" 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "ScalarArithmetic.h" 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DEFINITIONS 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define TRUE 1 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define FALSE 0 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent FUNCTION MIXINSOFT_D16C31_SAT 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 36d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 37d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katurivoid LVC_MixInSoft_D16C31_SAT( LVMixer3_1St_FLOAT_st *ptrInstance, 38d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT *src, 39d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT *dst, 40d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 n) 41d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri{ 42d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri char HardMixing = TRUE; 43d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT TargetGain; 44d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Mix_Private_FLOAT_st *pInstance = \ 45d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (Mix_Private_FLOAT_st *)(ptrInstance->MixerStream[0].PrivateParams); 46d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 47d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(n <= 0) return; 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 49d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /****************************************************************************** 50d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri SOFT MIXING 51d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *******************************************************************************/ 52d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pInstance->Current != pInstance->Target) 53d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 54d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pInstance->Delta == 1.0f){ 55d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; 56d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri TargetGain = pInstance->Target; 57d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_SetTarget(&(ptrInstance->MixerStream[0]), TargetGain); 58d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri }else if (Abs_Float(pInstance->Current - pInstance->Target) < pInstance->Delta){ 59d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; /* Difference is not significant anymore. \ 60d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Make them equal. */ 61d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri TargetGain = pInstance->Target; 62d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_SetTarget(&(ptrInstance->MixerStream[0]), TargetGain); 63d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri }else{ 64d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Soft mixing has to be applied */ 65d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri HardMixing = FALSE; 66d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Core_MixInSoft_D16C31_SAT(&(ptrInstance->MixerStream[0]), src, dst, n); 67d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 68d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 69d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 70d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /****************************************************************************** 71d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri HARD MIXING 72d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *******************************************************************************/ 73d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 74d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (HardMixing){ 75d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pInstance->Target != 0){ /* Nothing to do in case Target = 0 */ 76d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if ((pInstance->Target) == 1.0f){ 77d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Add2_Sat_Float(src, dst, n); 78d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 79d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else{ 80d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Mac3s_Sat_Float(src, (pInstance->Target), dst, n); 81d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* In case the LVCore function would have changed the Current value */ 82d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; 83d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 84d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 85d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 86d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 87d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 88d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /****************************************************************************** 89d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri CALL BACK 90d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *******************************************************************************/ 91d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 92d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (ptrInstance->MixerStream[0].CallbackSet){ 93d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Abs_Float(pInstance->Current - pInstance->Target) < pInstance->Delta){ 94d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; /* Difference is not significant anymore. \ 95d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Make them equal. */ 96d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri TargetGain = pInstance->Target; 97d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_SetTarget(ptrInstance->MixerStream, TargetGain); 98d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri ptrInstance->MixerStream[0].CallbackSet = FALSE; 99d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (ptrInstance->MixerStream[0].pCallBack != 0){ 100d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (*ptrInstance->MixerStream[0].pCallBack) ( \ 101d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri ptrInstance->MixerStream[0].pCallbackHandle, 102d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri ptrInstance->MixerStream[0].pGeneralPurpose, 103d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri ptrInstance->MixerStream[0].CallbackParam ); 104d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 105d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 106d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 107d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 108d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri} 109d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_MixInSoft_D16C31_SAT( LVMixer3_1St_st *ptrInstance, 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *src, 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n) 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent char HardMixing = TRUE; 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 TargetGain; 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Mix_Private_st *pInstance=(Mix_Private_st *)(ptrInstance->MixerStream[0].PrivateParams); 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(n<=0) return; 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /****************************************************************************** 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent SOFT MIXING 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *******************************************************************************/ 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Current != pInstance->Target) 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->Delta == 0x7FFFFFFF){ 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent TargetGain=pInstance->Target>>(16-pInstance->Shift); // TargetGain in Q16.15 format 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&(ptrInstance->MixerStream[0]),TargetGain); 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }else if (Abs_32(pInstance->Current-pInstance->Target) < pInstance->Delta){ 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; /* Difference is not significant anymore. Make them equal. */ 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent TargetGain=pInstance->Target>>(16-pInstance->Shift); // TargetGain in Q16.15 format 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&(ptrInstance->MixerStream[0]),TargetGain); 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }else{ 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Soft mixing has to be applied */ 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent HardMixing = FALSE; 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->Shift!=0){ 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Shift_Sat_v16xv16 ((LVM_INT16)pInstance->Shift,src,src,n); 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Core_MixInSoft_D16C31_SAT( &(ptrInstance->MixerStream[0]), src, dst, n); 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Core_MixInSoft_D16C31_SAT( &(ptrInstance->MixerStream[0]), src, dst, n); 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /****************************************************************************** 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent HARD MIXING 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *******************************************************************************/ 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (HardMixing){ 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Target != 0){ /* Nothing to do in case Target = 0 */ 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Target>>16) == 0x7FFF){ 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->Shift!=0) 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Shift_Sat_v16xv16 ((LVM_INT16)pInstance->Shift,src,src,n); 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Add2_Sat_16x16( src, dst, n ); 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else{ 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->Shift!=0) 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Shift_Sat_v16xv16 ((LVM_INT16)pInstance->Shift,src,src,n); 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Mac3s_Sat_16x16(src,(LVM_INT16)(pInstance->Target>>16),dst,n); 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; /* In case the LVCore function would have changed the Current value */ 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /****************************************************************************** 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CALL BACK 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *******************************************************************************/ 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (ptrInstance->MixerStream[0].CallbackSet){ 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (Abs_32(pInstance->Current-pInstance->Target) < pInstance->Delta){ 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; /* Difference is not significant anymore. Make them equal. */ 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent TargetGain=pInstance->Target>>(16-pInstance->Shift); // TargetGain in Q16.15 format 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(ptrInstance->MixerStream,TargetGain); 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ptrInstance->MixerStream[0].CallbackSet = FALSE; 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (ptrInstance->MixerStream[0].pCallBack != 0){ 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (*ptrInstance->MixerStream[0].pCallBack) ( ptrInstance->MixerStream[0].pCallbackHandle, ptrInstance->MixerStream[0].pGeneralPurpose,ptrInstance->MixerStream[0].CallbackParam ); 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 184d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/ 186