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 "LVM_Macros.h" 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "ScalarArithmetic.h" 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent FUNCTION LVCore_MIXSOFT_1ST_D16C31_WRA 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 29d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 30d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katurivoid LVC_Core_MixSoft_1St_D16C31_WRA( LVMixer3_FLOAT_st *ptrInstance, 31d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri const LVM_FLOAT *src, 32d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT *dst, 33d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 n) 34d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri{ 35d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 OutLoop; 36d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 InLoop; 37d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 ii; 38d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Mix_Private_FLOAT_st *pInstance=(Mix_Private_FLOAT_st *)(ptrInstance->PrivateParams); 39d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Delta= (LVM_FLOAT)pInstance->Delta; 40d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Current = (LVM_FLOAT)pInstance->Current; 41d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Target= (LVM_FLOAT)pInstance->Target; 42d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Temp; 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 44d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri InLoop = (LVM_INT16)(n >> 2); /* Process per 4 samples */ 45d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri OutLoop = (LVM_INT16)(n - (InLoop << 2)); 46d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 47d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(Current<Target){ 48d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (OutLoop){ 49d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 50d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = Current + Delta; 51d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Temp > 1.0f) 52d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = 1.0f; 53d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else if (Temp < -1.0f) 54d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = -1.0f; 55d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 56d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current=Temp; 57d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Current > Target) 58d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current = Target; 59d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 60d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (ii = OutLoop; ii != 0; ii--){ 61d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * (LVM_FLOAT)Current)); 62d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 63d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 64d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 65d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (ii = InLoop; ii != 0; ii--){ 66d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 67d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = Current + Delta; 68d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 69d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Temp > 1.0f) 70d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = 1.0f; 71d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else if (Temp < -1.0f) 72d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = -1.0f; 73d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 74d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current=Temp; 75d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Current > Target) 76d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current = Target; 77d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 78d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current) ); 79d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current) ); 80d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current) ); 81d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current) ); 82d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 83d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 84d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else{ 85d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (OutLoop){ 86d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current -= Delta; 87d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Current < Target) 88d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current = Target; 89d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 90d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (ii = OutLoop; ii != 0; ii--){ 91d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current)); 92d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 93d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 94d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 95d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (ii = InLoop; ii != 0; ii--){ 96d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current -= Delta; 97d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (Current < Target) 98d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Current = Target; 99d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 100d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current)); 101d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current)); 102d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current)); 103d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri *(dst++) = (((LVM_FLOAT)*(src++) * Current)); 104d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 105d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 106d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pInstance->Current=Current; 107d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri} 108d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_Core_MixSoft_1St_D16C31_WRA( LVMixer3_st *ptrInstance, 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *src, 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n) 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 OutLoop; 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 InLoop; 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 CurrentShort; 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 ii; 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Mix_Private_st *pInstance=(Mix_Private_st *)(ptrInstance->PrivateParams); 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Delta=pInstance->Delta; 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Current=pInstance->Current; 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Target=pInstance->Target; 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Temp; 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent InLoop = (LVM_INT16)(n >> 2); /* Process per 4 samples */ 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent OutLoop = (LVM_INT16)(n - (InLoop << 2)); 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(Current<Target){ 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (OutLoop){ 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(Current,Delta,Temp); /* Q31 + Q31 into Q31*/ 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current=Temp; 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (Current > Target) 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current = Target; 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShort = (LVM_INT16)(Current>>16); /* From Q31 to Q15*/ 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = OutLoop; ii != 0; ii--){ 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); /* Q15*Q15>>15 into Q15 */ 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = InLoop; ii != 0; ii--){ 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(Current,Delta,Temp); /* Q31 + Q31 into Q31*/ 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current=Temp; 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (Current > Target) 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current = Target; 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShort = (LVM_INT16)(Current>>16); /* From Q31 to Q15*/ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); /* Q15*Q15>>15 into Q15 */ 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else{ 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (OutLoop){ 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current -= Delta; /* Q31 + Q31 into Q31*/ 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (Current < Target) 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current = Target; 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShort = (LVM_INT16)(Current>>16); /* From Q31 to Q15*/ 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = OutLoop; ii != 0; ii--){ 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); /* Q15*Q15>>15 into Q15 */ 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = InLoop; ii != 0; ii--){ 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current -= Delta; /* Q31 + Q31 into Q31*/ 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (Current < Target) 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current = Target; 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShort = (LVM_INT16)(Current>>16); /* From Q31 to Q15*/ 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); /* Q15*Q15>>15 into Q15 */ 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShort)>>15); 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Current=Current; 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 183d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/ 185