1c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*
2c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2004-2010 NXP Software
3c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2010 The Android Open Source Project
4c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
5c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
6c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * you may not use this file except in compliance with the License.
7c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * You may obtain a copy of the License at
8c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
9c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
10c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
11c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Unless required by applicable law or agreed to in writing, software
12c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
13c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * See the License for the specific language governing permissions and
15c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * limitations under the License.
16c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */
17c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
18c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
19c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
20c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  Includes                                                                            */
21c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
22c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
23c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "LVREV_Private.h"
24c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "InstAlloc.h"
25c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
26c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
27c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
28c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
29c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION:                LVREV_GetInstanceHandle                                     */
30c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
31c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION:                                                                         */
32c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  This function is used to create a LVREV module instance. It returns the created     */
33c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  instance handle through phInstance. All parameters are set to their default,        */
34c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  inactive state.                                                                     */
35c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
36c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS:                                                                          */
37c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  phInstance              pointer to the instance handle                              */
38c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  pMemoryTable            Pointer to the memory definition table                      */
39c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  pInstanceParams         Pointer to the instance parameters                          */
40c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
41c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS:                                                                             */
42c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_SUCCESS           Succeeded                                                   */
43c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_NULLADDRESS       When phInstance or pMemoryTable or pInstanceParams is NULL  */
44c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_NULLADDRESS       When one of the memory regions has a NULL pointer           */
45c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
46c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES:                                                                               */
47c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
48c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
49c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric LaurentLVREV_ReturnStatus_en LVREV_GetInstanceHandle(LVREV_Handle_t            *phInstance,
50c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                              LVREV_MemoryTable_st      *pMemoryTable,
51c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                              LVREV_InstanceParams_st   *pInstanceParams)
52c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{
53c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
54c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    INST_ALLOC              SlowData;
55c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    INST_ALLOC              FastData;
56c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    INST_ALLOC              FastCoef;
57c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    INST_ALLOC              Temporary;
58c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVREV_Instance_st       *pLVREV_Private;
59c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT16               i;
60c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_UINT16              MaxBlockSize;
61c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
62c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
63c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
64c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Check for error conditions
65c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
66c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Check for NULL pointers */
67c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if((phInstance == LVM_NULL) || (pMemoryTable == LVM_NULL) || (pInstanceParams == LVM_NULL))
68c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
69c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return LVREV_NULLADDRESS;
70c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
71c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Check the memory table for NULL pointers */
72c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    for (i = 0; i < LVREV_NR_MEMORY_REGIONS; i++)
73c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
74c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if (pMemoryTable->Region[i].Size!=0)
75c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
76c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            if (pMemoryTable->Region[i].pBaseAddress==LVM_NULL)
77c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            {
78c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                return(LVREV_NULLADDRESS);
79c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            }
80c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
81c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
82c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
83c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
84c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Check all instance parameters are in range
85c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
86c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Check for a non-zero block size */
87c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if (pInstanceParams->MaxBlockSize == 0)
88c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
89c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return LVREV_OUTOFRANGE;
90c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
91c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
92c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Check for a valid number of delay lines */
93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if ((pInstanceParams->NumDelays != LVREV_DELAYLINES_1)&&
94c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        (pInstanceParams->NumDelays != LVREV_DELAYLINES_2)&&
95c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        (pInstanceParams->NumDelays != LVREV_DELAYLINES_4))
96c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
97c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return LVREV_OUTOFRANGE;
98c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
99c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
100c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
101c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Initialise the InstAlloc instances
102c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
103c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    InstAlloc_Init(&SlowData,  pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress);
104c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    InstAlloc_Init(&FastData,  pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress);
105c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    InstAlloc_Init(&FastCoef,  pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress);
106c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    InstAlloc_Init(&Temporary, pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress);
107c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
108c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
109c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Zero all memory regions
110c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
111c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     LoadConst_16(0, (LVM_INT16 *)pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress, (LVM_INT16)((pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Size)/sizeof(LVM_INT16)));
112c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     LoadConst_16(0, (LVM_INT16 *)pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress, (LVM_INT16)((pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Size)/sizeof(LVM_INT16)));
113c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     LoadConst_16(0, (LVM_INT16 *)pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress, (LVM_INT16)((pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Size)/sizeof(LVM_INT16)));
114c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     LoadConst_16(0, (LVM_INT16 *)pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress, (LVM_INT16)((pMemoryTable->Region[LVM_TEMPORARY_FAST].Size)/sizeof(LVM_INT16)));
115c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
116c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
117c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Set the instance handle if not already initialised
118c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
119c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if (*phInstance == LVM_NULL)
120c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
121c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        *phInstance = InstAlloc_AddMember(&SlowData, sizeof(LVREV_Instance_st));
122c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private              =(LVREV_Instance_st *)*phInstance;
124c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->MemoryTable = *pMemoryTable;
125c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
126c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pInstanceParams->NumDelays ==LVREV_DELAYLINES_4)
127c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
128c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MaxBlockSize = LVREV_MAX_AP3_DELAY;
129c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
130c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    else if(pInstanceParams->NumDelays ==LVREV_DELAYLINES_2)
131c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
132c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MaxBlockSize = LVREV_MAX_AP1_DELAY;
133c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
134c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    else
135c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
136c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MaxBlockSize = LVREV_MAX_AP0_DELAY;
137c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
139c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(MaxBlockSize>pInstanceParams->MaxBlockSize)
140c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
141c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MaxBlockSize=pInstanceParams->MaxBlockSize;
142c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
143c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
144c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
145c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
146c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Set the data, coefficient and temporary memory pointers
147c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
148c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->pFastData = InstAlloc_AddMember(&FastData, sizeof(LVREV_FastData_st));                              /* Fast data memory base address */
149c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
150c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pInstanceParams->NumDelays == LVREV_DELAYLINES_4)
151c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
152c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[3]     = InstAlloc_AddMember(&FastData, LVREV_MAX_T3_DELAY  * sizeof(LVM_INT32));
153c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[2]     = InstAlloc_AddMember(&FastData, LVREV_MAX_T2_DELAY  * sizeof(LVM_INT32));
154c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[1]     = InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_INT32));
155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[0]     = InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_INT32));
156c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
157c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        for( i = 0; i < 4; i++)
158c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
159c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            pLVREV_Private->pScratchDelayLine[i] = InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);       /* Scratch for each delay line output */
160c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
161c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
162c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[3]  ,(LVM_INT16)LVREV_MAX_T3_DELAY);
163c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[2]  ,(LVM_INT16)LVREV_MAX_T2_DELAY);
164c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[1]  ,(LVM_INT16)LVREV_MAX_T1_DELAY);
165c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[0]  ,(LVM_INT16)LVREV_MAX_T0_DELAY);
166c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
167c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
168c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pInstanceParams->NumDelays == LVREV_DELAYLINES_2)
169c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
170c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[1]  = InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_INT32));
171c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[0]  = InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_INT32));
172c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
173c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        for( i = 0; i < 2; i++)
174c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
175c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            pLVREV_Private->pScratchDelayLine[i] = InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);       /* Scratch for each delay line output */
176c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
177c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
178c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[1] , (LVM_INT16)LVREV_MAX_T1_DELAY);
179c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[0] , (LVM_INT16)LVREV_MAX_T0_DELAY);
180c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
181c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pInstanceParams->NumDelays == LVREV_DELAYLINES_1)
183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
184c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pDelay_T[0]  = InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_INT32));
185c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
186c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        for( i = 0; i < 1; i++)
187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            pLVREV_Private->pScratchDelayLine[i] = InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);       /* Scratch for each delay line output */
189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
190c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LoadConst_32(0,pLVREV_Private->pDelay_T[0]  , (LVM_INT16)LVREV_MAX_T0_DELAY);
192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* All-pass delay buffer addresses and sizes */
195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->T[0]         = LVREV_MAX_T0_DELAY;
196c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->T[1]         = LVREV_MAX_T1_DELAY;
197c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->T[2]         = LVREV_MAX_T2_DELAY;
198c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->T[3]         = LVREV_MAX_T3_DELAY;
199c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->AB_Selection = 1;       /* Select smoothing A to B */
200c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
201c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
202c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->pFastCoef       = InstAlloc_AddMember(&FastCoef, sizeof(LVREV_FastCoef_st));                        /* Fast coefficient memory base address */
203c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->pScratch        = InstAlloc_AddMember(&Temporary, sizeof(LVM_INT32) * MaxBlockSize);                /* General purpose scratch */
204c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->pInputSave      = InstAlloc_AddMember(&Temporary, 2 * sizeof(LVM_INT32) * MaxBlockSize);            /* Mono->stereo input save for end mix */
205c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LoadConst_32(0, pLVREV_Private->pInputSave, (LVM_INT16)(MaxBlockSize*2));
206c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
207c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
208c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
209c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Save the instance parameters in the instance structure
210c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
211c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->InstanceParams = *pInstanceParams;
212c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
213c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
214c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
215c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Set the parameters to invalid
216c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
217c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->CurrentParams.SampleRate    = LVM_FS_INVALID;
218c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->CurrentParams.OperatingMode = LVM_MODE_DUMMY;
219c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->CurrentParams.SourceFormat  = LVM_SOURCE_DUMMY;
220c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
221c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->bControlPending             = LVM_FALSE;
222c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->bFirstControl               = LVM_TRUE;
223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->bDisableReverb              = LVM_FALSE;
224c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
225c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
226c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
227c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Set mixer parameters
228c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
229c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.CallbackParam2      = 0;
230c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.pCallbackHandle2    = pLVREV_Private;
231c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.pGeneralPurpose2    = LVM_NULL;
232c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.pCallBack2          = BypassMixer_Callback;
233c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.CallbackSet2        = LVM_FALSE;
234c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.Current2            = 0;
235c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.Target2             = 0;
236c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.CallbackParam1      = 0;
237c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.pCallbackHandle1    = LVM_NULL;
238c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.pGeneralPurpose1    = LVM_NULL;
239c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.pCallBack1          = LVM_NULL;
240c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->BypassMixer.CallbackSet1        = LVM_FALSE;
2412d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent    pLVREV_Private->BypassMixer.Current1            = 0x00000000;
2422d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent    pLVREV_Private->BypassMixer.Target1             = 0x00000000;
243c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
244c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->RoomSizeInms                    = 100;  // 100 msec
245c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
246c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
247c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
248c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  Set the output gain mixer parameters
249c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
250c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.CallbackParam      = 0;
251c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.pCallbackHandle    = LVM_NULL;
252c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.pGeneralPurpose    = LVM_NULL;
253c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.pCallBack          = LVM_NULL;
254c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.CallbackSet        = LVM_FALSE;
255c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.Current            = 0x03ffffff;
256c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->GainMixer.Target             = 0x03ffffff;
257c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
258c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
259c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
260c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Set the All-Pass Filter mixers
261c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
262c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    for (i=0; i<4; i++)
263c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
264c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pOffsetA[i] = pLVREV_Private->pDelay_T[i];
265c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->pOffsetB[i] = pLVREV_Private->pDelay_T[i];
266c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Delay tap selection mixer */
267c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].CallbackParam2   = 0;
268c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].pCallbackHandle2 = LVM_NULL;
269c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].pGeneralPurpose2 = LVM_NULL;
270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].pCallBack2       = LVM_NULL;
271c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].CallbackSet2     = LVM_FALSE;
272c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].Current2         = 0;
273c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].Target2          = 0;
274c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].CallbackParam1   = 0;
275c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].pCallbackHandle1 = LVM_NULL;
276c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].pGeneralPurpose1 = LVM_NULL;
277c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].pCallBack1       = LVM_NULL;
278c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].CallbackSet1     = LVM_FALSE;
279c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].Current1         = 0;
280c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_APTaps[i].Target1          = 0x7fffffff;
281c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Feedforward mixer */
282c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].CallbackParam   = 0;
283c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].pCallbackHandle = LVM_NULL;
284c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].pGeneralPurpose = LVM_NULL;
285c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].pCallBack       = LVM_NULL;
286c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].CallbackSet     = LVM_FALSE;
287c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].Current         = 0;
288c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedforward[i].Target          = 0;
289c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Feedback mixer */
290c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].CallbackParam   = 0;
291c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].pCallbackHandle = LVM_NULL;
292c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].pGeneralPurpose = LVM_NULL;
293c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].pCallBack       = LVM_NULL;
294c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].CallbackSet     = LVM_FALSE;
295c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].Current         = 0;
296c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->Mixer_SGFeedback[i].Target          = 0;
297c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Feedback gain mixer */
298c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].CallbackParam    = 0;
299c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].pCallbackHandle  = LVM_NULL;
300c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].pGeneralPurpose  = LVM_NULL;
301c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].pCallBack        = LVM_NULL;
302c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].CallbackSet      = LVM_FALSE;
303c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].Current          = 0;
304c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->FeedbackMixer[i].Target           = 0;
305c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
306c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Delay tap index */
307c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->A_DelaySize[0] = LVREV_MAX_AP0_DELAY;
308c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->B_DelaySize[0] = LVREV_MAX_AP0_DELAY;
309c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->A_DelaySize[1] = LVREV_MAX_AP1_DELAY;
310c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->B_DelaySize[1] = LVREV_MAX_AP1_DELAY;
311c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->A_DelaySize[2] = LVREV_MAX_AP2_DELAY;
312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->B_DelaySize[2] = LVREV_MAX_AP2_DELAY;
313c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->A_DelaySize[3] = LVREV_MAX_AP3_DELAY;
314c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pLVREV_Private->B_DelaySize[3] = LVREV_MAX_AP3_DELAY;
315c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
316c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
317c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVREV_ClearAudioBuffers(*phInstance);
318c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
319c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    return LVREV_SUCCESS;
320c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}
321c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
322c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* End of file */
323