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 #include "LVREV_Private.h"
     24 #include "InstAlloc.h"
     25 
     26 /****************************************************************************************/
     27 /*                                                                                      */
     28 /* FUNCTION:                LVREV_GetMemoryTable                                        */
     29 /*                                                                                      */
     30 /* DESCRIPTION:                                                                         */
     31 /*  This function is used for memory allocation and free. It can be called in           */
     32 /*  two ways:                                                                           */
     33 /*                                                                                      */
     34 /*  hInstance = NULL                Returns the memory requirements                     */
     35 /*  hInstance = Instance handle     Returns the memory requirements and allocated       */
     36 /*                                  base addresses.                                     */
     37 /*                                                                                      */
     38 /*  When this function is called for memory allocation (hInstance=NULL) the memory      */
     39 /*  base address pointers are NULL on return.                                           */
     40 /*                                                                                      */
     41 /*  When the function is called for free (hInstance = Instance Handle) the memory       */
     42 /*  table returns the allocated memory and base addresses used during initialisation.   */
     43 /*                                                                                      */
     44 /* PARAMETERS:                                                                          */
     45 /*  hInstance               Instance Handle                                             */
     46 /*  pMemoryTable            Pointer to an empty memory table                            */
     47 /*  pInstanceParams         Pointer to the instance parameters                          */
     48 /*                                                                                      */
     49 /* RETURNS:                                                                             */
     50 /*  LVREV_Success           Succeeded                                                   */
     51 /*  LVREV_NULLADDRESS       When pMemoryTable is NULL                                   */
     52 /*  LVREV_NULLADDRESS       When requesting memory requirements and pInstanceParams     */
     53 /*                          is NULL                                                     */
     54 /*                                                                                      */
     55 /* NOTES:                                                                               */
     56 /*  1.  This function may be interrupted by the LVREV_Process function                  */
     57 /*                                                                                      */
     58 /****************************************************************************************/
     59 LVREV_ReturnStatus_en LVREV_GetMemoryTable(LVREV_Handle_t           hInstance,
     60                                            LVREV_MemoryTable_st     *pMemoryTable,
     61                                            LVREV_InstanceParams_st  *pInstanceParams)
     62 {
     63 
     64     INST_ALLOC              SlowData;
     65     INST_ALLOC              FastData;
     66     INST_ALLOC              FastCoef;
     67     INST_ALLOC              Temporary;
     68     LVM_INT16               i;
     69     LVM_UINT16              MaxBlockSize;
     70 
     71 
     72     /*
     73      * Check for error conditions
     74      */
     75     /* Check for NULL pointer */
     76     if (pMemoryTable == LVM_NULL)
     77     {
     78         return(LVREV_NULLADDRESS);
     79     }
     80 
     81     /*
     82      * Check all instance parameters are in range
     83      */
     84     if (pInstanceParams != LVM_NULL)
     85     {
     86         /*
     87          * Call for memory allocation, so check the parameters
     88          */
     89         /* Check for a non-zero block size */
     90         if (pInstanceParams->MaxBlockSize == 0)
     91         {
     92             return LVREV_OUTOFRANGE;
     93         }
     94 
     95         /* Check for a valid number of delay lines */
     96         if ((pInstanceParams->NumDelays != LVREV_DELAYLINES_1) &&
     97             (pInstanceParams->NumDelays != LVREV_DELAYLINES_2) &&
     98             (pInstanceParams->NumDelays != LVREV_DELAYLINES_4))
     99         {
    100             return LVREV_OUTOFRANGE;
    101         }
    102     }
    103 
    104     /*
    105      * Initialise the InstAlloc instances
    106      */
    107     InstAlloc_Init(&SlowData,  (void *)LVM_NULL);
    108     InstAlloc_Init(&FastData,  (void *)LVM_NULL);
    109     InstAlloc_Init(&FastCoef,  (void *)LVM_NULL);
    110     InstAlloc_Init(&Temporary, (void *)LVM_NULL);
    111 
    112 
    113     /*
    114      * Fill in the memory table
    115      */
    116     if (hInstance == LVM_NULL)
    117     {
    118         /*
    119          * Check for null pointers
    120          */
    121         if (pInstanceParams == LVM_NULL)
    122         {
    123             return(LVREV_NULLADDRESS);
    124         }
    125 
    126 
    127         /*
    128          * Select the maximum internal block size
    129          */
    130         if(pInstanceParams->NumDelays ==LVREV_DELAYLINES_4)
    131         {
    132             MaxBlockSize = LVREV_MAX_AP3_DELAY;
    133         }
    134         else if(pInstanceParams->NumDelays ==LVREV_DELAYLINES_2)
    135         {
    136             MaxBlockSize = LVREV_MAX_AP1_DELAY;
    137         }
    138         else
    139         {
    140             MaxBlockSize = LVREV_MAX_AP0_DELAY;
    141         }
    142 
    143         if(MaxBlockSize>pInstanceParams->MaxBlockSize)
    144         {
    145             MaxBlockSize=pInstanceParams->MaxBlockSize;
    146         }
    147 
    148 
    149         /*
    150          * Slow data memory
    151          */
    152         InstAlloc_AddMember(&SlowData, sizeof(LVREV_Instance_st));
    153         pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Size         = InstAlloc_GetTotal(&SlowData);
    154         pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Type         = LVM_PERSISTENT_SLOW_DATA;
    155         pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL;
    156 
    157 
    158         /*
    159          * Persistent fast data memory
    160          */
    161         InstAlloc_AddMember(&FastData, sizeof(LVREV_FastData_st));
    162         if(pInstanceParams->NumDelays == LVREV_DELAYLINES_4)
    163         {
    164             InstAlloc_AddMember(&FastData, LVREV_MAX_T3_DELAY  * sizeof(LVM_INT32));
    165             InstAlloc_AddMember(&FastData, LVREV_MAX_T2_DELAY  * sizeof(LVM_INT32));
    166             InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_INT32));
    167             InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_INT32));
    168         }
    169 
    170         if(pInstanceParams->NumDelays == LVREV_DELAYLINES_2)
    171         {
    172             InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_INT32));
    173             InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_INT32));
    174         }
    175 
    176         if(pInstanceParams->NumDelays == LVREV_DELAYLINES_1)
    177         {
    178             InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_INT32));
    179         }
    180 
    181         pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Size         = InstAlloc_GetTotal(&FastData);
    182         pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Type         = LVM_PERSISTENT_FAST_DATA;
    183         pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL;
    184 
    185 
    186         /*
    187          * Persistent fast coefficient memory
    188          */
    189         InstAlloc_AddMember(&FastCoef, sizeof(LVREV_FastCoef_st));
    190         pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Size         = InstAlloc_GetTotal(&FastCoef);
    191         pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Type         = LVM_PERSISTENT_FAST_COEF;
    192         pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL;
    193 
    194 
    195         /*
    196          * Temporary fast memory
    197          */
    198         InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);          /* General purpose scratch memory */
    199         InstAlloc_AddMember(&Temporary, 2*sizeof(LVM_INT32) * MaxBlockSize);        /* Mono->stereo input saved for end mix */
    200 
    201         if(pInstanceParams->NumDelays == LVREV_DELAYLINES_4)
    202         {
    203             for(i=0; i<4; i++)
    204             {
    205                 InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);      /* A Scratch buffer for each delay line */
    206             }
    207         }
    208 
    209         if(pInstanceParams->NumDelays == LVREV_DELAYLINES_2)
    210         {
    211             for(i=0; i<2; i++)
    212             {
    213                 InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);      /* A Scratch buffer for each delay line */
    214             }
    215         }
    216 
    217         if(pInstanceParams->NumDelays == LVREV_DELAYLINES_1)
    218         {
    219             for(i=0; i<1; i++)
    220             {
    221                 InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);      /* A Scratch buffer for each delay line */
    222             }
    223         }
    224 
    225         pMemoryTable->Region[LVM_TEMPORARY_FAST].Size         = InstAlloc_GetTotal(&Temporary);
    226         pMemoryTable->Region[LVM_TEMPORARY_FAST].Type         = LVM_TEMPORARY_FAST;
    227         pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress = LVM_NULL;
    228 
    229     }
    230     else
    231     {
    232         LVREV_Instance_st   *pLVREV_Private = (LVREV_Instance_st *)hInstance;
    233 
    234 
    235         /*
    236          * Read back memory allocation table
    237          */
    238         *pMemoryTable = pLVREV_Private->MemoryTable;
    239     }
    240 
    241 
    242     return(LVREV_SUCCESS);
    243 }
    244 
    245 /* End of file */
    246