Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2004-2010 NXP Software
      3  * Copyright (C) 2010 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 /************************************************************************************/
     19 /*                                                                                  */
     20 /*  Includes                                                                        */
     21 /*                                                                                  */
     22 /************************************************************************************/
     23 
     24 #include "LVCS.h"
     25 #include "LVCS_Private.h"
     26 #include "LVCS_Tables.h"
     27 
     28 /****************************************************************************************/
     29 /*                                                                                      */
     30 /* FUNCTION:                LVCS_Memory                                                 */
     31 /*                                                                                      */
     32 /* DESCRIPTION:                                                                         */
     33 /*  This function is used for memory allocation and free. It can be called in           */
     34 /*  two ways:                                                                           */
     35 /*                                                                                      */
     36 /*      hInstance = NULL                Returns the memory requirements                 */
     37 /*      hInstance = Instance handle     Returns the memory requirements and             */
     38 /*                                      allocated base addresses for the instance       */
     39 /*                                                                                      */
     40 /*  When this function is called for memory allocation (hInstance=NULL) it is           */
     41 /*  passed the default capabilities.                                                    */
     42 /*                                                                                      */
     43 /*  When called for memory allocation the memory base address pointers are NULL on      */
     44 /*  return.                                                                             */
     45 /*                                                                                      */
     46 /*  When the function is called for free (hInstance = Instance Handle) the              */
     47 /*  capabilities are ignored and the memory table returns the allocated memory and      */
     48 /*  base addresses used during initialisation.                                          */
     49 /*                                                                                      */
     50 /* PARAMETERS:                                                                          */
     51 /*  hInstance               Instance Handle                                             */
     52 /*  pMemoryTable            Pointer to an empty memory definition table                 */
     53 /*  pCapabilities           Pointer to the default capabilites                          */
     54 /*                                                                                      */
     55 /* RETURNS:                                                                             */
     56 /*  LVCS_Success            Succeeded                                                   */
     57 /*                                                                                      */
     58 /* NOTES:                                                                               */
     59 /*  1.  This function may be interrupted by the LVCS_Process function                   */
     60 /*                                                                                      */
     61 /****************************************************************************************/
     62 
     63 LVCS_ReturnStatus_en LVCS_Memory(LVCS_Handle_t          hInstance,
     64                                  LVCS_MemTab_t          *pMemoryTable,
     65                                  LVCS_Capabilities_t    *pCapabilities)
     66 {
     67 
     68     LVM_UINT32          ScratchSize;
     69     LVCS_Instance_t     *pInstance = (LVCS_Instance_t *)hInstance;
     70 
     71 
     72     /*
     73      * Fill in the memory table
     74      */
     75     if (hInstance == LVM_NULL)
     76     {
     77         /*
     78          * Instance memory
     79          */
     80         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].Size         = (LVM_UINT32)sizeof(LVCS_Instance_t);
     81         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].Type         = LVCS_PERSISTENT;
     82         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL;
     83 
     84         /*
     85          * Data memory
     86          */
     87         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].Size         = (LVM_UINT32)sizeof(LVCS_Data_t);
     88         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].Type         = LVCS_DATA;
     89         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL;
     90 
     91         /*
     92          * Coefficient memory
     93          */
     94         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].Size         = (LVM_UINT32)sizeof(LVCS_Coefficient_t);
     95         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].Type         = LVCS_COEFFICIENT;
     96         pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL;
     97 
     98         /*
     99          * Scratch memory
    100          */
    101 #ifdef BUILD_FLOAT
    102         /* Inplace processing */
    103         ScratchSize = (LVM_UINT32) \
    104                         (LVCS_SCRATCHBUFFERS * sizeof(LVM_FLOAT) * pCapabilities->MaxBlockSize);
    105 #else
    106         ScratchSize = (LVM_UINT32)(LVCS_SCRATCHBUFFERS*sizeof(LVM_INT16)*pCapabilities->MaxBlockSize);     /* Inplace processing */
    107 #endif
    108         pMemoryTable->Region[LVCS_MEMREGION_TEMPORARY_FAST].Size         = ScratchSize;
    109         pMemoryTable->Region[LVCS_MEMREGION_TEMPORARY_FAST].Type         = LVCS_SCRATCH;
    110         pMemoryTable->Region[LVCS_MEMREGION_TEMPORARY_FAST].pBaseAddress = LVM_NULL;
    111     }
    112     else
    113     {
    114         /* Read back memory allocation table */
    115         *pMemoryTable = pInstance->MemoryTable;
    116     }
    117 
    118     return(LVCS_SUCCESS);
    119 }
    120 
    121 
    122 /************************************************************************************/
    123 /*                                                                                  */
    124 /* FUNCTION:                LVCS_Init                                               */
    125 /*                                                                                  */
    126 /* DESCRIPTION:                                                                     */
    127 /*  Create and initialisation function for the Concert Sound module                 */
    128 /*                                                                                  */
    129 /*  This function can be used to create an algorithm instance by calling with       */
    130 /*  hInstance set to LVM_NULL. In this case the algorithm returns the new instance  */
    131 /*  handle.                                                                         */
    132 /*                                                                                  */
    133 /*  This function can be used to force a full re-initialisation of the algorithm    */
    134 /*  by calling with hInstance = Instance Handle. In this case the memory table      */
    135 /*  should be correct for the instance, this can be ensured by calling the function */
    136 /*  LVCS_Memory before calling this function.                                       */
    137 /*                                                                                  */
    138 /* PARAMETERS:                                                                      */
    139 /*  hInstance               Instance handle                                         */
    140 /*  pMemoryTable            Pointer to the memory definition table                  */
    141 /*  pCapabilities           Pointer to the capabilities structure                   */
    142 /*                                                                                  */
    143 /* RETURNS:                                                                         */
    144 /*  LVCS_Success            Initialisation succeeded                                */
    145 /*                                                                                  */
    146 /* NOTES:                                                                           */
    147 /*  1.  The instance handle is the pointer to the base address of the first memory  */
    148 /*      region.                                                                     */
    149 /*  2.  This function must not be interrupted by the LVCS_Process function          */
    150 /*  3.  This function must be called with the same capabilities as used for the     */
    151 /*      call to the memory function                                                 */
    152 /*                                                                                  */
    153 /************************************************************************************/
    154 
    155 LVCS_ReturnStatus_en LVCS_Init(LVCS_Handle_t         *phInstance,
    156                                LVCS_MemTab_t         *pMemoryTable,
    157                                LVCS_Capabilities_t   *pCapabilities)
    158 {
    159 
    160     LVCS_Instance_t                 *pInstance;
    161     LVCS_VolCorrect_t               *pLVCS_VolCorrectTable;
    162 
    163 
    164     /*
    165      * Set the instance handle if not already initialised
    166      */
    167     if (*phInstance == LVM_NULL)
    168     {
    169         *phInstance = (LVCS_Handle_t)pMemoryTable->Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress;
    170     }
    171     pInstance =(LVCS_Instance_t  *)*phInstance;
    172 
    173 
    174     /*
    175      * Save the capabilities in the instance structure
    176      */
    177     pInstance->Capabilities = *pCapabilities;
    178 
    179     /*
    180      * Save the memory table in the instance structure
    181      */
    182     pInstance->MemoryTable = *pMemoryTable;
    183 
    184 
    185     /*
    186      * Set all initial parameters to invalid to force a full initialisation
    187      */
    188     pInstance->Params.OperatingMode  = LVCS_OFF;
    189     pInstance->Params.SpeakerType    = LVCS_SPEAKERTYPE_MAX;
    190     pInstance->OutputDevice          = LVCS_HEADPHONE;
    191     pInstance->Params.SourceFormat   = LVCS_SOURCEMAX;
    192     pInstance->Params.CompressorMode = LVM_MODE_OFF;
    193     pInstance->Params.SampleRate     = LVM_FS_INVALID;
    194     pInstance->Params.EffectLevel    = 0;
    195     pInstance->Params.ReverbLevel    = (LVM_UINT16)0x8000;
    196     pLVCS_VolCorrectTable            = (LVCS_VolCorrect_t*)&LVCS_VolCorrectTable[0];
    197     pInstance->VolCorrect            = pLVCS_VolCorrectTable[0];
    198     pInstance->TransitionGain        = 0;
    199 
    200     /* These current and target values are intialized again in LVCS_Control.c */
    201     LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[0],0,0);
    202     /* These current and target values are intialized again in LVCS_Control.c */
    203     LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[1],0,0);
    204 
    205     /*
    206      * Initialise the bypass variables
    207      */
    208     pInstance->MSTarget0=0;
    209     pInstance->MSTarget1=0;
    210     pInstance->bInOperatingModeTransition          = LVM_FALSE;
    211     pInstance->bTimerDone                        = LVM_FALSE;
    212     pInstance->TimerParams.CallBackParam         = 0;
    213     pInstance->TimerParams.pCallBack             = LVCS_TimerCallBack;
    214     pInstance->TimerParams.pCallbackInstance     = pInstance;
    215     pInstance->TimerParams.pCallBackParams       = LVM_NULL;
    216 
    217     return(LVCS_SUCCESS);
    218 }
    219 
    220