Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd1e8a34 authored by Rivukanta Bhattacharya's avatar Rivukanta Bhattacharya
Browse files

LVM Reverb module changes

Bug: 120944950
Test: reverb_test with lvm/tests/build_and_run_all_unit_tests_reverb.sh

Change-Id: Ied5cbfeed86d8017702bf10a5b63b28a3d809184
parent 76e856ba
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -148,10 +148,6 @@ LVREV_ReturnStatus_en LVREV_ApplyNewSettings(LVREV_Instance_st* pPrivate) {
        LVM_INT16 i;
        LVM_FLOAT 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};
        LVM_INT16 MaxT_Delay[] = {LVREV_MAX_T0_DELAY, LVREV_MAX_T1_DELAY, LVREV_MAX_T2_DELAY,
                                  LVREV_MAX_T3_DELAY};
        LVM_INT16 MaxAP_Delay[] = {LVREV_MAX_AP0_DELAY, LVREV_MAX_AP1_DELAY, LVREV_MAX_AP2_DELAY,
                                   LVREV_MAX_AP3_DELAY};

        /*
         * For each delay line
@@ -171,7 +167,7 @@ LVREV_ReturnStatus_en LVREV_ApplyNewSettings(LVREV_Instance_st* pPrivate) {
             * Set the fixed delay
             */

            Temp = (MaxT_Delay[i] - MaxAP_Delay[i]) * Fs / 192000;
            Temp = (LVREV_MAX_T_DELAY[i] - LVREV_MAX_AP_DELAY[i]) * Fs / 192000;
            pPrivate->Delay_AP[i] = pPrivate->T[i] - Temp;

            /*
+4 −36
Original line number Diff line number Diff line
@@ -63,45 +63,13 @@ LVREV_ReturnStatus_en LVREV_ClearAudioBuffers(LVREV_Handle_t hInstance) {
    LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->HPTaps, 2);
    LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->LPTaps, 2);
#endif
    if ((LVM_UINT16)pLVREV_Private->InstanceParams.NumDelays == LVREV_DELAYLINES_4) {
    for (size_t i = 0; i < pLVREV_Private->InstanceParams.NumDelays; i++) {
#ifdef BIQUAD_OPT
        for (int i = 0; i < LVREV_DELAYLINES_4; i++) {
        pLVREV_Private->revLPFBiquad[i]->clear();
        }
#else
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[3], 2);
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[2], 2);
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[1], 2);
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[0], 2);
#endif

        LoadConst_Float(0, pLVREV_Private->pDelay_T[3], LVREV_MAX_T3_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[2], LVREV_MAX_T2_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[1], LVREV_MAX_T1_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[0], LVREV_MAX_T0_DELAY);
    }

    if ((LVM_UINT16)pLVREV_Private->InstanceParams.NumDelays >= LVREV_DELAYLINES_2) {
#ifdef BIQUAD_OPT
        for (int i = 0; i < LVREV_DELAYLINES_2; i++) {
            pLVREV_Private->revLPFBiquad[i]->clear();
        }
#else
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[1], 2);
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[0], 2);
#endif

        LoadConst_Float(0, pLVREV_Private->pDelay_T[1], LVREV_MAX_T1_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[0], LVREV_MAX_T0_DELAY);
    }

    if ((LVM_UINT16)pLVREV_Private->InstanceParams.NumDelays >= LVREV_DELAYLINES_1) {
#ifdef BIQUAD_OPT
        pLVREV_Private->revLPFBiquad[0]->clear();
#else
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[0], 2);
        LoadConst_Float(0, (LVM_FLOAT*)&pLVREV_Private->pFastData->RevLPTaps[i], 2);
#endif
        LoadConst_Float(0, pLVREV_Private->pDelay_T[0], LVREV_MAX_T0_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[i], LVREV_MAX_T_DELAY[i]);
    }
    return LVREV_SUCCESS;
}
+17 −64
Original line number Diff line number Diff line
@@ -120,11 +120,11 @@ LVREV_ReturnStatus_en LVREV_GetInstanceHandle(LVREV_Handle_t* phInstance,
    pLVREV_Private->MemoryTable = *pMemoryTable;

    if (pInstanceParams->NumDelays == LVREV_DELAYLINES_4) {
        MaxBlockSize = LVREV_MAX_AP3_DELAY;
        MaxBlockSize = LVREV_MAX_AP_DELAY[3];
    } else if (pInstanceParams->NumDelays == LVREV_DELAYLINES_2) {
        MaxBlockSize = LVREV_MAX_AP1_DELAY;
        MaxBlockSize = LVREV_MAX_AP_DELAY[1];
    } else {
        MaxBlockSize = LVREV_MAX_AP0_DELAY;
        MaxBlockSize = LVREV_MAX_AP_DELAY[0];
    }

    if (MaxBlockSize > pInstanceParams->MaxBlockSize) {
@@ -139,61 +139,18 @@ LVREV_ReturnStatus_en LVREV_GetInstanceHandle(LVREV_Handle_t* phInstance,
    pLVREV_Private->pFastData =
            (LVREV_FastData_st*)InstAlloc_AddMember(&FastData, sizeof(LVREV_FastData_st));
#endif
    if (pInstanceParams->NumDelays == LVREV_DELAYLINES_4) {
        pLVREV_Private->pDelay_T[3] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T3_DELAY * sizeof(LVM_FLOAT));
        pLVREV_Private->pDelay_T[2] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T2_DELAY * sizeof(LVM_FLOAT));
        pLVREV_Private->pDelay_T[1] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_FLOAT));
        pLVREV_Private->pDelay_T[0] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_FLOAT));

        for (i = 0; i < 4; i++) {
            /* Scratch for each delay line output */
            pLVREV_Private->pScratchDelayLine[i] =
                    (LVM_FLOAT*)InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
        }

        LoadConst_Float(0, pLVREV_Private->pDelay_T[3], LVREV_MAX_T3_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[2], LVREV_MAX_T2_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[1], LVREV_MAX_T1_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[0], LVREV_MAX_T0_DELAY);
    }

    if (pInstanceParams->NumDelays == LVREV_DELAYLINES_2) {
        pLVREV_Private->pDelay_T[1] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_FLOAT));
        pLVREV_Private->pDelay_T[0] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_FLOAT));

        for (i = 0; i < 2; i++) {
    for (size_t i = 0; i < pInstanceParams->NumDelays; i++) {
        pLVREV_Private->pDelay_T[i] = (LVM_FLOAT*)InstAlloc_AddMember(
                &FastData, LVREV_MAX_T_DELAY[i] * sizeof(LVM_FLOAT));
        /* Scratch for each delay line output */
        pLVREV_Private->pScratchDelayLine[i] =
                (LVM_FLOAT*)InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
        }

        LoadConst_Float(0, pLVREV_Private->pDelay_T[1], (LVM_INT16)LVREV_MAX_T1_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[0], (LVM_INT16)LVREV_MAX_T0_DELAY);
    }

    if (pInstanceParams->NumDelays == LVREV_DELAYLINES_1) {
        pLVREV_Private->pDelay_T[0] =
                (LVM_FLOAT*)InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_FLOAT));

        for (i = 0; i < 1; i++) {
            /* Scratch for each delay line output */
            pLVREV_Private->pScratchDelayLine[i] =
                    (LVM_FLOAT*)InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
        }

        LoadConst_Float(0, pLVREV_Private->pDelay_T[0], (LVM_INT16)LVREV_MAX_T0_DELAY);
        LoadConst_Float(0, pLVREV_Private->pDelay_T[i], LVREV_MAX_T_DELAY[i]);
    }
    /* All-pass delay buffer addresses and sizes */
    pLVREV_Private->T[0] = LVREV_MAX_T0_DELAY;
    pLVREV_Private->T[1] = LVREV_MAX_T1_DELAY;
    pLVREV_Private->T[2] = LVREV_MAX_T2_DELAY;
    pLVREV_Private->T[3] = LVREV_MAX_T3_DELAY;
    for (size_t i = 0; i < LVREV_DELAYLINES_4; i++) {
        pLVREV_Private->T[i] = LVREV_MAX_T_DELAY[i];
    }
    pLVREV_Private->AB_Selection = 1; /* Select smoothing A to B */

#ifndef BIQUAD_OPT
@@ -303,14 +260,10 @@ LVREV_ReturnStatus_en LVREV_GetInstanceHandle(LVREV_Handle_t* phInstance,
        pLVREV_Private->FeedbackMixer[i].Target = 0;
    }
    /* Delay tap index */
    pLVREV_Private->A_DelaySize[0] = LVREV_MAX_AP0_DELAY;
    pLVREV_Private->B_DelaySize[0] = LVREV_MAX_AP0_DELAY;
    pLVREV_Private->A_DelaySize[1] = LVREV_MAX_AP1_DELAY;
    pLVREV_Private->B_DelaySize[1] = LVREV_MAX_AP1_DELAY;
    pLVREV_Private->A_DelaySize[2] = LVREV_MAX_AP2_DELAY;
    pLVREV_Private->B_DelaySize[2] = LVREV_MAX_AP2_DELAY;
    pLVREV_Private->A_DelaySize[3] = LVREV_MAX_AP3_DELAY;
    pLVREV_Private->B_DelaySize[3] = LVREV_MAX_AP3_DELAY;
    for (size_t i = 0; i < LVREV_DELAYLINES_4; i++) {
        pLVREV_Private->A_DelaySize[i] = LVREV_MAX_AP_DELAY[i];
        pLVREV_Private->B_DelaySize[i] = LVREV_MAX_AP_DELAY[i];
    }

#ifdef BIQUAD_OPT
    pLVREV_Private->pRevHPFBiquad.reset(
+8 −37
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@ LVREV_ReturnStatus_en LVREV_GetMemoryTable(LVREV_Handle_t hInstance,
    INST_ALLOC FastData;
    INST_ALLOC FastCoef;
    INST_ALLOC Temporary;
    LVM_INT16 i;
    LVM_UINT16 MaxBlockSize;

    /*
@@ -117,11 +116,11 @@ LVREV_ReturnStatus_en LVREV_GetMemoryTable(LVREV_Handle_t hInstance,
         * Select the maximum internal block size
         */
        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_4) {
            MaxBlockSize = LVREV_MAX_AP3_DELAY;
            MaxBlockSize = LVREV_MAX_AP_DELAY[3];
        } else if (pInstanceParams->NumDelays == LVREV_DELAYLINES_2) {
            MaxBlockSize = LVREV_MAX_AP1_DELAY;
            MaxBlockSize = LVREV_MAX_AP_DELAY[1];
        } else {
            MaxBlockSize = LVREV_MAX_AP0_DELAY;
            MaxBlockSize = LVREV_MAX_AP_DELAY[0];
        }

        if (MaxBlockSize > pInstanceParams->MaxBlockSize) {
@@ -142,20 +141,8 @@ LVREV_ReturnStatus_en LVREV_GetMemoryTable(LVREV_Handle_t hInstance,
#ifndef BIQUAD_OPT
        InstAlloc_AddMember(&FastData, sizeof(LVREV_FastData_st));
#endif
        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_4) {
            InstAlloc_AddMember(&FastData, LVREV_MAX_T3_DELAY * sizeof(LVM_FLOAT));
            InstAlloc_AddMember(&FastData, LVREV_MAX_T2_DELAY * sizeof(LVM_FLOAT));
            InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_FLOAT));
            InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_FLOAT));
        }

        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_2) {
            InstAlloc_AddMember(&FastData, LVREV_MAX_T1_DELAY * sizeof(LVM_FLOAT));
            InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_FLOAT));
        }

        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_1) {
            InstAlloc_AddMember(&FastData, LVREV_MAX_T0_DELAY * sizeof(LVM_FLOAT));
        for (size_t i = 0; i < pInstanceParams->NumDelays; i++) {
            InstAlloc_AddMember(&FastData, LVREV_MAX_T_DELAY[i] * sizeof(LVM_FLOAT));
        }

        pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Size = InstAlloc_GetTotal(&FastData);
@@ -179,26 +166,10 @@ LVREV_ReturnStatus_en LVREV_GetMemoryTable(LVREV_Handle_t hInstance,
        InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
        /* Mono->stereo input saved for end mix */
        InstAlloc_AddMember(&Temporary, 2 * sizeof(LVM_FLOAT) * MaxBlockSize);
        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_4) {
            for (i = 0; i < 4; i++) {
        for (size_t i = 0; i < pInstanceParams->NumDelays; i++) {
            /* A Scratch buffer for each delay line */
            InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
        }
        }

        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_2) {
            for (i = 0; i < 2; i++) {
                /* A Scratch buffer for each delay line */
                InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
            }
        }

        if (pInstanceParams->NumDelays == LVREV_DELAYLINES_1) {
            for (i = 0; i < 1; i++) {
                /* A Scratch buffer for each delay line */
                InstAlloc_AddMember(&Temporary, sizeof(LVM_FLOAT) * MaxBlockSize);
            }
        }

        pMemoryTable->Region[LVM_TEMPORARY_FAST].Size = InstAlloc_GetTotal(&Temporary);
        pMemoryTable->Region[LVM_TEMPORARY_FAST].Type = LVM_TEMPORARY_FAST;
+15 −14
Original line number Diff line number Diff line
@@ -110,14 +110,15 @@
typedef struct {
    Biquad_1I_Order1_FLOAT_Taps_t HPTaps;       /* High pass filter taps */
    Biquad_1I_Order1_FLOAT_Taps_t LPTaps;       /* Low pass filter taps */
    Biquad_1I_Order1_FLOAT_Taps_t RevLPTaps[4]; /* Reverb low pass filters taps */
    Biquad_1I_Order1_FLOAT_Taps_t RevLPTaps[LVREV_DELAYLINES_4]; /* Reverb low pass filters taps */
} LVREV_FastData_st;

/* Fast coefficient structure */
typedef struct {
    Biquad_FLOAT_Instance_t HPCoefs;       /* High pass filter coefficients */
    Biquad_FLOAT_Instance_t LPCoefs;       /* Low pass filter coefficients */
    Biquad_FLOAT_Instance_t RevLPCoefs[4]; /* Reverb low pass filters coefficients */
    Biquad_FLOAT_Instance_t
            RevLPCoefs[LVREV_DELAYLINES_4]; /* Reverb low pass filters coefficients */
} LVREV_FastCoef_st;
#endif

@@ -150,28 +151,28 @@ typedef struct {
    LVREV_FastData_st* pFastData; /* Fast data memory base address */
    LVREV_FastCoef_st* pFastCoef; /* Fast coefficient memory base address */
#endif
    LVM_FLOAT* pScratchDelayLine[4]; /* Delay line scratch memory */
    LVM_FLOAT* pScratchDelayLine[LVREV_DELAYLINES_4]; /* Delay line scratch memory */
    LVM_FLOAT* pScratch;             /* Multi ussge scratch */
    LVM_FLOAT* pInputSave;           /* Reverb block input save for dry/wet
                                        mixing*/

    /* Feedback matrix */
    Mix_1St_Cll_FLOAT_t FeedbackMixer[4]; /* Mixer for Pop and Click Suppression \
    Mix_1St_Cll_FLOAT_t FeedbackMixer[LVREV_DELAYLINES_4]; /* Mixer for Pop and Click Suppression \
                                             caused by feedback Gain */

    /* All-Pass Filter */
    LVM_INT32 T[4];                             /* Maximum delay size of buffer */
    LVM_FLOAT* pDelay_T[4];                     /* Pointer to delay buffers */
    LVM_INT32 Delay_AP[4];                      /* Offset to AP delay buffer start */
    LVM_INT32 T[LVREV_DELAYLINES_4];                          /* Maximum delay size of buffer */
    LVM_FLOAT* pDelay_T[LVREV_DELAYLINES_4];                  /* Pointer to delay buffers */
    LVM_INT32 Delay_AP[LVREV_DELAYLINES_4];                   /* Offset to AP delay buffer start */
    LVM_INT16 AB_Selection;                     /* Smooth from tap A to B when 1 \
                                                   otherwise B to A */
    LVM_INT32 A_DelaySize[4];                   /* A delay length in samples */
    LVM_INT32 B_DelaySize[4];                   /* B delay length in samples */
    LVM_FLOAT* pOffsetA[4];                     /* Offset for the A delay tap */
    LVM_FLOAT* pOffsetB[4];                     /* Offset for the B delay tap */
    Mix_2St_Cll_FLOAT_t Mixer_APTaps[4];        /* Smoothed AP delay mixer */
    Mix_1St_Cll_FLOAT_t Mixer_SGFeedback[4];    /* Smoothed SAfeedback gain */
    Mix_1St_Cll_FLOAT_t Mixer_SGFeedforward[4]; /* Smoothed AP feedforward gain */
    LVM_INT32 A_DelaySize[LVREV_DELAYLINES_4];                /* A delay length in samples */
    LVM_INT32 B_DelaySize[LVREV_DELAYLINES_4];                /* B delay length in samples */
    LVM_FLOAT* pOffsetA[LVREV_DELAYLINES_4];                  /* Offset for the A delay tap */
    LVM_FLOAT* pOffsetB[LVREV_DELAYLINES_4];                  /* Offset for the B delay tap */
    Mix_2St_Cll_FLOAT_t Mixer_APTaps[LVREV_DELAYLINES_4];     /* Smoothed AP delay mixer */
    Mix_1St_Cll_FLOAT_t Mixer_SGFeedback[LVREV_DELAYLINES_4]; /* Smoothed SAfeedback gain */
    Mix_1St_Cll_FLOAT_t Mixer_SGFeedforward[LVREV_DELAYLINES_4]; /* Smoothed AP feedforward gain */

    /* Output gain */
    Mix_2St_Cll_FLOAT_t BypassMixer; /* Dry/wet mixer */
Loading