LVREV_ApplyNewSettings.c revision c59c6fd7f859b4010d788db89b8d4d76bbb70e57
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/*     Project::                                                                        */
21/*     $Author: nxp007753 $ */
22/*     $Revision: 1316 $ */
23/*     $Date: 2010-07-23 11:53:24 +0200 (Fri, 23 Jul 2010) $ */
24/*                                                                                      */
25/****************************************************************************************/
26
27/****************************************************************************************/
28/*                                                                                      */
29/*  Includes                                                                            */
30/*                                                                                      */
31/****************************************************************************************/
32#include "LVREV_Private.h"
33#include "Filter.h"
34
35/****************************************************************************************/
36/*                                                                                      */
37/* FUNCTION:                LVREV_ApplyNewSettings                                      */
38/*                                                                                      */
39/* DESCRIPTION:                                                                         */
40/*  Applies the new control parameters                                                  */
41/*                                                                                      */
42/* PARAMETERS:                                                                          */
43/*  pPrivate                Pointer to the instance private parameters                  */
44/*                                                                                      */
45/* RETURNS:                                                                             */
46/*  LVREV_Success           Succeeded                                                   */
47/*  LVREV_NULLADDRESS       When pPrivate is NULL                                       */
48/*                                                                                      */
49/* NOTES:                                                                               */
50/*                                                                                      */
51/****************************************************************************************/
52
53LVREV_ReturnStatus_en LVREV_ApplyNewSettings (LVREV_Instance_st     *pPrivate)
54{
55
56    LVM_Mode_en  OperatingMode;
57    LVM_INT32    NumberOfDelayLines;
58
59
60    /* Check for NULL pointer */
61    if(pPrivate == LVM_NULL)
62    {
63        return LVREV_NULLADDRESS;
64    }
65
66    OperatingMode = pPrivate->NewParams.OperatingMode;
67
68    if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4)
69    {
70        NumberOfDelayLines = 4;
71    }
72    else if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_2)
73    {
74        NumberOfDelayLines = 2;
75    }
76    else
77    {
78        NumberOfDelayLines = 1;
79    }
80
81    /*
82     * Update the high pass filter coefficients
83     */
84    if((pPrivate->NewParams.HPF        != pPrivate->CurrentParams.HPF)        ||
85       (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) ||
86       (pPrivate->bFirstControl        == LVM_TRUE))
87    {
88        LVM_INT32       Omega;
89        FO_C32_Coefs_t  Coeffs;
90
91        Omega = LVM_GetOmega(pPrivate->NewParams.HPF, pPrivate->NewParams.SampleRate);
92        LVM_FO_HPF(Omega, &Coeffs);
93        FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->HPCoefs, &pPrivate->pFastData->HPTaps, &Coeffs);
94        LoadConst_32(0,
95            (void *)&pPrivate->pFastData->HPTaps, /* Destination Cast to void: no dereferencing in function*/
96            sizeof(Biquad_1I_Order1_Taps_t)/sizeof(LVM_INT32));
97    }
98
99
100    /*
101     * Update the low pass filter coefficients
102     */
103    if((pPrivate->NewParams.LPF        != pPrivate->CurrentParams.LPF)        ||
104       (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) ||
105       (pPrivate->bFirstControl        == LVM_TRUE))
106    {
107        LVM_INT32       Omega;
108        FO_C32_Coefs_t  Coeffs;
109
110
111        Coeffs.A0 = 0x7FFFFFFF;
112        Coeffs.A1 = 0;
113        Coeffs.B1 = 0;
114        if(pPrivate->NewParams.LPF <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1))
115        {
116            Omega = LVM_GetOmega(pPrivate->NewParams.LPF, pPrivate->NewParams.SampleRate);
117
118            /*
119             * Do not apply filter if w =2*pi*fc/fs >= 2.9
120             */
121            if(Omega<=LVREV_2_9_INQ29)
122            {
123                LVM_FO_LPF(Omega, &Coeffs);
124            }
125        }
126        FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->LPCoefs, &pPrivate->pFastData->LPTaps, &Coeffs);
127        LoadConst_32(0,
128            (void *)&pPrivate->pFastData->LPTaps,        /* Destination Cast to void: no dereferencing in function*/
129            sizeof(Biquad_1I_Order1_Taps_t)/sizeof(LVM_INT32));
130    }
131
132
133    /*
134     * Calculate the room size parameter
135     */
136    if( pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize)
137    {
138        /* Room size range is 10ms to 200ms
139         * 0%   -- 10ms
140         * 50%  -- 65ms
141         * 100% -- 120ms
142         */
143        pPrivate->RoomSizeInms = 10 + (((pPrivate->NewParams.RoomSize*11) + 5)/10);
144    }
145
146
147    /*
148     * Update the T delay number of samples and the all pass delay number of samples
149     */
150    if( (pPrivate->NewParams.RoomSize   != pPrivate->CurrentParams.RoomSize)   ||
151        (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) ||
152        (pPrivate->bFirstControl        == LVM_TRUE))
153    {
154
155        LVM_UINT32  Temp;
156        LVM_INT32   APDelaySize;
157        LVM_INT32   Fs = LVM_GetFsFromTable(pPrivate->NewParams.SampleRate);
158        LVM_UINT32  DelayLengthSamples = (LVM_UINT32)(Fs * pPrivate->RoomSizeInms);
159        LVM_INT16   i;
160        LVM_INT16   ScaleTable[]  = {LVREV_T_3_Power_minus0_on_4, LVREV_T_3_Power_minus1_on_4, LVREV_T_3_Power_minus2_on_4, LVREV_T_3_Power_minus3_on_4};
161        LVM_INT16   MaxT_Delay[]  = {LVREV_MAX_T0_DELAY, LVREV_MAX_T1_DELAY, LVREV_MAX_T2_DELAY, LVREV_MAX_T3_DELAY};
162        LVM_INT16   MaxAP_Delay[] = {LVREV_MAX_AP0_DELAY, LVREV_MAX_AP1_DELAY, LVREV_MAX_AP2_DELAY, LVREV_MAX_AP3_DELAY};
163
164
165        /*
166         * For each delay line
167         */
168        for (i=0; i<NumberOfDelayLines; i++)
169        {
170            if (i != 0)
171            {
172                LVM_INT32 Temp1;  /* to avoid QAC warning on type conversion */
173                LVM_INT32 Temp2;  /* to avoid QAC warning on type conversion */
174
175                Temp2=(LVM_INT32)DelayLengthSamples;
176                MUL32x16INTO32(Temp2, ScaleTable[i], Temp1, 15)
177                Temp=(LVM_UINT32)Temp1;
178            }
179            else
180            {
181               Temp = DelayLengthSamples;
182            }
183            APDelaySize = Temp  / 1500;
184
185
186            /*
187             * Set the fixed delay
188             */
189            Temp                  = (MaxT_Delay[i] - MaxAP_Delay[i]) * Fs / 48000;
190            pPrivate->Delay_AP[i] = pPrivate->T[i] - Temp;
191
192
193            /*
194             * Set the tap selection
195             */
196            if (pPrivate->AB_Selection)
197            {
198                /* Smooth from tap A to tap B */
199                pPrivate->pOffsetB[i]             = &pPrivate->pDelay_T[i][pPrivate->T[i] - Temp - APDelaySize];
200                pPrivate->B_DelaySize[i]          = APDelaySize;
201                pPrivate->Mixer_APTaps[i].Target1 = 0;
202                pPrivate->Mixer_APTaps[i].Target2 = 0x7fffffff;
203            }
204            else
205            {
206                /* Smooth from tap B to tap A */
207                pPrivate->pOffsetA[i]             = &pPrivate->pDelay_T[i][pPrivate->T[i] - Temp - APDelaySize];
208                pPrivate->A_DelaySize[i]          = APDelaySize;
209                pPrivate->Mixer_APTaps[i].Target2 = 0;
210                pPrivate->Mixer_APTaps[i].Target1 = 0x7fffffff;
211            }
212
213            /*
214             * Set the maximum block size to the smallest delay size
215             */
216            pPrivate->MaxBlkLen   = Temp;
217            if (pPrivate->MaxBlkLen > pPrivate->A_DelaySize[i])
218            {
219                pPrivate->MaxBlkLen = pPrivate->A_DelaySize[i];
220            }
221            if (pPrivate->MaxBlkLen > pPrivate->B_DelaySize[i])
222            {
223                pPrivate->MaxBlkLen = pPrivate->B_DelaySize[i];
224            }
225        }
226        if (pPrivate->AB_Selection)
227        {
228            pPrivate->AB_Selection = 0;
229        }
230        else
231        {
232            pPrivate->AB_Selection = 1;
233        }
234
235
236        /*
237         * Limit the maximum block length
238         */
239        pPrivate->MaxBlkLen=pPrivate->MaxBlkLen-2;                                  /* Just as a precausion, but no problem if we remove this line      */
240        if(pPrivate->MaxBlkLen > pPrivate->InstanceParams.MaxBlockSize)
241        {
242            pPrivate->MaxBlkLen = (LVM_INT32)pPrivate->InstanceParams.MaxBlockSize;
243        }
244    }
245
246
247    /*
248     * Update the low pass filter coefficient
249     */
250    if( (pPrivate->NewParams.Damping    != pPrivate->CurrentParams.Damping)    ||
251        (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) ||
252        (pPrivate->bFirstControl        == LVM_TRUE))
253    {
254
255        LVM_INT32       Temp;
256        LVM_INT32       Omega;
257        FO_C32_Coefs_t  Coeffs;
258        LVM_INT16       i;
259        LVM_INT16       Damping      = (LVM_INT16)((pPrivate->NewParams.Damping * 100) + 1000);
260        LVM_INT32       ScaleTable[] = {LVREV_T_3_Power_0_on_4, LVREV_T_3_Power_1_on_4, LVREV_T_3_Power_2_on_4, LVREV_T_3_Power_3_on_4};
261
262
263        /*
264         * For each filter
265         */
266        for (i=0; i<NumberOfDelayLines; i++)
267        {
268            if (i != 0)
269            {
270                MUL32x16INTO32(ScaleTable[i], Damping, Temp, 15)
271            }
272            else
273            {
274                Temp = Damping;
275            }
276            if(Temp <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1))
277            {
278                Omega = LVM_GetOmega((LVM_UINT16)Temp, pPrivate->NewParams.SampleRate);
279                LVM_FO_LPF(Omega, &Coeffs);
280            }
281            else
282            {
283                Coeffs.A0 = 0x7FF00000;
284                Coeffs.A1 = 0;
285                Coeffs.B1 = 0;
286            }
287            FO_1I_D32F32Cll_TRC_WRA_01_Init(&pPrivate->pFastCoef->RevLPCoefs[i], &pPrivate->pFastData->RevLPTaps[i], &Coeffs);
288        }
289    }
290
291
292    /*
293     * Update All-pass filter mixer time constants
294     */
295    if( (pPrivate->NewParams.RoomSize   != pPrivate->CurrentParams.RoomSize)   ||
296        (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) ||
297        (pPrivate->NewParams.Density    != pPrivate->CurrentParams.Density))
298    {
299        LVM_INT16   i;
300        LVM_INT32   Alpha    = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_ALLPASS_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1);
301        LVM_INT32   AlphaTap = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_ALLPASS_TAP_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1);
302
303        for (i=0; i<4; i++)
304        {
305            pPrivate->Mixer_APTaps[i].Alpha1       = AlphaTap;
306            pPrivate->Mixer_APTaps[i].Alpha2       = AlphaTap;
307            pPrivate->Mixer_SGFeedback[i].Alpha    = Alpha;
308            pPrivate->Mixer_SGFeedforward[i].Alpha = Alpha;
309        }
310    }
311
312
313    /*
314     * Update the feed back gain
315     */
316    if( (pPrivate->NewParams.RoomSize   != pPrivate->CurrentParams.RoomSize)   ||
317        (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) ||
318        (pPrivate->NewParams.T60        != pPrivate->CurrentParams.T60)        ||
319        (pPrivate->bFirstControl        == LVM_TRUE))
320    {
321
322        LVM_INT32               G[4];                       /* Feedback gain (Q7.24) */
323
324        if(pPrivate->NewParams.T60 == 0)
325        {
326            G[3] = 0;
327            G[2] = 0;
328            G[1] = 0;
329            G[0] = 0;
330        }
331        else
332        {
333            LVM_INT32   Temp1;
334            LVM_INT32   Temp2;
335            LVM_INT16   i;
336            LVM_INT16   ScaleTable[] = {LVREV_T_3_Power_minus0_on_4, LVREV_T_3_Power_minus1_on_4, LVREV_T_3_Power_minus2_on_4, LVREV_T_3_Power_minus3_on_4};
337
338
339            /*
340             * For each delay line
341             */
342            for (i=0; i<NumberOfDelayLines; i++)
343            {
344                Temp1 = (3 * pPrivate->RoomSizeInms * ScaleTable[i]) / pPrivate->NewParams.T60;
345                if(Temp1 >= (4 << 15))
346                {
347                    G[i] = 0;
348                }
349                else if((Temp1 >= (2 << 15)))
350                {
351                    Temp2 = LVM_Power10(-(Temp1 << 14));
352                    Temp1 = LVM_Power10(-(Temp1 << 14));
353                    MUL32x32INTO32(Temp1,Temp2,Temp1,24)
354                }
355                else
356                {
357                    Temp1 = LVM_Power10(-(Temp1 << 15));
358                }
359                if (NumberOfDelayLines == 1)
360                {
361                    G[i] = Temp1;
362                }
363                else
364                {
365                    LVM_INT32   TempG;
366                    MUL32x16INTO32(Temp1,ONE_OVER_SQRT_TWO,TempG,15)
367                    G[i]=TempG;
368                }
369            }
370        }
371
372        /* Set up the feedback mixers for four delay lines */
373        pPrivate->FeedbackMixer[0].Target=G[0]<<7;
374        pPrivate->FeedbackMixer[1].Target=G[1]<<7;
375        pPrivate->FeedbackMixer[2].Target=G[2]<<7;
376        pPrivate->FeedbackMixer[3].Target=G[3]<<7;
377    }
378
379
380    /*
381     * Calculate the gain correction
382     */
383    if((pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) ||
384       (pPrivate->NewParams.Level    != pPrivate->CurrentParams.Level)    ||
385       (pPrivate->NewParams.T60      != pPrivate->CurrentParams.T60) )
386    {
387        LVM_INT32 Index=0;
388        LVM_INT32 i=0;
389        LVM_INT32 Gain=0;
390        LVM_INT32 RoomSize=0;
391        LVM_INT32 T60;
392        LVM_INT32 Coefs[5];
393
394        if(pPrivate->NewParams.RoomSize==0)
395        {
396            RoomSize=1;
397        }
398        else
399        {
400            RoomSize=(LVM_INT32)pPrivate->NewParams.RoomSize;
401        }
402
403        if(pPrivate->NewParams.T60<100)
404        {
405            T60 = 100 * LVREV_T60_SCALE;
406        }
407        else
408        {
409            T60 = pPrivate->NewParams.T60 * LVREV_T60_SCALE;
410        }
411
412        /* Find the nearest room size in table */
413        for(i=0;i<24;i++)
414        {
415            if(RoomSize<= LVREV_GainPolyTable[i][0])
416            {
417                Index=i;
418                break;
419            }
420        }
421
422
423        if(RoomSize==LVREV_GainPolyTable[Index][0])
424        {
425            /* Take table values if the room size is in table */
426            for(i=1;i<5;i++)
427            {
428                Coefs[i-1]=LVREV_GainPolyTable[Index][i];
429            }
430            Coefs[4]=0;
431            Gain=LVM_Polynomial(3,Coefs,T60);       /* Q.24 result */
432        }
433        else
434        {
435            /* Interpolate the gain between nearest room sizes */
436
437            LVM_INT32 Gain1,Gain2;
438            LVM_INT32 Tot_Dist,Dist;
439
440            Tot_Dist=LVREV_GainPolyTable[Index][0]-LVREV_GainPolyTable[Index-1][0];
441            Dist=RoomSize-LVREV_GainPolyTable[Index-1][0];
442
443
444            /* Get gain for first */
445            for(i=1;i<5;i++)
446            {
447                Coefs[i-1]=LVREV_GainPolyTable[Index-1][i];
448            }
449            Coefs[4]=0;
450
451            Gain1=LVM_Polynomial(3,Coefs,T60);      /* Q.24 result */
452
453            /* Get gain for second */
454            for(i=1;i<5;i++)
455            {
456                Coefs[i-1]=LVREV_GainPolyTable[Index][i];
457            }
458            Coefs[4]=0;
459
460            Gain2=LVM_Polynomial(3,Coefs,T60);      /* Q.24 result */
461
462            /* Linear Interpolate the gain */
463            Gain = Gain1+ (((Gain2-Gain1)*Dist)/(Tot_Dist));
464        }
465
466
467        /*
468         * Get the inverse of gain: Q.15
469         * Gain is mostly above one except few cases, take only gains above 1
470         */
471        if(Gain < 16777216L)
472        {
473            pPrivate->Gain= 32767;
474        }
475        else
476        {
477            pPrivate->Gain=(LVM_INT16)(LVM_MAXINT_32/(Gain>>8));
478        }
479
480
481        Index=((32767*100)/(100+pPrivate->NewParams.Level));
482        pPrivate->Gain=(LVM_INT16)((pPrivate->Gain*Index)>>15);
483        pPrivate->GainMixer.Target = pPrivate->Gain*Index;
484    }
485
486
487    /*
488     * Update the all pass comb filter coefficient
489     */
490    if( (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density) ||
491        (pPrivate->bFirstControl     == LVM_TRUE))
492    {
493        LVM_INT16   i;
494        LVM_INT32   b = pPrivate->NewParams.Density * LVREV_B_8_on_1000;
495
496        for (i=0;i<4; i++)
497        {
498            pPrivate->Mixer_SGFeedback[i].Target    = b;
499            pPrivate->Mixer_SGFeedforward[i].Target = b;
500        }
501    }
502
503
504    /*
505     * Update the bypass mixer time constant
506     */
507    if((pPrivate->NewParams.SampleRate   != pPrivate->CurrentParams.SampleRate)   ||
508       (pPrivate->NewParams.SourceFormat != pPrivate->CurrentParams.SourceFormat) ||
509       (pPrivate->bFirstControl          == LVM_TRUE))
510    {
511        LVM_UINT16   NumChannels = 1;                       /* Assume MONO format */
512        LVM_INT32    Alpha;
513
514        Alpha = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_FEEDBACKMIXER_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels);
515        pPrivate->FeedbackMixer[0].Alpha=Alpha;
516        pPrivate->FeedbackMixer[1].Alpha=Alpha;
517        pPrivate->FeedbackMixer[2].Alpha=Alpha;
518        pPrivate->FeedbackMixer[3].Alpha=Alpha;
519
520        if (pPrivate->NewParams.SourceFormat != LVM_MONO)
521        {
522            /* Stereo or Mono-in-Stereo format data */
523            NumChannels = 2;
524        }
525        pPrivate->BypassMixer.Alpha1 = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_BYPASSMIXER_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels);
526        pPrivate->BypassMixer.Alpha2 = pPrivate->BypassMixer.Alpha1;
527        pPrivate->GainMixer.Alpha    = pPrivate->BypassMixer.Alpha1;
528    }
529
530
531    /*
532     * Update the bypass mixer targets
533     */
534    if( (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) &&
535        (pPrivate->NewParams.OperatingMode == LVM_MODE_ON))
536    {
537        pPrivate->BypassMixer.Target2 = ((LVM_INT32)(pPrivate->NewParams.Level * 32767)/100)<<16;
538        pPrivate->BypassMixer.Target1 = LVREV_HEADROOM << 16;
539        if ((pPrivate->NewParams.Level == 0) && (pPrivate->bFirstControl == LVM_FALSE))
540        {
541            pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE;
542        }
543        if (pPrivate->NewParams.Level != 0)
544        {
545            pPrivate->bDisableReverb = LVM_FALSE;
546        }
547    }
548
549    if(pPrivate->NewParams.OperatingMode != pPrivate->CurrentParams.OperatingMode)
550    {
551        if(pPrivate->NewParams.OperatingMode == LVM_MODE_ON)
552        {
553            pPrivate->BypassMixer.Target2 = ((LVM_INT32)(pPrivate->NewParams.Level * 32767)/100)<<16;
554            pPrivate->BypassMixer.Target1 = LVREV_HEADROOM << 16;
555
556            pPrivate->BypassMixer.CallbackSet2 = LVM_FALSE;
557            OperatingMode                      = LVM_MODE_ON;
558            if (pPrivate->NewParams.Level == 0)
559            {
560                pPrivate->bDisableReverb = LVM_TRUE;
561            }
562            else
563            {
564                pPrivate->bDisableReverb = LVM_FALSE;
565            }
566        }
567        else if (pPrivate->bFirstControl == LVM_FALSE)
568        {
569            pPrivate->BypassMixer.Target2 = 0x00000000;
570            pPrivate->BypassMixer.Target1 = 0x7FFFFFFF;
571            pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE;
572            pPrivate->GainMixer.Target    = 0x03FFFFFF;
573            OperatingMode = LVM_MODE_ON;
574        }
575        else
576        {
577            OperatingMode = LVM_MODE_OFF;
578        }
579    }
580
581
582    /*
583     * If it is the first call to ApplyNew settings force the current to the target to begin immediate playback of the effect
584     */
585    if(pPrivate->bFirstControl == LVM_TRUE)
586    {
587        pPrivate->BypassMixer.Current1 = pPrivate->BypassMixer.Target1;
588        pPrivate->BypassMixer.Current2 = pPrivate->BypassMixer.Target2;
589    }
590
591
592    /*
593     * Copy the new parameters
594     */
595    pPrivate->CurrentParams = pPrivate->NewParams;
596    pPrivate->CurrentParams.OperatingMode = OperatingMode;
597
598
599    /*
600     * Update flag
601     */
602    if(pPrivate->bFirstControl == LVM_TRUE)
603    {
604        pPrivate->bFirstControl = LVM_FALSE;
605    }
606
607
608    return LVREV_SUCCESS;
609}
610
611
612/****************************************************************************************/
613/*                                                                                      */
614/* FUNCTION:                BypassMixer_Callback                                        */
615/*                                                                                      */
616/* DESCRIPTION:                                                                         */
617/*  Controls the On to Off operating mode transition                                    */
618/*                                                                                      */
619/* PARAMETERS:                                                                          */
620/*  pPrivate                Pointer to the instance private parameters                  */
621/*                                                                                      */
622/* RETURNS:                                                                             */
623/*  LVREV_Success           Succeeded                                                   */
624/*  LVREV_NULLADDRESS       When pPrivate is NULL                                       */
625/*                                                                                      */
626/* NOTES:                                                                               */
627/*                                                                                      */
628/****************************************************************************************/
629LVM_INT32 BypassMixer_Callback (void *pCallbackData,
630                                void *pGeneralPurpose,
631                                LVM_INT16 GeneralPurpose )
632{
633
634    LVREV_Instance_st     *pLVREV_Private = (LVREV_Instance_st *)pCallbackData;
635
636
637    /*
638     * Avoid build warnings
639     */
640    (void)pGeneralPurpose;
641    (void)GeneralPurpose;
642
643
644    /*
645     * Turn off
646     */
647    pLVREV_Private->CurrentParams.OperatingMode = LVM_MODE_OFF;
648    pLVREV_Private->bDisableReverb              = LVM_TRUE;
649    LVREV_ClearAudioBuffers((LVREV_Handle_t)pCallbackData);
650
651
652    return 0;
653}
654
655/* End of file */
656
657