diff --git a/android/Android.mk b/android/Android.mk index 7d4219d0..4d15e43e 100644 --- a/android/Android.mk +++ b/android/Android.mk @@ -238,6 +238,11 @@ audioadapter_libsource := \ ../common/JackAudioAdapterFactory.cpp \ ../linux/alsa/JackAlsaAdapter.cpp +ifeq ($(SUPPORT_ANDROID_REALTIME_SCHED), true) +sched_c_include := bionic/libc/bionic \ + frameworks/av/services/audioflinger +endif + # ======================================================== # libjackserver.so # ======================================================== @@ -251,6 +256,12 @@ LOCAL_C_INCLUDES := $(common_c_includes) LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libjackshm LOCAL_MODULE_TAGS := eng optional LOCAL_MODULE := libjackserver +ifeq ($(SUPPORT_ANDROID_REALTIME_SCHED), true) +LOCAL_CFLAGS += -DJACK_ANDROID_REALTIME_SCHED +LOCAL_C_INCLUDES += $(sched_c_include) +LOCAL_SHARED_LIBRARIES += libbinder +LOCAL_STATIC_LIBRARIES := libscheduling_policy +endif include $(BUILD_SHARED_LIBRARY) @@ -283,6 +294,12 @@ LOCAL_C_INCLUDES := $(common_c_includes) LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libjackshm LOCAL_MODULE_TAGS := eng optional LOCAL_MODULE := libjack +ifeq ($(SUPPORT_ANDROID_REALTIME_SCHED), true) +LOCAL_CFLAGS += -DJACK_ANDROID_REALTIME_SCHED +LOCAL_C_INCLUDES += $(sched_c_include) +LOCAL_SHARED_LIBRARIES += libbinder +LOCAL_STATIC_LIBRARIES := libscheduling_policy +endif include $(BUILD_SHARED_LIBRARY) diff --git a/android/JackAndroidThread.cpp b/android/JackAndroidThread.cpp index 6c9e135d..ae46e5e5 100644 --- a/android/JackAndroidThread.cpp +++ b/android/JackAndroidThread.cpp @@ -27,6 +27,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include // for _POSIX_PRIORITY_SCHEDULING check #include +#ifdef JACK_ANDROID_REALTIME_SCHED +#include "SchedulingPolicyService.h" +#endif + //#define JACK_SCHED_POLICY SCHED_RR #define JACK_SCHED_POLICY SCHED_FIFO @@ -241,12 +245,20 @@ int JackAndroidThread::AcquireRealTimeImp(jack_native_thread_t thread, int prior jack_log("JackAndroidThread::AcquireRealTimeImp priority = %d", priority); +#ifndef JACK_ANDROID_REALTIME_SCHED if ((res = pthread_setschedparam(thread, JACK_SCHED_POLICY, &rtparam)) != 0) { jack_error("Cannot use real-time scheduling (RR/%d)" "(%d: %s)", rtparam.sched_priority, res, strerror(res)); return -1; } +#else + if ((res = android::requestPriority(getpid(), gettid(), priority)) != 0) { + jack_log("Failed to get SCHED_FIFO priority pid %d tid %d; error %d", + getpid(), gettid(), res); + return -1; + } +#endif return 0; }