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 "Mixer_private.h" 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h" 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DEFINITIONS 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define TRUE 1 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define FALSE 0 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent FUNCTION MIXSOFT_1ST_D32C31_WRA 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 37d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 38d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katurivoid MixSoft_1St_D32C31_WRA( Mix_1St_Cll_FLOAT_t *pInstance, 39d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri const LVM_FLOAT *src, 40d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT *dst, 41d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 n) 42d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri{ 43d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri char HardMixing = TRUE; 44d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 45d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(n <= 0) return; 46d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 47d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /****************************************************************************** 48d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri SOFT MIXING 49d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *******************************************************************************/ 50d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pInstance->Current != pInstance->Target) 51d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 52d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pInstance->Alpha == 0){ 53d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; 54d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri }else if ((pInstance->Current - pInstance->Target < POINT_ZERO_ONE_DB_FLOAT) && 55d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pInstance->Current - pInstance->Target > -POINT_ZERO_ONE_DB_FLOAT)){ 56d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; /* Difference is not significant anymore. \ 57d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Make them equal. */ 58d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri }else{ 59d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Soft mixing has to be applied */ 60d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri HardMixing = FALSE; 61d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Core_MixSoft_1St_D32C31_WRA(pInstance, src, dst, n); 62d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 63d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 64d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 65d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /****************************************************************************** 66d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri HARD MIXING 67d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *******************************************************************************/ 68d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 69d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (HardMixing){ 70d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pInstance->Target == 0) 71d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LoadConst_Float(0, dst, n); 72d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else if ((pInstance->Target) == 1.0f){ 73d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (src != dst) 74d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Copy_Float((LVM_FLOAT*)src, (LVM_FLOAT*)dst, (LVM_INT16)(n)); 75d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 76d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 77d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Mult3s_Float(src, pInstance->Current, dst, n); 78d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 79d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 80d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /****************************************************************************** 81d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri CALL BACK 82d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *******************************************************************************/ 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 84d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pInstance->CallbackSet){ 85d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if ((pInstance->Current - pInstance->Target < POINT_ZERO_ONE_DB_FLOAT) && 86d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pInstance->Current - pInstance->Target > -POINT_ZERO_ONE_DB_FLOAT)){ 87d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current = pInstance->Target; /* Difference is not significant anymore. \ 88d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Make them equal. */ 89d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->CallbackSet = FALSE; 90d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pInstance->pCallBack != 0){ 91d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (*pInstance->pCallBack) ( pInstance->pCallbackHandle, 92d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->pGeneralPurpose, 93d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->CallbackParam ); 94d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 95d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 96d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 97d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri} 98d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MixSoft_1St_D32C31_WRA( Mix_1St_Cll_t *pInstance, 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT32 *src, 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n) 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent char HardMixing = TRUE; 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(n<=0) return; 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /****************************************************************************** 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent SOFT MIXING 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *******************************************************************************/ 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Current != pInstance->Target) 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->Alpha == 0){ 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }else if ((pInstance->Current-pInstance->Target <POINT_ZERO_ONE_DB)&& 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Current-pInstance->Target > -POINT_ZERO_ONE_DB)){ 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; /* Difference is not significant anymore. Make them equal. */ 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }else{ 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Soft mixing has to be applied */ 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent HardMixing = FALSE; 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Core_MixSoft_1St_D32C31_WRA( pInstance, src, dst, n); 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /****************************************************************************** 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent HARD MIXING 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *******************************************************************************/ 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (HardMixing){ 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Target == 0) 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LoadConst_32(0, dst, n); 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else if ((pInstance->Target>>16) == 0x7FFF){ 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (src != dst) 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Copy_16((LVM_INT16*)src, (LVM_INT16*)dst, (LVM_INT16)(n * 2)); 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Mult3s_32x16( src, (LVM_INT16)(pInstance->Current>>16), dst, n ); 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /****************************************************************************** 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CALL BACK 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *******************************************************************************/ 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->CallbackSet){ 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Current-pInstance->Target <POINT_ZERO_ONE_DB)&& 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Current-pInstance->Target > -POINT_ZERO_ONE_DB)){ 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current = pInstance->Target; /* Difference is not significant anymore. Make them equal. */ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->CallbackSet = FALSE; 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->pCallBack != 0){ 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (*pInstance->pCallBack) ( pInstance->pCallbackHandle, pInstance->pGeneralPurpose,pInstance->CallbackParam ); 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 155d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/ 157