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

Commit 2a6b80bc authored by Eric Laurent's avatar Eric Laurent
Browse files

Fixed several audio effects problems.

- Fixed constant inversions in AudioEffect.java
- Do not return error when enabling an already enabled effect
- Update cached effect state in native AudioEffect class when effect is enabled/disabled by command() method
- Remove click when restarting effect during disable sequence
- Fixed problem in master mute management when volume control is delegated to effect.

Change-Id: I6df4ce9fcc54fdc7345df858f639d20d802d6712
parent 8fb2e6e4
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -85290,7 +85290,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="1"
 value="0"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -85301,7 +85301,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="0"
 value="1"
 static="true"
 final="true"
 deprecated="not deprecated"
+6 −7
Original line number Diff line number Diff line
@@ -101,15 +101,15 @@ public class AudioEffect {
    public static final int STATE_INITIALIZED = 1;

    // to keep in sync with
    // frameworks/base/media/jni/audioeffect/android_media_AudioEffect.cpp
    // frameworks/base/include/media/AudioEffect.h
    /**
     * Event id for engine state change notification.
     * Event id for engine control ownership change notification.
     */
    public static final int NATIVE_EVENT_ENABLED_STATUS = 0;
    public static final int NATIVE_EVENT_CONTROL_STATUS = 0;
    /**
     * Event id for engine control ownership change notification.
     * Event id for engine state change notification.
     */
    public static final int NATIVE_EVENT_CONTROL_STATUS = 1;
    public static final int NATIVE_EVENT_ENABLED_STATUS = 1;
    /**
     * Event id for engine parameter change notification.
     */
@@ -795,7 +795,7 @@ public class AudioEffect {
    // Interface definitions
    // --------------------
    /**
     * The OnParameterChangeListener interface defines a method called by the AudioEffect
     * The OnEnableStatusChangeListener interface defines a method called by the AudioEffect
     * when a the enabled state of the effect engine was changed by the controlling application.
     */
    public interface OnEnableStatusChangeListener {
@@ -922,7 +922,6 @@ public class AudioEffect {
        if (effect == null) {
            return;
        }

        if (effect.mNativeEventHandler != null) {
            Message m = effect.mNativeEventHandler.obtainMessage(what, arg1,
                    arg2, obj);
+22 −3
Original line number Diff line number Diff line
@@ -218,7 +218,7 @@ status_t AudioEffect::setEnabled(bool enabled)
           return mIEffect->disable();
        }
    }
    return INVALID_OPERATION;
    return NO_ERROR;
}

status_t AudioEffect::command(uint32_t cmdCode,
@@ -231,7 +231,22 @@ status_t AudioEffect::command(uint32_t cmdCode,
        return INVALID_OPERATION;
    }

    return mIEffect->command(cmdCode, cmdSize, cmdData, replySize, replyData);
    status_t status = mIEffect->command(cmdCode, cmdSize, cmdData, replySize, replyData);
    if (status != NO_ERROR) {
        return status;
    }
    status = *(status_t *)replyData;
    if (status != NO_ERROR) {
        return status;
    }

    if (cmdCode == EFFECT_CMD_ENABLE) {
        android_atomic_or(1, &mEnabled);
    }
    if (cmdCode == EFFECT_CMD_DISABLE) {
        android_atomic_and(~1, &mEnabled);
    }
    return status;
}


@@ -347,7 +362,11 @@ void AudioEffect::enableStatusChanged(bool enabled)
{
    LOGV("enableStatusChanged %p enabled %d mCbf %p", this, enabled, mCbf);
    if (mStatus == ALREADY_EXISTS) {
        mEnabled = enabled;
        if (enabled) {
            android_atomic_or(1, &mEnabled);
        } else {
            android_atomic_and(~1, &mEnabled);
        }
        if (mCbf) {
            mCbf(EVENT_ENABLE_STATUS_CHANGED, mUserData, &enabled);
        }
+8 −5
Original line number Diff line number Diff line
@@ -1696,7 +1696,10 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
    // Delegate master volume control to effect in output mix effect chain if needed
    sp<EffectChain> chain = getEffectChain_l(AudioSystem::SESSION_OUTPUT_MIX);
    if (chain != 0) {
        uint32_t v = (uint32_t)(masterVolume * (1 << 24));
        uint32_t v = 0;
        if (!masterMute) {
            v = (uint32_t)(masterVolume * (1 << 24));
        }
        chain->setVolume_l(&v, &v);
        masterVolume = (float)((v + (1 << 23)) >> 24);
        chain.clear();
@@ -1750,7 +1753,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track

            // compute volume for this track
            int16_t left, right, aux;
            if (track->isMuted() || masterMute || track->isPausing() ||
            if (track->isMuted() || track->isPausing() ||
                mStreamTypes[track->type()].mute) {
                left = right = aux = 0;
                if (track->isPausing()) {
@@ -5351,7 +5354,7 @@ void AudioFlinger::EffectModule::process()
        return;
    }

    if (mState == ACTIVE || mState == STOPPING || mState == STOPPED) {
    if (mState == ACTIVE || mState == STOPPING || mState == STOPPED || mState == RESTART) {
        // do 32 bit to 16 bit conversion for auxiliary effect input buffer
        if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
            AudioMixer::ditherAndClamp(mConfig.inputCfg.buffer.s32,
@@ -6032,8 +6035,8 @@ void AudioFlinger::EffectHandle::dump(char* buffer, size_t size)
AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread,
                                        int sessionId)
    : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mOwnInBuffer(false),
            mVolumeCtrlIdx(-1), mLeftVolume(0), mRightVolume(0),
            mNewLeftVolume(0), mNewRightVolume(0)
            mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX),
            mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX)
{
    mStrategy = AudioSystem::getStrategyForStream(AudioSystem::MUSIC);
}