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

Commit 8b3f315e authored by Philip Cuadra's avatar Philip Cuadra
Browse files

Make BT HAL audio threads RT

Bluetooth threads that are used in audio have deadline
requirements for glitchless playback.  Those threads need to be
scheduled as RT tasks to ensure that they can meet the deadline even if
there is high system load.  Use schedulerservice to request RT
scheduling.

Bug 37518404
Test:  play Bluetooth audio, check for RT with systrace
Change-Id: I043a97df3d2801922b54dcbf7c700ae11a48c217
parent 12d67e3c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ cc_library_shared {
        "vendor_interface.cc",
    ],
    shared_libs: [
        "android.frameworks.schedulerservice@1.0",
        "android.hardware.bluetooth@1.0",
        "libbase",
        "libcutils",
@@ -48,6 +49,7 @@ cc_library_static {
    ],
    export_include_dirs: ["."],
    shared_libs: [
        "android.frameworks.schedulerservice@1.0",
        "liblog",
    ],
}
@@ -84,9 +86,11 @@ cc_test {
        "test",
    ],
    shared_libs: [
        "android.frameworks.schedulerservice@1.0",
        "libbase",
        "libhidlbase",
        "liblog",
        "libutils",
    ],
    static_libs: [
        "android.hardware.bluetooth-async",
+1 −0
Original line number Diff line number Diff line
@@ -35,5 +35,6 @@ LOCAL_SHARED_LIBRARIES += \
  libhidlbase \
  libhidltransport \
  android.hardware.bluetooth@1.0 \
  android.frameworks.schedulerservice@1.0\

include $(BUILD_EXECUTABLE)
+22 −0
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
// limitations under the License.
//

#define LOG_TAG "android.hardware.bluetooth@1.0-impl"

#include "async_fd_watcher.h"

#include <algorithm>
@@ -22,13 +24,18 @@
#include <map>
#include <mutex>
#include <thread>
#include <utils/Log.h>
#include <vector>
#include "fcntl.h"
#include "sys/select.h"
#include "unistd.h"

#include <android/frameworks/schedulerservice/1.0/ISchedulingPolicyService.h>

static const int INVALID_FD = -1;

static const int BT_RT_PRIORITY = 1;

namespace android {
namespace hardware {
namespace bluetooth {
@@ -112,6 +119,21 @@ int AsyncFdWatcher::notifyThread() {
}

void AsyncFdWatcher::ThreadRoutine() {
  using ::android::frameworks::schedulerservice::V1_0::ISchedulingPolicyService;
  using ::android::hardware::Return;
  sp<ISchedulingPolicyService> manager = ISchedulingPolicyService::getService();
  if (manager == nullptr) {
    ALOGE("%s: Couldn't get scheduler manager to set SCHED_FIFO.", __func__);
  } else {
    Return<bool> ret = manager->requestPriority(getpid(),
                                                gettid(),
                                                BT_RT_PRIORITY);
    if (!ret.isOk() || !ret) {
      ALOGE("%s unable to set SCHED_FIFO for pid %d, tid %d", __func__,
            getpid(), gettid());
    }
  }

  while (running_) {
    fd_set read_fds;
    FD_ZERO(&read_fds);