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

Commit 5dc65e2c authored by Eric Laurent's avatar Eric Laurent
Browse files

Fix problem in lvm effect bundle wrapper.

When an effect is disabled, the process function should either
copy or accumulate the content of the input buffer to the output buffer
depending on the behavior requested by the framework.
Current implementation is copying the input buffer unconditionally.

Related to issue 5433942.

Change-Id: Ic488ca97eadcc4c763de570d7e6c6f5b7a979415
parent 09ebde72
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -49,6 +49,16 @@ extern "C" const struct effect_interface_s gLvmEffectInterface;
        }\
    }


static inline int16_t clamp16(int32_t sample)
{
    // check overflow for both positive and negative values:
    // all bits above short range must me equal to sign bit
    if ((sample>>15) ^ (sample>>31))
        sample = 0x7FFF ^ (sample>>31);
    return sample;
}

// Namespaces
namespace android {
namespace {
@@ -707,13 +717,6 @@ int LvmBundle_init(EffectContext *pContext){
}   /* end LvmBundle_init */


static inline int16_t clamp16(int32_t sample)
{
    if ((sample>>15) ^ (sample>>31))
        sample = 0x7FFF ^ (sample>>31);
    return sample;
}

//----------------------------------------------------------------------------
// LvmBundle_process()
//----------------------------------------------------------------------------
@@ -2688,8 +2691,15 @@ int Effect_process(effect_handle_t self,
        //pContext->pBundledContext->NumberEffectsEnabled,
        //pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType);
        // 2 is for stereo input
        if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
            for (size_t i=0; i < outBuffer->frameCount*2; i++){
                outBuffer->s16[i] =
                        clamp16((LVM_INT32)outBuffer->s16[i] + (LVM_INT32)inBuffer->s16[i]);
            }
        } else {
            memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount*sizeof(LVM_INT16)*2);
        }
    }

    return status;
}   /* end Effect_process */