Loading media/libeffects/loudness/EffectLoudnessEnhancer.cpp +47 −10 Original line number Diff line number Diff line Loading @@ -30,6 +30,26 @@ #include <audio_effects/effect_loudnessenhancer.h> #include "dsp/core/dynamic_range_compression.h" // BUILD_FLOAT targets building a float effect instead of the legacy int16_t effect. #define BUILD_FLOAT #ifdef BUILD_FLOAT static constexpr audio_format_t kProcessFormat = AUDIO_FORMAT_PCM_FLOAT; #else static constexpr audio_format_t kProcessFormat = AUDIO_FORMAT_PCM_16_BIT; static inline int16_t clamp16(int32_t sample) { if ((sample>>15) ^ (sample>>31)) sample = 0x7FFF ^ (sample>>31); return sample; } #endif // BUILD_FLOAT extern "C" { // effect_handle_t interface implementation for LE effect Loading Loading @@ -80,13 +100,6 @@ void LE_reset(LoudnessEnhancerContext *pContext) } } static inline int16_t clamp16(int32_t sample) { if ((sample>>15) ^ (sample>>31)) sample = 0x7FFF ^ (sample>>31); return sample; } //---------------------------------------------------------------------------- // LE_setConfig() //---------------------------------------------------------------------------- Loading @@ -111,7 +124,7 @@ int LE_setConfig(LoudnessEnhancerContext *pContext, effect_config_t *pConfig) if (pConfig->inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO) return -EINVAL; if (pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_WRITE && pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_ACCUMULATE) return -EINVAL; if (pConfig->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) return -EINVAL; if (pConfig->inputCfg.format != kProcessFormat) return -EINVAL; pContext->mConfig = *pConfig; Loading Loading @@ -159,7 +172,7 @@ int LE_init(LoudnessEnhancerContext *pContext) pContext->mConfig.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; pContext->mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; pContext->mConfig.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; pContext->mConfig.inputCfg.format = kProcessFormat; pContext->mConfig.inputCfg.samplingRate = 44100; pContext->mConfig.inputCfg.bufferProvider.getBuffer = NULL; pContext->mConfig.inputCfg.bufferProvider.releaseBuffer = NULL; Loading @@ -167,7 +180,7 @@ int LE_init(LoudnessEnhancerContext *pContext) pContext->mConfig.inputCfg.mask = EFFECT_CONFIG_ALL; pContext->mConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; pContext->mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; pContext->mConfig.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; pContext->mConfig.outputCfg.format = kProcessFormat; pContext->mConfig.outputCfg.samplingRate = 44100; pContext->mConfig.outputCfg.bufferProvider.getBuffer = NULL; pContext->mConfig.outputCfg.bufferProvider.releaseBuffer = NULL; Loading Loading @@ -284,18 +297,41 @@ int LE_process( //ALOGV("LE about to process %d samples", inBuffer->frameCount); uint16_t inIdx; #ifdef BUILD_FLOAT constexpr float scale = 1 << 15; // power of 2 is lossless conversion to int16_t range constexpr float inverseScale = 1.f / scale; const float inputAmp = pow(10, pContext->mTargetGainmB/2000.0f) * scale; #else float inputAmp = pow(10, pContext->mTargetGainmB/2000.0f); #endif float leftSample, rightSample; for (inIdx = 0 ; inIdx < inBuffer->frameCount ; inIdx++) { // makeup gain is applied on the input of the compressor #ifdef BUILD_FLOAT leftSample = inputAmp * inBuffer->f32[2*inIdx]; rightSample = inputAmp * inBuffer->f32[2*inIdx +1]; pContext->mCompressor->Compress(&leftSample, &rightSample); inBuffer->f32[2*inIdx] = leftSample * inverseScale; inBuffer->f32[2*inIdx +1] = rightSample * inverseScale; #else leftSample = inputAmp * (float)inBuffer->s16[2*inIdx]; rightSample = inputAmp * (float)inBuffer->s16[2*inIdx +1]; pContext->mCompressor->Compress(&leftSample, &rightSample); inBuffer->s16[2*inIdx] = (int16_t) leftSample; inBuffer->s16[2*inIdx +1] = (int16_t) rightSample; #endif // BUILD_FLOAT } if (inBuffer->raw != outBuffer->raw) { #ifdef BUILD_FLOAT if (pContext->mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { for (size_t i = 0; i < outBuffer->frameCount*2; i++) { outBuffer->f32[i] += inBuffer->f32[i]; } } else { memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount * 2 * sizeof(float)); } #else if (pContext->mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { for (size_t i = 0; i < outBuffer->frameCount*2; i++) { outBuffer->s16[i] = clamp16(outBuffer->s16[i] + inBuffer->s16[i]); Loading @@ -303,6 +339,7 @@ int LE_process( } else { memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount * 2 * sizeof(int16_t)); } #endif // BUILD_FLOAT } if (pContext->mState != LOUDNESS_ENHANCER_STATE_ACTIVE) { return -ENODATA; Loading Loading
media/libeffects/loudness/EffectLoudnessEnhancer.cpp +47 −10 Original line number Diff line number Diff line Loading @@ -30,6 +30,26 @@ #include <audio_effects/effect_loudnessenhancer.h> #include "dsp/core/dynamic_range_compression.h" // BUILD_FLOAT targets building a float effect instead of the legacy int16_t effect. #define BUILD_FLOAT #ifdef BUILD_FLOAT static constexpr audio_format_t kProcessFormat = AUDIO_FORMAT_PCM_FLOAT; #else static constexpr audio_format_t kProcessFormat = AUDIO_FORMAT_PCM_16_BIT; static inline int16_t clamp16(int32_t sample) { if ((sample>>15) ^ (sample>>31)) sample = 0x7FFF ^ (sample>>31); return sample; } #endif // BUILD_FLOAT extern "C" { // effect_handle_t interface implementation for LE effect Loading Loading @@ -80,13 +100,6 @@ void LE_reset(LoudnessEnhancerContext *pContext) } } static inline int16_t clamp16(int32_t sample) { if ((sample>>15) ^ (sample>>31)) sample = 0x7FFF ^ (sample>>31); return sample; } //---------------------------------------------------------------------------- // LE_setConfig() //---------------------------------------------------------------------------- Loading @@ -111,7 +124,7 @@ int LE_setConfig(LoudnessEnhancerContext *pContext, effect_config_t *pConfig) if (pConfig->inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO) return -EINVAL; if (pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_WRITE && pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_ACCUMULATE) return -EINVAL; if (pConfig->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) return -EINVAL; if (pConfig->inputCfg.format != kProcessFormat) return -EINVAL; pContext->mConfig = *pConfig; Loading Loading @@ -159,7 +172,7 @@ int LE_init(LoudnessEnhancerContext *pContext) pContext->mConfig.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; pContext->mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; pContext->mConfig.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; pContext->mConfig.inputCfg.format = kProcessFormat; pContext->mConfig.inputCfg.samplingRate = 44100; pContext->mConfig.inputCfg.bufferProvider.getBuffer = NULL; pContext->mConfig.inputCfg.bufferProvider.releaseBuffer = NULL; Loading @@ -167,7 +180,7 @@ int LE_init(LoudnessEnhancerContext *pContext) pContext->mConfig.inputCfg.mask = EFFECT_CONFIG_ALL; pContext->mConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; pContext->mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; pContext->mConfig.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; pContext->mConfig.outputCfg.format = kProcessFormat; pContext->mConfig.outputCfg.samplingRate = 44100; pContext->mConfig.outputCfg.bufferProvider.getBuffer = NULL; pContext->mConfig.outputCfg.bufferProvider.releaseBuffer = NULL; Loading Loading @@ -284,18 +297,41 @@ int LE_process( //ALOGV("LE about to process %d samples", inBuffer->frameCount); uint16_t inIdx; #ifdef BUILD_FLOAT constexpr float scale = 1 << 15; // power of 2 is lossless conversion to int16_t range constexpr float inverseScale = 1.f / scale; const float inputAmp = pow(10, pContext->mTargetGainmB/2000.0f) * scale; #else float inputAmp = pow(10, pContext->mTargetGainmB/2000.0f); #endif float leftSample, rightSample; for (inIdx = 0 ; inIdx < inBuffer->frameCount ; inIdx++) { // makeup gain is applied on the input of the compressor #ifdef BUILD_FLOAT leftSample = inputAmp * inBuffer->f32[2*inIdx]; rightSample = inputAmp * inBuffer->f32[2*inIdx +1]; pContext->mCompressor->Compress(&leftSample, &rightSample); inBuffer->f32[2*inIdx] = leftSample * inverseScale; inBuffer->f32[2*inIdx +1] = rightSample * inverseScale; #else leftSample = inputAmp * (float)inBuffer->s16[2*inIdx]; rightSample = inputAmp * (float)inBuffer->s16[2*inIdx +1]; pContext->mCompressor->Compress(&leftSample, &rightSample); inBuffer->s16[2*inIdx] = (int16_t) leftSample; inBuffer->s16[2*inIdx +1] = (int16_t) rightSample; #endif // BUILD_FLOAT } if (inBuffer->raw != outBuffer->raw) { #ifdef BUILD_FLOAT if (pContext->mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { for (size_t i = 0; i < outBuffer->frameCount*2; i++) { outBuffer->f32[i] += inBuffer->f32[i]; } } else { memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount * 2 * sizeof(float)); } #else if (pContext->mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { for (size_t i = 0; i < outBuffer->frameCount*2; i++) { outBuffer->s16[i] = clamp16(outBuffer->s16[i] + inBuffer->s16[i]); Loading @@ -303,6 +339,7 @@ int LE_process( } else { memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount * 2 * sizeof(int16_t)); } #endif // BUILD_FLOAT } if (pContext->mState != LOUDNESS_ENHANCER_STATE_ACTIVE) { return -ENODATA; Loading