Commit c90d43db authored by emerit's avatar emerit
Browse files

version for test

parent 8b29551e
Loading
Loading
Loading
Loading
+225 −3
Original line number Diff line number Diff line
@@ -169,7 +169,12 @@ static ivas_error ivas_rend_initCrend(
    ivas_error error;
    IVAS_REND_AudioConfig inConfig;
    IVAS_REND_AudioConfig outConfig;

#ifdef USE_SYMETRIC_HRIR_FILTERS
    int16_t nb_ear;
    int16_t curComp;
    int16_t nbCompForCurrentOrder;
    int16_t curOrder;
#endif
    inConfig = getRendAudioConfigFromIvasAudioConfig( inIvasConfig );
    outConfig = getRendAudioConfigFromIvasAudioConfig( outIvasConfig );

@@ -218,6 +223,41 @@ static ivas_error ivas_rend_initCrend(
    {
        if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED )
        {
#ifdef USE_SYMETRIC_HRIR_FILTERS
            if ( use_brir )
            {
                nb_ear = CRendBin_Combined_BRIR_Use_Symetric_Filters == 0 ? 2 : 1;
            }
            else
            {
                nb_ear = CRendBin_Combined_HRIR_Use_Symetric_Filters == 0 ? 2 : 1;
            }
            if ( nb_ear == 1 )
            {
                for ( i = 0; i < hHrtf->max_num_ir; i++ )
                {
                    if ( ( i == 2 ) || ( i == 3 ) )
                    {
                        hHrtf->ch_sum_diff[i] = 0;
                        hHrtf->ch_sum_diff_pair[i] = i;
                    }
                    else
                    {
                        hHrtf->ch_sum_diff[i] = i % 2 ? 1 : 0;
                        hHrtf->ch_sum_diff_pair[i] = i % 2 ? i - 1 : i + 1;
                    }
                }
            }
            else
            {
                for ( i = 0; i < hHrtf->max_num_ir; i++ )
                {
                    hHrtf->ch_sum_diff[i] = -1;
                    hHrtf->ch_sum_diff_pair[i] = i;
                }
            }

#endif
            hHrtf->max_num_ir -= 1; /* subtract LFE */
            hHrtf->gain_lfe = GAIN_LFE;

@@ -236,7 +276,11 @@ static ivas_error ivas_rend_initCrend(
                    hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz;
                }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                for ( j = 0; j < nb_ear; j++ )
#else
                for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                {
                    if ( use_brir )
                    {
@@ -268,8 +312,11 @@ static ivas_error ivas_rend_initCrend(
                    hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz;
                    hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz;
                }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                for ( j = 0; j < nb_ear; j++ )
#else
                for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                {
                    if ( use_brir )
                    {
@@ -302,7 +349,11 @@ static ivas_error ivas_rend_initCrend(
                    hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz;
                }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                for ( j = 0; j < nb_ear; j++ )
#else
                for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                {
                    if ( use_brir )
                    {
@@ -363,7 +414,11 @@ static ivas_error ivas_rend_initCrend(
                        hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[tmp];
                    }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( j = 0; j < nb_ear; j++ )
#else
                    for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                    {
                        if ( use_brir )
                        {
@@ -392,7 +447,11 @@ static ivas_error ivas_rend_initCrend(
                        hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[tmp];
                    }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( j = 0; j < nb_ear; j++ )
#else
                    for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                    {
                        if ( use_brir )
                        {
@@ -421,7 +480,11 @@ static ivas_error ivas_rend_initCrend(
                        hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[tmp];
                    }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( j = 0; j < nb_ear; j++ )
#else
                    for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                    {
                        if ( use_brir )
                        {
@@ -447,6 +510,44 @@ static ivas_error ivas_rend_initCrend(
        }
        else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS )
        {
#ifdef USE_SYMETRIC_HRIR_FILTERS
            nb_ear = CRendBin_HOA3_HRIR_Use_Symetric_Filters == 0 ? 2 : 1;
            if ( nb_ear == 1 )
            {
                curComp = 0;
                nbCompForCurrentOrder = 1;
                curOrder = 0;

                for ( i = 0; i < hHrtf->max_num_ir; i++ )
                {
                    if ( curComp < curOrder )
                    {
                        hHrtf->ch_sum_diff[i] = 1;
                    }
                    else
                    {
                        hHrtf->ch_sum_diff[i] = 0;
                    }

                    curComp++;
                    if ( curComp == nbCompForCurrentOrder )
                    {
                        curOrder++;
                        curComp = 0;
                        nbCompForCurrentOrder = 2 * curOrder + 1;
                    }
                    hHrtf->ch_sum_diff_pair[i] = i;
                }
            }
            else
            {
                for ( i = 0; i < hHrtf->max_num_ir; i++ )
                {
                    hHrtf->ch_sum_diff[i] = -1;
                    hHrtf->ch_sum_diff_pair[i] = i;
                }
            }
#endif
            if ( output_Fs == 48000 )
            {
                hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
@@ -457,7 +558,11 @@ static ivas_error ivas_rend_initCrend(
                {
                    hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i];

#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( j = 0; j < nb_ear; j++ )
#else
                    for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                    {
                        hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j];
                        hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j];
@@ -465,7 +570,11 @@ static ivas_error ivas_rend_initCrend(
                        hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j];
                    }
                }
#ifdef USE_SYMETRIC_HRIR_FILTERS
                for ( j = 0; j < nb_ear; j++ )
#else
                for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                {
                    hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j];
                    hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
@@ -483,7 +592,11 @@ static ivas_error ivas_rend_initCrend(
                {
                    hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i];

#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( j = 0; j < nb_ear; j++ )
#else
                    for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                    {
                        hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j];
                        hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j];
@@ -492,7 +605,11 @@ static ivas_error ivas_rend_initCrend(
                    }
                }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                for ( j = 0; j < nb_ear; j++ )
#else
                for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                {
                    hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j];
                    hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
@@ -510,7 +627,11 @@ static ivas_error ivas_rend_initCrend(
                {
                    hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i];

#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( j = 0; j < nb_ear; j++ )
#else
                    for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                    {
                        hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j];
                        hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j];
@@ -519,7 +640,11 @@ static ivas_error ivas_rend_initCrend(
                    }
                }

#ifdef USE_SYMETRIC_HRIR_FILTERS
                for ( j = 0; j < nb_ear; j++ )
#else
                for ( j = 0; j < BINAURAL_CHANNELS; j++ )
#endif
                {
                    hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j];
                    hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
@@ -949,7 +1074,12 @@ static ivas_error ivas_rend_crendConvolver(
    int16_t lfe_idx_in;
    int16_t offset, offset_in, offset_diffuse;
    int16_t nchan_in, nchan_out;
#ifdef USE_SYMETRIC_HRIR_FILTERS
    float *pIn_s, *pIn_d;
    int16_t idx_j;
#else
    float *pIn;
#endif
    float *pFreq_buf_re, *pFreq_buf_im;
    float *pFreq_filt_re, *pFreq_filt_im;
    float pOut[L_FRAME48k * 2];
@@ -993,9 +1123,24 @@ static ivas_error ivas_rend_crendConvolver(
    i = 0;
    for ( idx_in = 0; idx_in < nchan_in; idx_in++ )
    {
#ifndef
        pIn = &pcm_in[idx_in][i_ts * subframe_length];
#endif
        if ( idx_in != lfe_idx_in )
        {
#ifdef USE_SYMETRIC_HRIR_FILTERS
            pIn_s = &pcm_in[idx_in][i_ts * subframe_length];
            if ( ( pCrend->hHrtfCrend->ch_sum_diff[idx_in] >= 0 ) && ( idx_in != 2 ) )
            {
                pIn_d = &pcm_in[pCrend->hHrtfCrend->ch_sum_diff_pair[idx_in]][i_ts * subframe_length];
            }
            else
            {
                pIn_d = NULL;
            }
#else
            pIn = &pcm_in[idx_in][i_ts * subframe_length];
#endif
            if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
            {
                pFreq_buf_re = &pCrend->hCrend->freq_buffer_re_diffuse[offset_diffuse];
@@ -1013,7 +1158,30 @@ static ivas_error ivas_rend_crendConvolver(
            pFreq_buf_re = &pCrend->hCrend->freq_buffer_re[i][offset];
            pFreq_buf_im = &pCrend->hCrend->freq_buffer_im[i][offset];

#ifdef USE_SYMETRIC_HRIR_FILTERS
            if ( ( pCrend->hHrtfCrend->ch_sum_diff[idx_in] == 0 ) && ( pIn_d != NULL ) )
            {
                for ( k = 0; k < subframe_length; k++ )
                {
                    tmp_out_re[k] = pIn_s[k] + pIn_d[k];
                }
                ivas_mdft( tmp_out_re, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length );
            }
            else if ( pCrend->hHrtfCrend->ch_sum_diff[idx_in] == 1 )
            {
                for ( k = 0; k < subframe_length; k++ )
                {
                    tmp_out_re[k] = pIn_d[k] - pIn_s[k];
                }
                ivas_mdft( tmp_out_re, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length );
            }
            else
            {
                ivas_mdft( pIn_s, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length );
            }
#else
            ivas_mdft( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length );
#endif
            i++;
        }
    }
@@ -1022,13 +1190,44 @@ static ivas_error ivas_rend_crendConvolver(
    {
        set_zero( tmp_out_re, subframe_length );
        set_zero( tmp_out_im, subframe_length );
#ifdef USE_SYMETRIC_HRIR_FILTERS
        idx_j = pCrend->hHrtfCrend->ch_sum_diff[0] < 0 ? j : 0;
#endif

        i = 0;
        for ( idx_in = 0; idx_in < nchan_in; idx_in++ )
        {
            if ( idx_in != lfe_idx_in )
            {
#ifdef USE_SYMETRIC_HRIR_FILTERS
                if ( ( pCrend->hHrtfCrend->ch_sum_diff[idx_in] < 0 ) || ( j == pCrend->hHrtfCrend->ch_sum_diff[idx_in] ) )
                {
#endif
                    offset = 0;
#ifdef USE_SYMETRIC_HRIR_FILTERS
                    for ( m = 0; m < pCrend->hHrtfCrend->num_iterations[i][idx_j]; m++ )
                    {
                        offset_in = ( pCrend->hCrend->delay_line_rw_index + pCrend->hHrtfCrend->max_num_iterations - pCrend->hHrtfCrend->num_iterations[i][idx_j] + m + 1 );
                        offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations );
                        offset_in = offset_in * subframe_length;
                        pFreq_buf_re = &pCrend->hCrend->freq_buffer_re[i][offset_in];
                        pFreq_buf_im = &pCrend->hCrend->freq_buffer_im[i][offset_in];
                        pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re[i][idx_j][offset];
                        pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im[i][idx_j][offset];

                        for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][idx_j][m]; k++ )
                        {
                            tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k];
                            tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k];
                        }
                        /*       for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][idx_j][m]; k++ )
                               {
                                   tmp_out_re[k] += pFreq_buf_re[k];
                                   tmp_out_im[k] += pFreq_buf_im[k];
                               }*/
                        offset = offset + k;
                    }
#else
                for ( m = 0; m < pCrend->hHrtfCrend->num_iterations[i][j]; m++ )
                {
                    offset_in = ( pCrend->hCrend->delay_line_rw_index + pCrend->hHrtfCrend->max_num_iterations - pCrend->hHrtfCrend->num_iterations[i][j] + m + 1 );
@@ -1044,8 +1243,18 @@ static ivas_error ivas_rend_crendConvolver(
                        tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k];
                        tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k];
                    }
                    /*       for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][idx_j][m]; k++ )
                           {
                               tmp_out_re[k] += pFreq_buf_re[k];
                               tmp_out_im[k] += pFreq_buf_im[k];
                           }*/
                    offset = offset + k;
                }

#endif
#ifdef USE_SYMETRIC_HRIR_FILTERS
                }
#endif
                i++;
            }
        }
@@ -1079,6 +1288,19 @@ static ivas_error ivas_rend_crendConvolver(
        }
    }

#ifdef USE_SYMETRIC_HRIR_FILTERS
    if ( pCrend->hHrtfCrend->ch_sum_diff[0] >= 0 )
    {
        pFreq_buf_re = &pcm_out[0][i_ts * subframe_length];
        pFreq_buf_im = &pcm_out[1][i_ts * subframe_length];
        for ( k = 0; k < subframe_length; k++ )
        {
            tmp_out_re[0] = pFreq_buf_re[k];
            pFreq_buf_re[k] = ( pFreq_buf_re[k] - pFreq_buf_im[k] );
            pFreq_buf_im[k] = ( tmp_out_re[0] + pFreq_buf_im[k] );
        }
    }
#endif
    pCrend->hCrend->delay_line_rw_index++;
    pCrend->hCrend->delay_line_rw_index = pCrend->hCrend->delay_line_rw_index % ( pCrend->hHrtfCrend->max_num_iterations );
    if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
+649 −1363

File changed.

Preview size limit exceeded, changes collapsed.

+75 −72

File changed.

Preview size limit exceeded, changes collapsed.

+5 −0
Original line number Diff line number Diff line
@@ -651,6 +651,11 @@ typedef struct ivas_hrtfs_structure
    int16_t max_num_iterations;
    float inv_diffuse_weight[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */
    float gain_lfe;
#ifdef USE_SYMETRIC_HRIR_FILTERS
    int16_t ch_sum_diff[MAX_INTERN_CHANNELS];
    int16_t ch_sum_diff_pair[MAX_INTERN_CHANNELS];
#endif


} HRTFS_DATA, *HRTFS_HANDLE;

+97 −36
Original line number Diff line number Diff line
@@ -66,24 +66,6 @@

int32_t sample_rates[3] = { DEFAULT_SAMPLERATE, 32000, 16000 }; /* Hz */ /* 8000 Hz not supported by mdft */

/* ------------------------------------------------------------------------------------------
 * Struct
 *------------------------------------------------------------------------------------------ */

struct ivas_layout_config
{
    char name[32];
    int nb_channel;
    float azi[MAX_CICP_CHANNELS];
    float ele[MAX_CICP_CHANNELS];
    int16_t isloudspeaker;
    int16_t sba_order;
    int16_t num_lfe;
    int16_t lfe_index[2];
    float gain_lfe;
};


/*---------------------------------------------------------------------*
 * Local function prototypes
 *---------------------------------------------------------------------*/
@@ -387,7 +369,6 @@ int main( int argc, char *argv[] )
        fprintf( fp, "\n#ifndef _%s_\n", to_upper( rom_file_name ) );
        fprintf( fp, "#define _%s_\n", to_upper( rom_file_name ) );
        fprintf( fp, "\n#include <stdint.h>\n#include \"cnst.h\"\n#include \"ivas_cnst.h\"\n" );
        fprintf( fp, "\nextern const uint16_t  %s_Use_Symetric_Filters;", DECLARATION_NAME );
        fclose( fp );
    }

@@ -395,15 +376,37 @@ int main( int argc, char *argv[] )
    if ( fp )
    {
        fprintf( fp, "\n#include <stdint.h>\n#include <stddef.h>\n#include \"cnst.h\"\n#include \"ivas_cnst.h\"\n\n#define WMC_TOOL_SKIP\n" );
        fprintf( fp, "\nconst uint16_t %s_Use_Symetric_Filters = %d; /* 0 not symetric, 1 left, 2 right */", DECLARATION_NAME, sym_hrir + 1 );

        fclose( fp );
    }

    int err = 0;
    int current_sym_hrir = sym_hrir;
    for ( ; i < argc; i++ )
    {
        err = generate_crend_ivas_tables_from_sofa( argv[i], no_optim, sym_hrir );
        const char *cTmp = argv[i];
        current_sym_hrir = sym_hrir;
        if ( ( argv[i + 1] != NULL ) && ( argv[i + 1][0] == '-' ) )
        {
            if ( strcmp( to_upper( argv[i + 1] ), "-LEFT" ) == 0 )
            {
                current_sym_hrir = 0;
                i++;
            }
            else if ( strcmp( to_upper( argv[i + 1] ), "-RIGHT" ) == 0 )
            {
                current_sym_hrir = 1;
                i++;
            }
            else
            {
                fprintf( stderr, "Unknown option: %s need to specify frame length in ms 5 or 20\n\n", argv[i + 1] );
                usage_gen_crend_tables();
                if ( lib_rend_path )
                    free( lib_rend_path );
                return -1;
            }
        }
        err = generate_crend_ivas_tables_from_sofa( cTmp, no_optim, current_sym_hrir );
        if ( err != 0 )
            return err;
    }
@@ -816,6 +819,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim,
        }

        HRTFS_DATA hrtf_data = { 0 };

        int32_t index_start, index_end, max_ir_len;

        hrtf_data.max_num_ir = ivas_hrtf->m;
@@ -826,7 +830,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim,
            hrtf_data.latency_s = latency_48k_optim;
        }

        if ( ( hrtf_data.num_iterations[0][0] > 2 ) && ( no_optim == false ) )
        if ( ( hrtf_data.num_iterations[0][sym_hrir < 0 ? 0 : sym_hrir] > 2 ) && ( no_optim == false ) )
        {
            ivas_crend_binaural_filter_design_compute_filters_params( ivas_hrtf, sym_hrir, frame_len, &hrtf_data, &index_start, &index_end, &max_ir_len );
            ivas_crend_binaural_filter_design_set_hrtf_fr( ivas_hrtf, sym_hrir, frame_len, &hrtf_data, index_start, index_end, &max_ir_len );
@@ -840,7 +844,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim,
        hrtf_data.latency_s += 0.000000001f;
#endif

        if ( ( hrtf_data.num_iterations[0][0] > 2 ) )
        if ( ( hrtf_data.num_iterations[0][sym_hrir < 0 ? 0 : sym_hrir] > 2 ) )
        {
            strcpy( &lscfg.name[len_ls_cfg_name], "_BRIR" );
        }
@@ -1008,27 +1012,36 @@ void write_array_uint16_to_file( FILE *fp, uint16_t *vec, int32_t size_vec, int3
/*---------------------------------------------------------------------*
 *update_c_file();
 *---------------------------------------------------------------------*/
void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int32_t samplerate, const int16_t frame_len, const int16_t sym_hrir )
void update_c_file( HRTFS_DATA *hrtf_in, struct ivas_layout_config lscfg, const int32_t samplerate, const int16_t frame_len, const int16_t sym_hrir )
{

    FILE *fp = fopen( c_file_path, "a" );
    int16_t i, j, nb_ear;
    uint32_t *pTotalNumFreqSampPerIterations[2], maxTotalNumFreqSampPerIterations;
    uint32_t pTotalNumFreqSampPerIterationsDiffuse[2], maxTotalNumFreqSampPerIterationsDiffuse;

    pTotalNumFreqSampPerIterations[0] = malloc( sizeof( float ) * hrtf->max_num_ir );
    pTotalNumFreqSampPerIterations[1] = malloc( sizeof( float ) * hrtf->max_num_ir );
    HRTFS_DATA *hrtf = NULL;

    if ( fp == NULL )
        return;
    if ( hrtf == NULL )
    if ( hrtf_in == NULL )
        return;

    if ( sym_hrir >= 0 )
    {
        ivas_crend_binaural_filter_design_convert_filters_to_sum_diff( hrtf_in, sym_hrir, frame_len, lscfg, &hrtf );
    }
    else
    {
        hrtf = hrtf_in;
    }

    nb_ear = sym_hrir < 0 ? 2 : 1;
    if ( samplerate == DEFAULT_SAMPLERATE )
    {
        /* float latency_s; */
        fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name );

        fprintf( fp, "\nconst uint16_t %s_%s_Use_Symetric_Filters = %d; /* 0 not symetric, 1 left, 2 right */", DECLARATION_NAME, lscfg.name, sym_hrir + 1 );
#ifdef FIX_BINAURAL_DELAY_PRECISION
        fprintf( fp, "\n#ifdef FIX_BINAURAL_DELAY_PRECISION\nconst float %s_%s_latency_s = %10.9ff;\n#else", DECLARATION_NAME, lscfg.name, hrtf->latency_s );
        fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;\n#endif", DECLARATION_NAME, lscfg.name, hrtf->latency_s - 0.000000001f );
@@ -1063,6 +1076,10 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
    else
        fprintf( fp, "\nconst uint16_t %s_%s_num_iterations_diffuse_%2dkHz[%d] = {%u};", DECLARATION_NAME, lscfg.name, samplerate / 1000, nb_ear, hrtf->num_iterations_diffuse[sym_hrir] );


    pTotalNumFreqSampPerIterations[0] = malloc( sizeof( uint32_t ) * hrtf_in->max_num_ir );
    pTotalNumFreqSampPerIterations[1] = malloc( sizeof( uint32_t ) * hrtf_in->max_num_ir );

    maxTotalNumFreqSampPerIterations = 0;
    for ( i = 0; i < hrtf->max_num_ir; i++ )
    {
@@ -1204,9 +1221,9 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
        write_array_float_to_file( fp, hrtf->pOut_to_bin_re[i][1], pTotalNumFreqSampPerIterations[1][i], NUM_SAMPLES_PER_LINES, FORMAT_FLOAT, 2, TAB_WITH_SPACE_OR_NOT );
    }
    if ( nb_ear == 2 )
        fprintf( fp, "\n%s},", TAB_WITH_SPACE_OR_NOT );
        fprintf( fp, "\n%s}", TAB_WITH_SPACE_OR_NOT );
    else
        fprintf( fp, "%s},", TAB_WITH_SPACE_OR_NOT );
        fprintf( fp, "%s}", TAB_WITH_SPACE_OR_NOT );
    fprintf( fp, "\n};" );

    fprintf( fp, "\nconst float %s_%s_coeff_im_%2dkHz[%d][%d][%u]={", DECLARATION_NAME, lscfg.name, samplerate / 1000, hrtf->max_num_ir, nb_ear, maxTotalNumFreqSampPerIterations );
@@ -1240,9 +1257,9 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
        write_array_float_to_file( fp, hrtf->pOut_to_bin_im[i][1], pTotalNumFreqSampPerIterations[1][i], NUM_SAMPLES_PER_LINES, FORMAT_FLOAT, 2, TAB_WITH_SPACE_OR_NOT );
    }
    if ( nb_ear == 2 )
        fprintf( fp, "\n%s},", TAB_WITH_SPACE_OR_NOT );
        fprintf( fp, "\n%s}", TAB_WITH_SPACE_OR_NOT );
    else
        fprintf( fp, "%s},", TAB_WITH_SPACE_OR_NOT );
        fprintf( fp, "%s}", TAB_WITH_SPACE_OR_NOT );
    fprintf( fp, "\n};" );

    /*   float *pOut_to_bin_diffuse_re[BINAURAL_CHANNELS];*/
@@ -1304,7 +1321,7 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
    {
        free( pTotalNumFreqSampPerIterations[1] );
    }

    ivas_hrtf_close( hrtf );
    return;
}

@@ -1374,6 +1391,7 @@ void update_h_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
    {
        /* float latency_s; */
        fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name );
        fprintf( fp, "\nextern uint16_t %s_%s_Use_Symetric_Filters;", DECLARATION_NAME, lscfg.name );
        fprintf( fp, "\nextern float %s_%s_latency_s;", DECLARATION_NAME, lscfg.name );
    }

@@ -1382,7 +1400,7 @@ void update_h_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
    /* int16_t max_num_iterations; */
    fprintf( fp, "\nextern int16_t %s_%s_max_num_iterations_%2dkHz;", DECLARATION_NAME, lscfg.name, samplerate / 1000 );
    /*    uint16_t num_iterations[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS];*/
    fprintf( fp, "\nextern uint16_t %s_%s_num_iterations_%2dkHz[%d][%d];", DECLARATION_NAME, lscfg.name, samplerate / 1000, nb_ear, hrtf->max_num_ir );
    fprintf( fp, "\nextern uint16_t %s_%s_num_iterations_%2dkHz[%d][%d];", DECLARATION_NAME, lscfg.name, samplerate / 1000, hrtf->max_num_ir, nb_ear );

    /*  uint16_t num_iterations_diffuse[BINAURAL_CHANNELS];*/
    fprintf( fp, "\nextern uint16_t %s_%s_num_iterations_diffuse_%2dkHz[%d];", DECLARATION_NAME, lscfg.name, samplerate / 1000, nb_ear );
@@ -1476,7 +1494,9 @@ char *to_upper(
 *---------------------------------------------------------------------*/
void get_ls_layout_config( IVAS_DEC_AUDIO_CONFIG ls_layout_config, struct ivas_layout_config *ls_struct )
{

    int16_t ind, curComp = 0;
    int16_t nbCompForCurrentOrder = 1;
    int16_t curOrder = 0;
    memset( ls_struct, 0, sizeof( struct ivas_layout_config ) );

    switch ( ls_layout_config )
@@ -1594,6 +1614,47 @@ void get_ls_layout_config( IVAS_DEC_AUDIO_CONFIG ls_layout_config, struct ivas_l
        }
        break;
    }
    if ( ls_struct->isloudspeaker )
    {
        for ( ind = 0; ind < ls_struct->nb_channel; ind++ )
        {
            ls_struct->sum_diff[ind] = ( ls_struct->azi[ind] >= 0 ) ? 0 : 1;
            if ( ind < 2 )
            {
                ls_struct->sum_diff_pair[ind] = ind == 0 ? 1 : 0;
            }
            else if ( ind == 2 )
            {
                ls_struct->sum_diff_pair[ind] = 2;
            }
            else
            {
                ls_struct->sum_diff_pair[ind] = ind % 2 ? ind + 1 : ind - 1;
            }
        }
    }
    else
    {
        for ( ind = 0; ind < ls_struct->nb_channel; ind++ )
        {
            if ( curComp < curOrder )
            {
                ls_struct->sum_diff[ind] = 1;
            }
            else
            {
                ls_struct->sum_diff[ind] = 0;
            }

            curComp++;
            if ( curComp == nbCompForCurrentOrder )
            {
                curOrder++;
                curComp = 0;
                nbCompForCurrentOrder = 2 * curOrder + 1;
            }
        }
    }

    return;
}
Loading