summaryrefslogtreecommitdiffstats
path: root/utils/src/bt_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/src/bt_utils.c')
-rw-r--r--utils/src/bt_utils.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/utils/src/bt_utils.c b/utils/src/bt_utils.c
new file mode 100644
index 0000000..aeb9292
--- /dev/null
+++ b/utils/src/bt_utils.c
@@ -0,0 +1,139 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/************************************************************************************
+ *
+ * Filename: bt_utils.c
+ *
+ * Description: Miscellaneous helper functions
+ *
+ *
+ ***********************************************************************************/
+
+#include <cutils/properties.h>
+#include <cutils/sched_policy.h>
+#include <errno.h>
+#include <pthread.h>
+#include <sys/resource.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <utils/ThreadDefs.h>
+
+#define LOG_TAG "BT_UTILS"
+
+#include <utils/Log.h>
+
+#include "data_types.h"
+#include "bt_utils.h"
+
+
+/*******************************************************************************
+** Type definitions for callback functions
+********************************************************************************/
+static pthread_once_t g_DoSchedulingGroupOnce[TASK_HIGH_MAX];
+static BOOLEAN g_DoSchedulingGroup[TASK_HIGH_MAX];
+static pthread_mutex_t gIdxLock;
+static int g_TaskIdx;
+
+/*****************************************************************************
+**
+** Function bt_utils_init
+**
+** Description Initialize bluedroid util
+**
+** Returns void
+**
+*******************************************************************************/
+void bt_utils_init() {
+ int i;
+ pthread_mutexattr_t lock_attr;
+
+ for(i = 0; i < TASK_HIGH_MAX; i++) {
+ g_DoSchedulingGroupOnce[i] = PTHREAD_ONCE_INIT;
+ g_DoSchedulingGroup[i] = TRUE;
+ }
+ pthread_mutexattr_init(&lock_attr);
+ pthread_mutex_init(&gIdxLock, &lock_attr);
+}
+
+/*****************************************************************************
+**
+** Function bt_utils_cleanup
+**
+** Description Clean up bluedroid util
+**
+** Returns void
+**
+*******************************************************************************/
+void bt_utils_cleanup() {
+ pthread_mutex_destroy(&gIdxLock);
+}
+
+/*****************************************************************************
+**
+** Function check_do_scheduling_group
+**
+** Description check if it is ok to change schedule group
+**
+** Returns void
+**
+*******************************************************************************/
+static void check_do_scheduling_group(void) {
+ char buf[PROPERTY_VALUE_MAX];
+ int len = property_get("debug.sys.noschedgroups", buf, "");
+ if (len > 0) {
+ int temp;
+ if (sscanf(buf, "%d", &temp) == 1) {
+ g_DoSchedulingGroup[g_TaskIdx] = temp == 0;
+ }
+ }
+}
+
+/*****************************************************************************
+**
+** Function raise_priority_a2dp
+**
+** Description Raise task priority for A2DP streaming
+**
+** Returns void
+**
+*******************************************************************************/
+void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task) {
+ int rc = 0;
+ int tid = gettid();
+
+ pthread_mutex_lock(&gIdxLock);
+ g_TaskIdx = high_task;
+
+ pthread_once(&g_DoSchedulingGroupOnce[g_TaskIdx], check_do_scheduling_group);
+ if (g_DoSchedulingGroup[g_TaskIdx]) {
+ // set_sched_policy does not support tid == 0
+ rc = set_sched_policy(tid, SP_FOREGROUND);
+ }
+ pthread_mutex_unlock(&gIdxLock);
+
+ if (rc) {
+ ALOGW("failed to change sched policy, tid %d, err: %d", tid, errno);
+ }
+
+ if (setpriority(PRIO_PROCESS, tid, ANDROID_PRIORITY_AUDIO) < 0) {
+ ALOGW("failed to change priority tid: %d to %d", tid, ANDROID_PRIORITY_AUDIO);
+ }
+}
+