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

Commit 880dfe4f authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "Fix issue 3007862" into gingerbread

parents 37155854 98c92599
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) {