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

Commit 692dfafe authored by Eric Laurent's avatar Eric Laurent Committed by Android Git Automerger
Browse files

am 880dfe4f: Merge "Fix issue 3007862" into gingerbread

Merge commit '880dfe4f' into gingerbread-plus-aosp

* commit '880dfe4f':
  Fix issue 3007862
parents 19fe783d 880dfe4f
Loading
Loading
Loading
Loading
+49 −40
Original line number Diff line number Diff line
@@ -4653,9 +4653,6 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
        goto Exit;
    }

    {
        Mutex::Autolock _l(mLock);

    // check audio settings permission for global effects
    if (sessionId == AudioSystem::SESSION_OUTPUT_MIX && !settingsAllowed()) {
        lStatus = PERMISSION_DENIED;
@@ -4677,6 +4674,24 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
        goto Exit;
    }

    if (output == 0) {
        if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE) {
            // output must be specified by AudioPolicyManager when using session
            // AudioSystem::SESSION_OUTPUT_STAGE
            lStatus = BAD_VALUE;
            goto Exit;
        } else if (sessionId == AudioSystem::SESSION_OUTPUT_MIX) {
            // if the output returned by getOutputForEffect() is removed before we lock the
            // mutex below, the call to checkPlaybackThread_l(output) below will detect it
            // and we will exit safely
            output = AudioSystem::getOutputForEffect(&desc);
        }
    }

    {
        Mutex::Autolock _l(mLock);


        if (!EffectIsNullUuid(&pDesc->uuid)) {
            // if uuid is specified, request effect descriptor
            lStatus = EffectGetDescriptor(&pDesc->uuid, &desc);
@@ -4744,17 +4759,9 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,

        // If output is not specified try to find a matching audio session ID in one of the
        // output threads.
        // TODO: allow attachment of effect to inputs
        // If output is 0 here, sessionId is neither SESSION_OUTPUT_STAGE nor SESSION_OUTPUT_MIX
        // because of code checking output when entering the function.
        if (output == 0) {
            if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE) {
                // output must be specified by AudioPolicyManager when using session
                // AudioSystem::SESSION_OUTPUT_STAGE
                lStatus = BAD_VALUE;
                goto Exit;
            } else if (sessionId == AudioSystem::SESSION_OUTPUT_MIX) {
                output = AudioSystem::getOutputForEffect(&desc);
                LOGV("createEffect() got output %d for effect %s", output, desc.name);
            } else {
             // look for the thread where the specified audio session is present
            for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
                if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
@@ -4769,7 +4776,7 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
                output = mPlaybackThreads.keyAt(0);
            }
        }
        }
        LOGV("createEffect() got output %d for effect %s", output, desc.name);
        PlaybackThread *thread = checkPlaybackThread_l(output);
        if (thread == NULL) {
            LOGE("createEffect() unknown output thread");
@@ -4777,6 +4784,8 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
            goto Exit;
        }

        // TODO: allow attachment of effect to inputs

        wclient = mClients.valueFor(pid);

        if (wclient != NULL) {