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

Commit e239228d authored by Andy Hung's avatar Andy Hung Committed by Gerrit Code Review
Browse files

Merge "LVM Reverb module changes"

parents 28a7e941 cd1e8a34
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