diff options
-rw-r--r-- | btif/include/btif_gatt_multi_adv_util.h | 4 | ||||
-rw-r--r-- | btif/src/btif_gatt_client.c | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | btif/src/btif_gatt_multi_adv_util.c | 45 | ||||
-rw-r--r-- | btif/src/btif_media_task.c | 87 | ||||
-rw-r--r-- | gki/common/gki_buffer.c | 6 | ||||
-rw-r--r-- | gki/ulinux/gki_ulinux.c | 23 | ||||
-rw-r--r-- | stack/btm/btm_ble_gap.c | 8 | ||||
-rw-r--r-- | udrv/ulinux/uipc.c | 22 |
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); } } |