Commit 09102fb7 authored by Tapani Pihlajakuja's avatar Tapani Pihlajakuja
Browse files

Fix binaural gain cache in relation to OMASA

parent 9ea697c8
Loading
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@
#define ADAPT_HTPROTO_ROT_LIM_1   0.8f

#ifdef MASA_AND_OBJECTS
#define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS + MAX_NUM_OBJECTS ) * 3 ) /* == max number of simultaneous directions * 3 */
#define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS * 3 ) + MAX_NUM_OBJECTS ) /* == different calls to get gains */
#else
#define MAX_GAIN_CACHE_SIZE 6
#endif
@@ -814,6 +814,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
    int16_t dirac_read_idx;
    float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX];
    PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE];
#ifdef MASA_AND_OBJECTS
    int16_t gainCacheBaseIndex;
#endif

    hDirAC = st_ivas->hDirAC;
    h = st_ivas->hDiracDecBin;
@@ -952,6 +955,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                eleDeg = hDirAC->elevation[dirac_read_idx][bin];
                ratio = hDirAC->energy_ratio1[dirac_read_idx][bin];
                spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin];
#ifdef MASA_AND_OBJECTS
                gainCacheBaseIndex = 0;
#endif
            }
#ifdef MASA_AND_OBJECTS
            else if ( st_ivas->ivas_format != MASA_ISM_FORMAT || ( st_ivas->ivas_format == MASA_ISM_FORMAT && dirIndex < hDirAC->numParametricDirections ) ) /* For second of the two simultaneous directions */
@@ -970,6 +976,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                aziDeg = hDirAC->azimuth2[dirac_read_idx][bin];
                eleDeg = hDirAC->elevation2[dirac_read_idx][bin];
                spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin];
#ifdef MASA_AND_OBJECTS
                gainCacheBaseIndex = 3;
#endif
            }
#ifdef MASA_AND_OBJECTS
            else /* For object directions of MASA_ISM_FORMAT */
@@ -989,6 +998,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                }
                ratio = st_ivas->hMasaIsmData->energy_ratio_ism[ismDirIndex][dirac_read_idx][bin];
                spreadCoh = 0.0f;
                gainCacheBaseIndex = 6 + ismDirIndex;
            }
#endif

@@ -1024,7 +1034,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                spreadCoh = max( spreadCoh, altSpreadCoh );
            }

#ifdef MASA_AND_OBJECTS
            getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked );
#else
            getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 )], isHeadtracked );
#endif

            if ( h->renderStereoOutputInsteadOfBinaural )
            {
@@ -1067,7 +1081,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                rImagp *= centerMul;

                /* Apply the gain for the left source of the three coherent sources */
#ifdef MASA_AND_OBJECTS
                getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked );
#else
                getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 1 )], isHeadtracked );
#endif

                hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
                lRealp += sidesMul * lRealpTmp;
@@ -1077,7 +1095,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric

                /* Apply the gain for the right source of the three coherent sources.
                 * -30 degrees to 330 wrapping due to internal functions. */
#ifdef MASA_AND_OBJECTS
                getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked );
#else
                getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 2 )], isHeadtracked );
#endif

                hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
                lRealp += sidesMul * lRealpTmp;
@@ -1293,7 +1315,12 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
    int16_t dirac_read_idx;
#endif
    DIRAC_DEC_BIN_HANDLE h;
#ifdef MASA_AND_OBJECTS
    PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_NUM_OBJECTS];
    int16_t idx;
#else
    PARAMBIN_HRTF_GAIN_CACHE gainCache;
#endif

    h = st_ivas->hDiracDecBin;
#ifdef MASA_AND_OBJECTS
@@ -1320,7 +1347,14 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
    dirac_read_idx = st_ivas->hDirAC->dirac_read_idx;
#endif

#ifdef MASA_AND_OBJECTS
    for ( idx = 0; idx < MAX_NUM_OBJECTS; idx++ )
    {
        gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */
    }
#else
    gainCache.azi = -1000; /* Use -1000 as value for uninitialized cache. */
#endif

    for ( bin = 0; bin < nBins; bin++ )
    {
@@ -1491,7 +1525,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
                    h->processMtxImPrev[chA][chB + 2][bin] = h->processMtxIm[chA][chB + 2][bin];
                }

                getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache, isHeadtracked );
                getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked );

                h->processMtxRe[0][chB + 2][bin] = lRealp * gainFactor;
                h->processMtxIm[0][chB + 2][bin] = lImagp * gainFactor;