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

Unverified Commit 24d5bc69 authored by Michael Bestas's avatar Michael Bestas
Browse files

Merge tag 'android-13.0.0_r20' into staging/lineage-20.0_merge-android-13.0.0_r20

Android 13.0.0 release 20

# -----BEGIN PGP SIGNATURE-----
#
# iF0EABECAB0WIQRDQNE1cO+UXoOBCWTorT+BmrEOeAUCY7SAYQAKCRDorT+BmrEO
# eI9HAJwLXAZMdvEUxbkacU7OHKlegAabIwCePrH+uSaKgf4wkH8v31Cgurg+iwo=
# =IS9K
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue Jan  3 21:22:09 2023 EET
# gpg:                using DSA key 4340D13570EF945E83810964E8AD3F819AB10E78
# gpg: Good signature from "The Android Open Source Project <initial-contribution@android.com>" [marginal]
# gpg: initial-contribution@android.com: Verified 1497 signatures in the past
#      14 months.  Encrypted 4 messages in the past 11 months.
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 4340 D135 70EF 945E 8381  0964 E8AD 3F81 9AB1 0E78

# By Andy Hung
# Via Android Build Coastguard Worker
* tag 'android-13.0.0_r20':
  Spatializer: Fix lost headtracking sensor
  Spatializer: set spatializer threads to RT priority 1

Change-Id: Ic3378b5818952e2367d175aedd433b9b79260e43
parents 264dccf2 cde04c79
Loading
Loading
Loading
Loading
+81 −0
Original line number Diff line number Diff line
@@ -17,11 +17,16 @@
#define LOG_TAG "EffectHalHidl"
//#define LOG_NDEBUG 0

#include <android/hidl/manager/1.0/IServiceManager.h>
#include <android-base/stringprintf.h>
#include <common/all-versions/VersionUtils.h>
#include <cutils/native_handle.h>
#include <cutils/properties.h>
#include <hwbinder/IPCThreadState.h>
#include <media/EffectsFactoryApi.h>
#include <mediautils/SchedulingPolicyService.h>
#include <mediautils/TimeCheck.h>
#include <system/audio_effects/effect_spatializer.h>
#include <utils/Log.h>

#include <util/EffectUtils.h>
@@ -50,6 +55,18 @@ EffectHalHidl::EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId)
    effect_descriptor_t halDescriptor{};
    if (EffectHalHidl::getDescriptor(&halDescriptor) == NO_ERROR) {
        mIsInput = (halDescriptor.flags & EFFECT_FLAG_TYPE_PRE_PROC) == EFFECT_FLAG_TYPE_PRE_PROC;
        const bool isSpatializer =
                memcmp(&halDescriptor.type, FX_IID_SPATIALIZER, sizeof(effect_uuid_t)) == 0;
        if (isSpatializer) {
            constexpr int32_t kRTPriorityMin = 1;
            constexpr int32_t kRTPriorityMax = 3;
            const int32_t priorityBoost = property_get_int32("audio.spatializer.priority", 1);
            if (priorityBoost >= kRTPriorityMin && priorityBoost <= kRTPriorityMax) {
                ALOGD("%s: audio.spatializer.priority %d on effect %lld",
                         __func__, priorityBoost, (long long)effectId);
                mHalThreadPriority = priorityBoost;
            }
        }
    }
}

@@ -127,6 +144,8 @@ status_t EffectHalHidl::prepareForProcessing() {
        ALOGE_IF(!mEfGroup, "Event flag creation for effects failed");
        return NO_INIT;
    }

    (void)checkHalThreadPriority();
    mStatusMQ = std::move(tempStatusMQ);
    return OK;
}
@@ -317,5 +336,67 @@ status_t EffectHalHidl::setConfigImpl(
    return result;
}

status_t EffectHalHidl::getHalPid(pid_t *pid) const {
    using ::android::hidl::base::V1_0::DebugInfo;
    using ::android::hidl::manager::V1_0::IServiceManager;
    DebugInfo debugInfo;
    const auto ret = mEffect->getDebugInfo([&] (const auto &info) {
        debugInfo = info;
    });
    if (!ret.isOk()) {
        ALOGW("%s: cannot get effect debug info", __func__);
        return INVALID_OPERATION;
    }
    if (debugInfo.pid != (int)IServiceManager::PidConstant::NO_PID) {
        *pid = debugInfo.pid;
        return NO_ERROR;
    }
    ALOGW("%s: effect debug info does not contain pid", __func__);
    return NAME_NOT_FOUND;
}

status_t EffectHalHidl::getHalWorkerTid(pid_t *tid) {
    int32_t reply = -1;
    uint32_t replySize = sizeof(reply);
    const status_t status =
            command('gtid', 0 /* cmdSize */, nullptr /* pCmdData */, &replySize, &reply);
    if (status == OK) {
        *tid = (pid_t)reply;
    } else {
        ALOGW("%s: failed with status:%d", __func__, status);
    }
    return status;
}

bool EffectHalHidl::requestHalThreadPriority(pid_t threadPid, pid_t threadId) {
    if (mHalThreadPriority == kRTPriorityDisabled) {
        return true;
    }
    const int err = requestPriority(
            threadPid, threadId,
            mHalThreadPriority, false /*isForApp*/, true /*asynchronous*/);
    ALOGW_IF(err, "%s: failed to set RT priority %d for pid %d tid %d; error %d",
            __func__, mHalThreadPriority, threadPid, threadId, err);
    // Audio will still work, but may be more susceptible to glitches.
    return err == 0;
}

status_t EffectHalHidl::checkHalThreadPriority() {
    if (mHalThreadPriority == kRTPriorityDisabled) return OK;
    if (mHalThreadPriority < kRTPriorityMin
            || mHalThreadPriority > kRTPriorityMax) return BAD_VALUE;

    pid_t halPid, halWorkerTid;
    const status_t status = getHalPid(&halPid) ?: getHalWorkerTid(&halWorkerTid);
    const bool success = status == OK && requestHalThreadPriority(halPid, halWorkerTid);
    ALOGD("%s: effectId %lld RT priority(%d) request %s%s",
            __func__, (long long)mEffectId, mHalThreadPriority,
            success ? "succeeded" : "failed",
            status == OK
                    ? base::StringPrintf(" for pid:%d tid:%d", halPid, halWorkerTid).c_str()
                    : " (pid / tid cannot be read)");
    return success ? OK : status != OK ? status : INVALID_OPERATION /* request failed */;
}

} // namespace effect
} // namespace android
+9 −0
Original line number Diff line number Diff line
@@ -78,6 +78,11 @@ class EffectHalHidl : public EffectHalInterface, public EffectConversionHelperHi
    std::unique_ptr<StatusMQ> mStatusMQ;
    EventFlag* mEfGroup;
    bool mIsInput = false;
    static constexpr int32_t kRTPriorityMin = 1;
    static constexpr int32_t kRTPriorityMax = 3;
    static constexpr int kRTPriorityDisabled = 0;
    // Typical RealTime mHalThreadPriority ranges from 1 (low) to 3 (high).
    int mHalThreadPriority = kRTPriorityDisabled;

    // Can not be constructed directly by clients.
    EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId);
@@ -93,6 +98,10 @@ class EffectHalHidl : public EffectHalInterface, public EffectConversionHelperHi
            uint32_t cmdCode, uint32_t cmdSize, void *pCmdData,
            uint32_t *replySize, void *pReplyData);
    status_t setProcessBuffers();
    status_t getHalPid(pid_t *pid) const;
    status_t getHalWorkerTid(pid_t *tid);
    bool requestHalThreadPriority(pid_t threadPid, pid_t threadId);
    status_t checkHalThreadPriority();
};

} // namespace effect
+9 −4
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@ class SensorPoseProviderImpl : public SensorPoseProvider {
    ~SensorPoseProviderImpl() override {
        // Disable all active sensors.
        mEnabledSensors.clear();
        mQuit = true;
        mLooper->wake();
        mThread.join();
    }
@@ -217,6 +218,7 @@ class SensorPoseProviderImpl : public SensorPoseProvider {
        std::optional<int32_t> discontinuityCount;
    };

    bool mQuit = false;
    sp<Looper> mLooper;
    Listener* const mListener;
    SensorManager* const mSensorManager;
@@ -260,13 +262,14 @@ class SensorPoseProviderImpl : public SensorPoseProvider {

        initFinished(true);

        while (true) {
        while (!mQuit) {
            int ret = mLooper->pollOnce(-1 /* no timeout */, nullptr, nullptr, nullptr);

            switch (ret) {
                case ALOOPER_POLL_WAKE:
                    // Normal way to exit.
                    return;
                    // Continue to see if mQuit flag is set.
                    // This can be spurious (due to bugreport being taken).
                    continue;

                case kIdent:
                    // Possible events on our queue.
@@ -285,7 +288,8 @@ class SensorPoseProviderImpl : public SensorPoseProvider {
            ssize_t size = mQueue->filterEvents(&event, actual);

            if (size < 0 || size > 1) {
                ALOGE("Unexpected return value from SensorEventQueue::filterEvents: %zd", size);
                ALOGE("%s: Unexpected return value from SensorEventQueue::filterEvents: %zd",
                        __func__, size);
                break;
            }
            if (size == 0) {
@@ -295,6 +299,7 @@ class SensorPoseProviderImpl : public SensorPoseProvider {

            handleEvent(event);
        }
        ALOGD("%s: Exiting sensor event loop", __func__);
    }

    void handleEvent(const ASensorEvent& event) {
+21 −0
Original line number Diff line number Diff line
@@ -7314,6 +7314,27 @@ void AudioFlinger::SpatializerThread::onFirstRef() {
    if (status != INVALID_OPERATION) {
        updateHalSupportedLatencyModes_l();
    }

    // update priority if specified.
    constexpr int32_t kRTPriorityMin = 1;
    constexpr int32_t kRTPriorityMax = 3;
    const int32_t priorityBoost =
            property_get_int32("audio.spatializer.priority", kRTPriorityMin);
    if (priorityBoost >= kRTPriorityMin && priorityBoost <= kRTPriorityMax) {
        const pid_t pid = getpid();
        const pid_t tid = getTid();

        if (tid == -1) {
            // Unusual: PlaybackThread::onFirstRef() should set the threadLoop running.
            ALOGW("%s: audio.spatializer.priority %d ignored, thread not running",
                    __func__, priorityBoost);
        } else {
            ALOGD("%s: audio.spatializer.priority %d, allowing real time for pid %d  tid %d",
                    __func__, priorityBoost, pid, tid);
            sendPrioConfigEvent_l(pid, tid, priorityBoost, false /*forApp*/);
            stream()->setHalThreadPriority(priorityBoost);
        }
    }
}

status_t AudioFlinger::SpatializerThread::createAudioPatch_l(const struct audio_patch *patch,