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

Commit f53f048d authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Release audio patch just after it was created in case no waiting...

Merge "Release audio patch just after it was created in case no waiting caller" into main am: 2d27d437 am: e75f241e

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/3165637



Change-Id: I901da936ac7220fc3757ea50d350d60c4adbea44
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents f4bbe5bf e75f241e
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -1807,6 +1807,7 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
                  ++numTimesBecameEmpty;
                }
                mLastCommand = command;
                status_t createAudioPatchStatus;

                switch (command->mCommand) {
                case SET_VOLUME: {
@@ -1874,10 +1875,11 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
                    ALOGV("AudioCommandThread() processing create audio patch");
                    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
                    if (af == 0) {
                        command->mStatus = PERMISSION_DENIED;
                        createAudioPatchStatus = PERMISSION_DENIED;
                    } else {
                        ul.unlock();
                        command->mStatus = af->createAudioPatch(&data->mPatch, &data->mHandle);
                        createAudioPatchStatus = af->createAudioPatch(&data->mPatch,
                                                                      &data->mHandle);
                        ul.lock();
                    }
                    } break;
@@ -2046,8 +2048,28 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
                {
                    audio_utils::lock_guard _l(command->mMutex);
                    if (command->mWaitStatus) {
                        if (command->mCommand == CREATE_AUDIO_PATCH) {
                            command->mStatus = createAudioPatchStatus;
                        }
                        command->mWaitStatus = false;
                        command->mCond.notify_one();
                    } else if (command->mCommand == CREATE_AUDIO_PATCH &&
                               command->mStatus == TIMED_OUT &&
                               createAudioPatchStatus == NO_ERROR) {
                        // Because of special handling in insertCommand_l() the CREATE_AUDIO_PATCH
                        // command wait status can be only false in case timeout (see TIMED_OUT)
                        // happened.
                        CreateAudioPatchData *createData =
                                (CreateAudioPatchData *)command->mParam.get();
                        ALOGW("AudioCommandThread() no caller awaiting for handle(%d) after \
                                processing create audio patch, going to release it",
                                createData->mHandle);
                        sp<AudioCommand> releaseCommand = new AudioCommand();
                        releaseCommand->mCommand = RELEASE_AUDIO_PATCH;
                        ReleaseAudioPatchData *releaseData = new ReleaseAudioPatchData();
                        releaseData->mHandle = createData->mHandle;
                        releaseCommand->mParam = releaseData;
                        insertCommand_l(releaseCommand, 0);
                    }
                }
                waitTime = -1;
@@ -2607,7 +2629,8 @@ void AudioPolicyService::AudioCommandThread::insertCommand_l(sp<AudioCommand>& c

    // Disable wait for status if delay is not 0.
    // Except for create audio patch command because the returned patch handle
    // is needed by audio policy manager
    // is needed by audio policy manager. Audio patch created after timeout
    // (see TIMED_OUT) will be released from threadLoop().
    if (delayMs != 0 && command->mCommand != CREATE_AUDIO_PATCH) {
        command->mWaitStatus = false;
    }