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

Commit f6a37c0a authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Gerrit Code Review
Browse files

Merge "Use smooth fade in/out for effect enable/disable" into gingerbread

parents 3e58fc81 e2ba63b6
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -107,13 +107,3 @@ int32_t Effect::command(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, uint

    return 0;
}

/* This implementation removes the effect at earliest opportunity. */
int32_t Effect::process(audio_buffer_t *in, audio_buffer_t *out)
{
    int32_t status = process_effect(in, out);
    if (! mEnable && status == 0) {
        status = -ENODATA;
    }
    return status;
}
+1 −2
Original line number Diff line number Diff line
@@ -105,7 +105,6 @@ class Effect {
    public:
    Effect();
    virtual ~Effect();
    int32_t process(audio_buffer_t *in, audio_buffer_t *out);
    virtual int32_t process(audio_buffer_t *in, audio_buffer_t *out) = 0;
    virtual int32_t command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData, uint32_t* replySize, void* pReplyData) = 0;
    virtual int32_t process_effect(audio_buffer_t *in, audio_buffer_t *out) = 0;
};
+2 −2
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ void EffectBassBoost::refreshStrength()
    mBoost.setLowPass(55.0f, mSamplingRate, 0.5f + mStrength / 666.0f);
}

int32_t EffectBassBoost::process_effect(audio_buffer_t* in, audio_buffer_t* out)
int32_t EffectBassBoost::process(audio_buffer_t* in, audio_buffer_t* out)
{
    for (uint32_t i = 0; i < in->frameCount; i ++) {
        int32_t dryL = read(in, i * 2);
@@ -131,6 +131,6 @@ int32_t EffectBassBoost::process_effect(audio_buffer_t* in, audio_buffer_t* out)
        write(out, i * 2 + 1, dryR + boost);
    }

    return 0;
    return mEnable ? 0 : -ENODATA;
}
+1 −1
Original line number Diff line number Diff line
@@ -16,5 +16,5 @@ class EffectBassBoost : public Effect {
    EffectBassBoost();

    int32_t command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData, uint32_t* replySize, void* pReplyData);
    int32_t process_effect(audio_buffer_t *in, audio_buffer_t *out);
    int32_t process(audio_buffer_t *in, audio_buffer_t *out);
};
+29 −8
Original line number Diff line number Diff line
@@ -33,11 +33,11 @@ static int32_t max(int32_t a, int32_t b)
}

EffectCompression::EffectCompression()
    : mCompressionRatio(2.0)
    : mCompressionRatio(2.0), mFade(0)
{
    for (int32_t i = 0; i < 2; i ++) {
	mCurrentLevel[i] = 0;
	mUserVolumes[i] = 1 << 24;
	mUserLevel[i] = 1 << 24;
    }
}

@@ -78,14 +78,14 @@ int32_t EffectCompression::command(uint32_t cmdCode, uint32_t cmdSize, void* pCm
        return -1;
    }

    if (cmdCode == EFFECT_CMD_SET_VOLUME) {
    if (cmdCode == EFFECT_CMD_SET_VOLUME && cmdSize == 8) {
	LOGI("Setting volumes");

	if (pReplyData != NULL) {
	    int32_t *userVols = (int32_t *) pCmdData;
	    for (uint32_t i = 0; i < cmdSize / 4; i ++) {
                LOGI("user volume on channel %d: %d", i, userVols[i]);
		mUserVolumes[i] = userVols[i];
		mUserLevel[i] = userVols[i];
	    }

	    int32_t *myVols = (int32_t *) pReplyData;
@@ -96,13 +96,25 @@ int32_t EffectCompression::command(uint32_t cmdCode, uint32_t cmdSize, void* pCm
        } else {
	    /* We don't control volume. */
	    for (int32_t i = 0; i < 2; i ++) {
		mUserVolumes[i] = 1 << 24;
		mUserLevel[i] = 1 << 24;
	    }
	}

	return 0;
    }

    /* Init to current volume level on enabling effect to prevent
     * initial fade in / other shite */
    if (cmdCode == EFFECT_CMD_ENABLE) {
        LOGI("Copying user levels as initial loudness.");
        /* Unfortunately Android calls SET_VOLUME after ENABLE for us.
         * so we can't really use those volumes. It's safest just to fade in
         * each time. */
        for (int32_t i = 0; i < 2; i ++) {
             mCurrentLevel[i] = 0;
        }
    }

    return Effect::command(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
}

@@ -122,7 +134,7 @@ uint64_t EffectCompression::estimateOneChannelLevel(audio_buffer_t *in, int32_t
    return (power / in->frameCount);
}

int32_t EffectCompression::process_effect(audio_buffer_t *in, audio_buffer_t *out)
int32_t EffectCompression::process(audio_buffer_t *in, audio_buffer_t *out)
{
    /* Analyze both channels separately, pick the maximum power measured. */
    uint64_t maximumPowerSquared = 0;
@@ -146,6 +158,15 @@ int32_t EffectCompression::process_effect(audio_buffer_t *in, audio_buffer_t *ou
    /* turn back to multiplier */
    float correctionDb = desiredLevelDb - signalPowerDb;

    if (mEnable && mFade != 100) {
        mFade += 1;
    }
    if (!mEnable && mFade != 0) {
        mFade -= 1;
    }

    correctionDb *= mFade / 100.f;
    
    /* Reduce extreme boost by a smooth ramp.
     * New range -50 .. 0 dB */
    correctionDb -= powf(correctionDb/100, 2.0f) * (100.0f / 2.0f);
@@ -156,7 +177,7 @@ int32_t EffectCompression::process_effect(audio_buffer_t *in, audio_buffer_t *ou
    /* Now we have correction factor and user-desired sound level. */
    for (uint32_t i = 0; i < mChannels; i ++) {
	 /* 8.24 */
	int32_t desiredLevel = mUserVolumes[i] * correctionFactor >> 24;
	int32_t desiredLevel = mUserLevel[i] * correctionFactor >> 24;

        /* 8.24 */
	int32_t volAdj = desiredLevel - mCurrentLevel[i];
@@ -186,5 +207,5 @@ int32_t EffectCompression::process_effect(audio_buffer_t *in, audio_buffer_t *ou
	}
    }

    return 0;
    return mEnable || mFade != 0 ? 0 : -ENODATA;
}
Loading