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