Loading apps/renderer.c +6 −0 Original line number Diff line number Diff line Loading @@ -1393,6 +1393,12 @@ static bool parseLfeConfig( } values[nvalues] = (float) atof( tok ); nvalues++; /* ignore any additionally specified values */ if ( nvalues == 3 ) { break; } } if ( nvalues != 3 ) Loading lib_rend/lib_rend.c +106 −96 Original line number Diff line number Diff line Loading @@ -1363,6 +1363,97 @@ static bool configsAreEqual( return configA == configB; } #ifdef REND_CFG_LFE static ivas_error updateLfePanGainsForMcOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i, numLfeIn, numOutChannels; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); if ( outConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { numOutChannels = inputMc->base.ctx.pCustomLsOut->num_spk + inputMc->base.ctx.pCustomLsOut->num_lfe; } else { if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) { return error; } } for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ if ( ( error = getEfapGains( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i] ) ) != IVAS_ERR_OK ) { return error; } /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], numOutChannels ); } return error; } static ivas_error updateLfePanGainsForAmbiOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i; int16_t numLfeIn, outAmbiOrder; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } if ( ( error = getAmbisonicsOrder( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ ivas_dirac_dec_get_response( inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i], outAmbiOrder ); /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], IVAS_MAX_OUTPUT_CHANNELS ); } return error; } #endif static ivas_error updateMcPanGainsForMcOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) Loading Loading @@ -1404,6 +1495,17 @@ static ivas_error updateMcPanGainsForMcOut( error = initMcPanGainsWithConversionMapping( inputMc, outConfig ); } #ifdef REND_CFG_LFE /* check for errors from above block */ if ( error != IVAS_ERR_OK ) { return error; } /* update LFE panning */ error = updateLfePanGainsForMcOut( inputMc, outConfig ); #endif return error; } Loading Loading @@ -1466,99 +1568,16 @@ static ivas_error updateMcPanGainsForAmbiOut( } } return IVAS_ERR_OK; } #ifdef REND_CFG_LFE static ivas_error updateLfePanGainsForMcOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i, numLfeIn, numOutChannels; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); if ( outConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { numOutChannels = inputMc->base.ctx.pCustomLsOut->num_spk + inputMc->base.ctx.pCustomLsOut->num_lfe; } else { if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) { return error; } } for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ if ( ( error = getEfapGains( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i] ) ) != IVAS_ERR_OK ) { return error; } /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], numOutChannels ); } return error; } static ivas_error updateLfePanGainsForAmbiOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i; int16_t numLfeIn, outAmbiOrder; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } if ( ( error = getAmbisonicsOrder( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) /* update LFE panning */ if ( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ) != IVAS_ERR_OK ) { return error; } #endif numLfeIn = getNumLfeChannels( inputMc ); for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ ivas_dirac_dec_get_response( inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i], outAmbiOrder ); /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], IVAS_MAX_OUTPUT_CHANNELS ); } return error; return IVAS_ERR_OK; } #endif static ivas_error updateMcPanGains( input_mc *inputMc, Loading @@ -1575,15 +1594,9 @@ static ivas_error updateMcPanGains( { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: error = updateMcPanGainsForMcOut( inputMc, outConfig ); #ifdef REND_CFG_LFE error = updateLfePanGainsForMcOut( inputMc, outConfig ); #endif break; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: error = updateMcPanGainsForAmbiOut( inputMc, outConfig ); #ifdef REND_CFG_LFE error = updateLfePanGainsForAmbiOut( inputMc, outConfig ); #endif break; case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) Loading @@ -1593,9 +1606,6 @@ static ivas_error updateMcPanGains( case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: /* Prepare rendering to intermediate format */ error = updateMcPanGainsForMcOut( inputMc, IVAS_REND_AUDIO_CONFIG_7_1_4 ); #ifdef REND_CFG_LFE error = updateLfePanGainsForMcOut( inputMc, outConfig ); #endif break; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; Loading Loading
apps/renderer.c +6 −0 Original line number Diff line number Diff line Loading @@ -1393,6 +1393,12 @@ static bool parseLfeConfig( } values[nvalues] = (float) atof( tok ); nvalues++; /* ignore any additionally specified values */ if ( nvalues == 3 ) { break; } } if ( nvalues != 3 ) Loading
lib_rend/lib_rend.c +106 −96 Original line number Diff line number Diff line Loading @@ -1363,6 +1363,97 @@ static bool configsAreEqual( return configA == configB; } #ifdef REND_CFG_LFE static ivas_error updateLfePanGainsForMcOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i, numLfeIn, numOutChannels; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); if ( outConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { numOutChannels = inputMc->base.ctx.pCustomLsOut->num_spk + inputMc->base.ctx.pCustomLsOut->num_lfe; } else { if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) { return error; } } for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ if ( ( error = getEfapGains( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i] ) ) != IVAS_ERR_OK ) { return error; } /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], numOutChannels ); } return error; } static ivas_error updateLfePanGainsForAmbiOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i; int16_t numLfeIn, outAmbiOrder; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } if ( ( error = getAmbisonicsOrder( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ ivas_dirac_dec_get_response( inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i], outAmbiOrder ); /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], IVAS_MAX_OUTPUT_CHANNELS ); } return error; } #endif static ivas_error updateMcPanGainsForMcOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) Loading Loading @@ -1404,6 +1495,17 @@ static ivas_error updateMcPanGainsForMcOut( error = initMcPanGainsWithConversionMapping( inputMc, outConfig ); } #ifdef REND_CFG_LFE /* check for errors from above block */ if ( error != IVAS_ERR_OK ) { return error; } /* update LFE panning */ error = updateLfePanGainsForMcOut( inputMc, outConfig ); #endif return error; } Loading Loading @@ -1466,99 +1568,16 @@ static ivas_error updateMcPanGainsForAmbiOut( } } return IVAS_ERR_OK; } #ifdef REND_CFG_LFE static ivas_error updateLfePanGainsForMcOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i, numLfeIn, numOutChannels; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); if ( outConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { numOutChannels = inputMc->base.ctx.pCustomLsOut->num_spk + inputMc->base.ctx.pCustomLsOut->num_lfe; } else { if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) { return error; } } for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ if ( ( error = getEfapGains( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i] ) ) != IVAS_ERR_OK ) { return error; } /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], numOutChannels ); } return error; } static ivas_error updateLfePanGainsForAmbiOut( input_mc *inputMc, const IVAS_REND_AudioConfig outConfig ) { int16_t i; int16_t numLfeIn, outAmbiOrder; ivas_error error; error = IVAS_ERR_OK; /* If panning is not required, simply return */ if ( !inputMc->lfeRouting.pan_lfe ) { return error; } if ( ( error = getAmbisonicsOrder( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) /* update LFE panning */ if ( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ) != IVAS_ERR_OK ) { return error; } #endif numLfeIn = getNumLfeChannels( inputMc ); for ( i = 0; i < numLfeIn; i++ ) { /* panning gains */ ivas_dirac_dec_get_response( inputMc->lfeRouting.lfeOutputAzimuth, inputMc->lfeRouting.lfeOutputElevation, inputMc->lfeRouting.lfeOutputGains[i], outAmbiOrder ); /* linear input gain */ v_multc( inputMc->lfeRouting.lfeOutputGains[i], inputMc->lfeRouting.lfeInputGain, inputMc->lfeRouting.lfeOutputGains[i], IVAS_MAX_OUTPUT_CHANNELS ); } return error; return IVAS_ERR_OK; } #endif static ivas_error updateMcPanGains( input_mc *inputMc, Loading @@ -1575,15 +1594,9 @@ static ivas_error updateMcPanGains( { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: error = updateMcPanGainsForMcOut( inputMc, outConfig ); #ifdef REND_CFG_LFE error = updateLfePanGainsForMcOut( inputMc, outConfig ); #endif break; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: error = updateMcPanGainsForAmbiOut( inputMc, outConfig ); #ifdef REND_CFG_LFE error = updateLfePanGainsForAmbiOut( inputMc, outConfig ); #endif break; case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) Loading @@ -1593,9 +1606,6 @@ static ivas_error updateMcPanGains( case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: /* Prepare rendering to intermediate format */ error = updateMcPanGainsForMcOut( inputMc, IVAS_REND_AUDIO_CONFIG_7_1_4 ); #ifdef REND_CFG_LFE error = updateLfePanGainsForMcOut( inputMc, outConfig ); #endif break; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; Loading