summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--btif/include/btif_gatt_multi_adv_util.h4
-rw-r--r--btif/src/btif_gatt_client.c4
-rw-r--r--[-rwxr-xr-x]btif/src/btif_gatt_multi_adv_util.c45
-rw-r--r--btif/src/btif_media_task.c87
-rw-r--r--gki/common/gki_buffer.c6
-rw-r--r--gki/ulinux/gki_ulinux.c23
-rw-r--r--stack/btm/btm_ble_gap.c8
-rw-r--r--udrv/ulinux/uipc.c22
8 files changed, 90 insertions, 109 deletions
diff --git a/btif/include/btif_gatt_multi_adv_util.h b/btif/include/btif_gatt_multi_adv_util.h
index e6c26a0..1175958 100644
--- a/btif/include/btif_gatt_multi_adv_util.h
+++ b/btif/include/btif_gatt_multi_adv_util.h
@@ -72,8 +72,8 @@ typedef struct
} btgatt_multi_adv_common_data;
extern btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb();
-extern void btif_gattc_init_multi_adv_cb(void);
-extern void btif_gattc_destroy_multi_adv_cb();
+extern void btif_gattc_incr_app_count(void);
+extern void btif_gattc_decr_app_count(void);
extern int btif_multi_adv_add_instid_map(int client_if, int inst_id,
BOOLEAN gen_temp_instid);
extern int btif_multi_adv_instid_for_clientif(int client_if);
diff --git a/btif/src/btif_gatt_client.c b/btif/src/btif_gatt_client.c
index abe35c1..5699649 100644
--- a/btif/src/btif_gatt_client.c
+++ b/btif/src/btif_gatt_client.c
@@ -1087,13 +1087,13 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
{
case BTIF_GATTC_REGISTER_APP:
btif_to_bta_uuid(&uuid, &p_cb->uuid);
- btif_gattc_init_multi_adv_cb();
+ btif_gattc_incr_app_count();
BTA_GATTC_AppRegister(&uuid, bta_gattc_cback);
break;
case BTIF_GATTC_UNREGISTER_APP:
btif_gattc_clear_clientif(p_cb->client_if);
- btif_gattc_destroy_multi_adv_cb();
+ btif_gattc_decr_app_count();
BTA_GATTC_AppDeregister(p_cb->client_if);
break;
diff --git a/btif/src/btif_gatt_multi_adv_util.c b/btif/src/btif_gatt_multi_adv_util.c
index 68fc3ba..3d7d96c 100755..100644
--- a/btif/src/btif_gatt_multi_adv_util.c
+++ b/btif/src/btif_gatt_multi_adv_util.c
@@ -42,21 +42,25 @@
/*******************************************************************************
** Static variables
********************************************************************************/
-static int multi_adv_enable_count = 0;
+static int user_app_count = 0;
static btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
{
+ int max_adv_inst = BTM_BleMaxMultiAdvInstanceCount();
+ if (0 == max_adv_inst)
+ max_adv_inst = 1;
+
+ BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, max_adv_inst);
if(0 == BTM_BleMaxMultiAdvInstanceCount())
{
- BTIF_TRACE_WARNING("%s - No instances found", __FUNCTION__);
+ BTIF_TRACE_WARNING("BTM_BleMaxMultiAdvInstanceCount - No instances found");
return NULL;
}
- BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, BTM_BleMaxMultiAdvInstanceCount());
+ BTIF_TRACE_DEBUG("BTM_BleMaxMultiAdvInstanceCount count:%d", BTM_BleMaxMultiAdvInstanceCount());
if (NULL == p_multi_adv_com_data_cb)
{
- BTIF_TRACE_DEBUG("Initializing in %s", __FUNCTION__);
p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
if (NULL != p_multi_adv_com_data_cb)
{
@@ -64,16 +68,16 @@ btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
/* Storing both client_if and inst_id details */
p_multi_adv_com_data_cb->clntif_map =
- GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+ GKI_getbuf(( max_adv_inst * INST_ID_IDX_MAX)* sizeof(INT8));
memset(p_multi_adv_com_data_cb->clntif_map, 0 ,
- ( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+ ( max_adv_inst * INST_ID_IDX_MAX)* sizeof(INT8));
- p_multi_adv_com_data_cb->inst_cb = GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() + 1 )
+ p_multi_adv_com_data_cb->inst_cb = GKI_getbuf(( max_adv_inst + 1 )
* sizeof(btgatt_multi_adv_inst_cb));
memset(p_multi_adv_com_data_cb->inst_cb, 0 ,
- ( BTM_BleMaxMultiAdvInstanceCount() + 1) * sizeof(btgatt_multi_adv_inst_cb));
+ ( max_adv_inst + 1) * sizeof(btgatt_multi_adv_inst_cb));
- for (int i=0; i < BTM_BleMaxMultiAdvInstanceCount()*2; i += 2)
+ for (int i=0; i < max_adv_inst * 2; i += 2)
{
p_multi_adv_com_data_cb->clntif_map[i] = INVALID_ADV_INST;
p_multi_adv_com_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
@@ -84,27 +88,24 @@ btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
return p_multi_adv_com_data_cb;
}
-void btif_gattc_init_multi_adv_cb(void)
+void btif_gattc_incr_app_count(void)
{
// TODO: Instead of using a fragile reference counter here, one could
// simply track the client_if instances that are in the map.
- ++multi_adv_enable_count;
+ ++user_app_count;
}
-void btif_gattc_destroy_multi_adv_cb(int client_if)
+void btif_gattc_decr_app_count(void)
{
- if (multi_adv_enable_count > 0)
- multi_adv_enable_count --;
+ if (user_app_count > 0)
+ user_app_count --;
- if(multi_adv_enable_count == 0 && p_multi_adv_com_data_cb != 0)
+ if(user_app_count == 0 && NULL != p_multi_adv_com_data_cb)
{
- if (NULL != p_multi_adv_com_data_cb)
- {
- GKI_freebuf (p_multi_adv_com_data_cb->clntif_map);
- GKI_freebuf (p_multi_adv_com_data_cb->inst_cb);
- GKI_freebuf(p_multi_adv_com_data_cb);
- p_multi_adv_com_data_cb = NULL;
- }
+ GKI_freebuf (p_multi_adv_com_data_cb->clntif_map);
+ GKI_freebuf (p_multi_adv_com_data_cb->inst_cb);
+ GKI_freebuf(p_multi_adv_com_data_cb);
+ p_multi_adv_com_data_cb = NULL;
}
}
diff --git a/btif/src/btif_media_task.c b/btif/src/btif_media_task.c
index 4b04e1e..e5ea51a 100644
--- a/btif/src/btif_media_task.c
+++ b/btif/src/btif_media_task.c
@@ -208,9 +208,7 @@ static UINT32 a2dp_media_task_stack[(A2DP_MEDIA_TASK_STACK_SIZE + 3) / 4];
/* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
#define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 18
-#define A2DP_PACKET_COUNT_LOW_WATERMARK 5
#define MAX_PCM_FRAME_NUM_PER_TICK 10
-#define RESET_RATE_COUNTER_THRESHOLD_MS 2000
//#define BTIF_MEDIA_VERBOSE_ENABLED
/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
@@ -247,10 +245,6 @@ typedef struct
INT32 aa_feed_residue;
UINT32 counter;
UINT32 bytes_per_tick; /* pcm bytes read each media task tick */
- UINT32 max_counter_exit;
- UINT32 max_counter_enter;
- UINT32 overflow_count;
- BOOLEAN overflow;
} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE;
@@ -2356,11 +2350,6 @@ static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
*******************************************************************************/
static void btif_media_task_feeding_state_reset(void)
{
- APPL_TRACE_WARNING("overflow %d, enter %d, exit %d",
- btif_media_cb.media_feeding_state.pcm.overflow_count,
- btif_media_cb.media_feeding_state.pcm.max_counter_enter,
- btif_media_cb.media_feeding_state.pcm.max_counter_exit);
-
/* By default, just clear the entire state */
memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state));
@@ -2443,12 +2432,12 @@ static void btif_media_task_aa_stop_tx(void)
*******************************************************************************/
static UINT8 btif_get_num_aa_frame(void)
{
- UINT32 result=0;
+ UINT8 result=0;
switch (btif_media_cb.TxTranscoding)
{
case BTIF_MEDIA_TRSCD_PCM_2_SBC:
- {
+ {
UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands *
btif_media_cb.encoder.s16NumOfBlocks *
btif_media_cb.media_feeding.cfg.pcm.num_channel *
@@ -2463,29 +2452,16 @@ static UINT8 btif_get_num_aa_frame(void)
btif_media_cb.media_feeding_state.pcm.counter +=
btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
- if ((!btif_media_cb.media_feeding_state.pcm.overflow) ||
- (btif_media_cb.TxAaQ.count < A2DP_PACKET_COUNT_LOW_WATERMARK)) {
- if (btif_media_cb.media_feeding_state.pcm.overflow) {
- btif_media_cb.media_feeding_state.pcm.overflow = FALSE;
-
- if (btif_media_cb.media_feeding_state.pcm.counter >
- btif_media_cb.media_feeding_state.pcm.max_counter_exit) {
- btif_media_cb.media_feeding_state.pcm.max_counter_exit =
- btif_media_cb.media_feeding_state.pcm.counter;
- }
- }
- /* calculate nbr of frames pending for this media tick */
- result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
- if (result > MAX_PCM_FRAME_NUM_PER_TICK)
- {
- APPL_TRACE_ERROR("%s() - Limiting frames to be sent from %d to %d"
- , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
- result = MAX_PCM_FRAME_NUM_PER_TICK;
- }
- btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
- } else {
- result = 0;
+
+ /* calculate nbr of frames pending for this media tick */
+ result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
+ if (result > MAX_PCM_FRAME_NUM_PER_TICK)
+ {
+ APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d"
+ , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
+ result = MAX_PCM_FRAME_NUM_PER_TICK;
}
+ btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
VERBOSE("WRITE %d FRAMES", result);
}
@@ -2845,32 +2821,6 @@ static void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
{
GKI_freebuf(p_buf);
}
-
- if (btif_media_cb.TxAaQ.count >= MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ) {
- UINT32 reset_rate_bytes = btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
- (RESET_RATE_COUNTER_THRESHOLD_MS / BTIF_MEDIA_TIME_TICK);
- btif_media_cb.media_feeding_state.pcm.overflow = TRUE;
- btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
- btif_media_cb.encoder.s16NumOfSubBands *
- btif_media_cb.encoder.s16NumOfBlocks *
- btif_media_cb.media_feeding.cfg.pcm.num_channel *
- btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
-
- btif_media_cb.media_feeding_state.pcm.overflow_count++;
- if (btif_media_cb.media_feeding_state.pcm.counter >
- btif_media_cb.media_feeding_state.pcm.max_counter_enter) {
- btif_media_cb.media_feeding_state.pcm.max_counter_enter =
- btif_media_cb.media_feeding_state.pcm.counter;
- }
-
- if (btif_media_cb.media_feeding_state.pcm.counter > reset_rate_bytes) {
- btif_media_cb.media_feeding_state.pcm.counter = 0;
- APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send:reset rate counter");
- }
-
- /* no more pcm to read */
- nb_frame = 0;
- }
}
}
@@ -2887,8 +2837,16 @@ static void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
static void btif_media_aa_prep_2_send(UINT8 nb_frame)
{
- VERBOSE("btif_media_aa_prep_2_send : %d frames (queue %d)", nb_frame,
- btif_media_cb.TxAaQ.count);
+ VERBOSE("%s() - frames=%d (queue=%d)", __FUNCTION__, nb_frame, btif_media_cb.TxAaQ.count);
+
+ while (btif_media_cb.TxAaQ.count >= (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ-nb_frame))
+ {
+ APPL_TRACE_WARNING("%s() - TX queue buffer count %d",
+ __FUNCTION__, btif_media_cb.TxAaQ.count);
+ GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ)));
+ }
+
+ if (btif_media_cb.TxAaQ.count) --nb_frame;
switch (btif_media_cb.TxTranscoding)
{
@@ -2919,7 +2877,8 @@ static void btif_media_send_aa_frame(void)
/* get the number of frame to send */
nb_frame_2_send = btif_get_num_aa_frame();
- if (nb_frame_2_send != 0) {
+ if (nb_frame_2_send != 0)
+ {
/* format and Q buffer to send */
btif_media_aa_prep_2_send(nb_frame_2_send);
}
diff --git a/gki/common/gki_buffer.c b/gki/common/gki_buffer.c
index 03b330c..0ce98a1 100644
--- a/gki/common/gki_buffer.c
+++ b/gki/common/gki_buffer.c
@@ -411,7 +411,10 @@ void *GKI_getbuf (UINT16 size)
// btla-specific ++
#ifdef GKI_USE_DEFERED_ALLOC_BUF_POOLS
if(Q->p_first == 0 && gki_alloc_free_queue(i) != TRUE)
+ {
+ GKI_enable();
return NULL;
+ }
#endif
// btla-specific --
p_hdr = Q->p_first;
@@ -478,7 +481,10 @@ void *GKI_getpoolbuf (UINT8 pool_id)
// btla-specific ++
#ifdef GKI_USE_DEFERED_ALLOC_BUF_POOLS
if(Q->p_first == 0 && gki_alloc_free_queue(pool_id) != TRUE)
+ {
+ GKI_enable();
return NULL;
+ }
#endif
// btla-specific --
p_hdr = Q->p_first;
diff --git a/gki/ulinux/gki_ulinux.c b/gki/ulinux/gki_ulinux.c
index 0c22d23..f9151a3 100644
--- a/gki/ulinux/gki_ulinux.c
+++ b/gki/ulinux/gki_ulinux.c
@@ -98,7 +98,7 @@ static bool timer_created;
// If the next wakeup time is less than this threshold, we should acquire
// a wakelock instead of setting a wake alarm so we're not bouncing in
// and out of suspend frequently.
-static const uint32_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 3000;
+static const uint32_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 100;
/*****************************************************************************
** Externs
@@ -211,13 +211,16 @@ void alarm_service_reschedule()
if (ticks_in_millis <= TIMER_INTERVAL_FOR_WAKELOCK_IN_MS)
{
// The next deadline is close, just take a wakelock and set a regular (non-wake) timer.
- int rc = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
- if (rc != BT_STATUS_SUCCESS)
+ if (!alarm_service.wakelock)
{
- ALOGE("%s unable to acquire wake lock: %d", __func__, rc);
- return;
+ int rc = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
+ if (rc != BT_STATUS_SUCCESS)
+ {
+ ALOGE("%s unable to acquire wake lock: %d", __func__, rc);
+ return;
+ }
+ alarm_service.wakelock = true;
}
- alarm_service.wakelock = true;
ALOGV("%s acquired wake lock, setting short alarm (%lldms).", __func__, ticks_in_millis);
if (!set_nonwake_alarm(ticks_in_millis))
@@ -234,8 +237,12 @@ void alarm_service_reschedule()
} else {
ALOGV("%s set long alarm (%lldms), releasing wake lock.", __func__, ticks_in_millis);
}
- alarm_service.wakelock = false;
- bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+
+ if (alarm_service.wakelock)
+ {
+ alarm_service.wakelock = false;
+ bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+ }
}
}
diff --git a/stack/btm/btm_ble_gap.c b/stack/btm/btm_ble_gap.c
index a6f095f..8549fcd 100644
--- a/stack/btm/btm_ble_gap.c
+++ b/stack/btm/btm_ble_gap.c
@@ -644,16 +644,12 @@ static void btm_ble_resolve_random_addr_on_adv(void * p_rec, void *p)
if (match_rec)
{
- BTM_TRACE_ERROR("Random match");
+ BTM_TRACE_DEBUG("Random match");
match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
addr_type = match_rec->ble.ble_addr_type;
}
- else
- {
- BTM_TRACE_ERROR("Random unmatch");
- }
btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
@@ -2437,7 +2433,7 @@ void btm_ble_process_adv_pkt (UINT8 *p_data)
#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
/* map address to security record */
btm_public_addr_to_random_pseudo(bda, &addr_type);
- BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
+ BTM_TRACE_DEBUG("new address: %02x:%02x:%02x:%02x:%02x:%02x",
bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
#endif
diff --git a/udrv/ulinux/uipc.c b/udrv/ulinux/uipc.c
index b9caa1b..81ca7f8 100644
--- a/udrv/ulinux/uipc.c
+++ b/udrv/ulinux/uipc.c
@@ -69,6 +69,8 @@
#define SAFE_FD_ISSET(fd, set) (((fd) == -1) ? FALSE : FD_ISSET((fd), (set)))
+#define UIPC_FLUSH_BUFFER_SIZE 1024
+
/*****************************************************************************
** Local type definitions
******************************************************************************/
@@ -373,30 +375,40 @@ static int uipc_setup_server_locked(tUIPC_CH_ID ch_id, char *name, tUIPC_RCV_CBA
static void uipc_flush_ch_locked(tUIPC_CH_ID ch_id)
{
- char buf;
+ char buf[UIPC_FLUSH_BUFFER_SIZE];
struct pollfd pfd;
int ret;
- pfd.events = POLLIN|POLLHUP;
+ pfd.events = POLLIN;
pfd.fd = uipc_main.ch[ch_id].fd;
if (uipc_main.ch[ch_id].fd == UIPC_DISCONNECTED)
+ {
+ BTIF_TRACE_EVENT("%s() - fd disconnected. Exiting", __FUNCTION__);
return;
+ }
while (1)
{
ret = poll(&pfd, 1, 1);
- BTIF_TRACE_EVENT("uipc_flush_ch_locked polling : fd %d, rxev %x, ret %d", pfd.fd, pfd.revents, ret);
+ BTIF_TRACE_VERBOSE("%s() - polling fd %d, revents: 0x%x, ret %d",
+ __FUNCTION__, pfd.fd, pfd.revents, ret);
if (pfd.revents & (POLLERR|POLLHUP))
+ {
+ BTIF_TRACE_EVENT("%s() - POLLERR or POLLHUP. Exiting", __FUNCTION__);
return;
+ }
if (ret <= 0)
{
- BTIF_TRACE_EVENT("uipc_flush_ch_locked : error (%d)", ret);
+ BTIF_TRACE_EVENT("%s() - error (%d). Exiting", __FUNCTION__, ret);
return;
}
- read(pfd.fd, &buf, 1);
+
+ /* read sufficiently large buffer to ensure flush empties socket faster than
+ it is getting refilled */
+ read(pfd.fd, &buf, UIPC_FLUSH_BUFFER_SIZE);
}
}