Spatializer: Raise Spatializer-looper priority to RT
Prevents priority inversion when sending HT data to the Spatializer Effect
which was causing a stall of 15ms.
Test: adb shell 'ps -Tl -p $(pgrep audioserver)'
Bug: 261686532
Change-Id: I9746914d7f661ebe9a68ceaa09a37d9763ed43ef
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 7731339..73ee691 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -7332,23 +7332,13 @@
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*/);
+ const pid_t tid = getTid();
+ if (tid == -1) {
+ // Unusual: PlaybackThread::onFirstRef() should set the threadLoop running.
+ ALOGW("%s: Cannot update Spatializer mixer thread priority, not running", __func__);
+ } else {
+ const int priorityBoost = requestSpatializerPriority(getpid(), tid);
+ if (priorityBoost > 0) {
stream()->setHalThreadPriority(priorityBoost);
}
}
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index 3dc4490..2fe7b9e 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -34,6 +34,7 @@
#include <media/stagefright/foundation/AMessage.h>
#include <media/MediaMetricsItem.h>
#include <media/ShmemCompat.h>
+#include <mediautils/SchedulingPolicyService.h>
#include <mediautils/ServiceUtilities.h>
#include <utils/Thread.h>
@@ -111,6 +112,14 @@
};
void onMessageReceived(const sp<AMessage> &msg) override {
+ // No ALooper method to get the tid so update
+ // Spatializer priority on the first message received.
+ std::call_once(mPrioritySetFlag, [](){
+ const pid_t pid = getpid();
+ const pid_t tid = gettid();
+ (void)requestSpatializerPriority(pid, tid);
+ });
+
sp<Spatializer> spatializer = mSpatializer.promote();
if (spatializer == nullptr) {
ALOGW("%s: Cannot promote spatializer", __func__);
@@ -163,6 +172,7 @@
}
private:
wp<Spatializer> mSpatializer;
+ std::once_flag mPrioritySetFlag;
};
const std::vector<const char *> Spatializer::sHeadPoseKeys = {