Loading system/bta/ar/bta_ar.cc +3 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,9 @@ void bta_ar_reg_avdt(AvdtpRcb* p_reg, tAVDT_CTRL_CBACK* p_cback, if (mask) { if (bta_ar_cb.avdt_registered == 0) { AVDT_Register(p_reg, bta_ar_avdt_cback); } else { APPL_TRACE_WARNING("%s: sys_id:%d doesn't register again (registered:%d)", __func__, sys_id, bta_ar_cb.avdt_registered); } bta_ar_cb.avdt_registered |= mask; } Loading system/bta/av/bta_av_act.cc +11 −3 Original line number Diff line number Diff line Loading @@ -1304,6 +1304,7 @@ void bta_av_conn_chg(tBTA_AV_DATA* p_data) { ******************************************************************************/ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) { BT_HDR hdr; bool disabling_in_progress = false; uint16_t xx; p_cb->disabling = true; Loading @@ -1318,8 +1319,13 @@ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) { if (p_cb->p_scb[xx] != NULL) { hdr.layer_specific = xx + 1; bta_av_api_deregister((tBTA_AV_DATA*)&hdr); disabling_in_progress = true; } } // Since All channels are deregistering by API_DEREGISTER, the DEREG_COMP_EVT // would come first before API_DISABLE if there is no connections, and it is // no needed to setup this disabling flag. p_cb->disabling = disabling_in_progress; alarm_free(p_cb->link_signalling_timer); p_cb->link_signalling_timer = NULL; Loading Loading @@ -2250,9 +2256,9 @@ void bta_av_dereg_comp(tBTA_AV_DATA* p_data) { p_scb->hndl); mask = BTA_AV_HNDL_TO_MSK(p_scb->hdi); p_cb->reg_audio &= ~mask; if ((p_cb->conn_audio & mask) && bta_av_cb.audio_open_cnt) { if ((p_cb->conn_audio & mask) && p_cb->audio_open_cnt) { /* this channel is still marked as open. decrease the count */ bta_av_cb.audio_open_cnt--; p_cb->audio_open_cnt--; } p_cb->conn_audio &= ~mask; Loading Loading @@ -2303,7 +2309,9 @@ void bta_av_dereg_comp(tBTA_AV_DATA* p_data) { if (p_cb->disabling) { p_cb->disabling = false; bta_av_cb.features = 0; // reset enabling parameters p_cb->features = 0; p_cb->sec_mask = 0; } /* Clear the Capturing service class bit */ Loading system/bta/av/bta_av_int.h +5 −0 Original line number Diff line number Diff line Loading @@ -603,6 +603,7 @@ typedef struct { tBTA_SEC sec_mask; /* security mask */ tBTA_AV_HNDL handle; /* the handle for SDP activity */ bool disabling; /* true if api disabled called */ uint8_t enabling_attempts; // counter to wait for previous disabling uint8_t disc; /* (hdi+1) or (rc_handle|BTA_AV_CHNL_MSK) if p_disc_db is in use */ uint8_t state; /* state machine state */ Loading @@ -617,6 +618,10 @@ typedef struct { uint8_t audio_streams; /* handle mask of streaming audio channels */ } tBTA_AV_CB; // total attempts are half seconds constexpr uint32_t kEnablingAttemptsIntervalMs = 100; constexpr uint8_t kEnablingAttemptsCountMaximum = 5; // A2DP offload VSC parameters class tBT_A2DP_OFFLOAD { public: Loading system/bta/av/bta_av_main.cc +52 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,7 @@ const tBTA_AV_NSM_ACT bta_av_nsm_act[] = { ****************************************************************************/ /* AV control block */ tBTA_AV_CB bta_av_cb; tBTA_AV_CB bta_av_cb = {}; static const char* bta_av_st_code(uint8_t state); Loading @@ -218,6 +218,39 @@ static const char* bta_av_st_code(uint8_t state); * ******************************************************************************/ static void bta_av_api_enable(tBTA_AV_DATA* p_data) { if (bta_av_cb.disabling) { APPL_TRACE_WARNING( "%s: previous (reg_audio=%#x) is still disabling (attempts=%d)", __func__, bta_av_cb.reg_audio, bta_av_cb.enabling_attempts); if (++bta_av_cb.enabling_attempts <= kEnablingAttemptsCountMaximum) { tBTA_AV_API_ENABLE* p_buf = (tBTA_AV_API_ENABLE*)osi_malloc(sizeof(tBTA_AV_API_ENABLE)); memcpy(p_buf, &p_data->api_enable, sizeof(tBTA_AV_API_ENABLE)); bta_sys_sendmsg_delayed(p_buf, base::TimeDelta::FromMilliseconds( kEnablingAttemptsIntervalMs)); return; } if (bta_av_cb.sdp_a2dp_handle) { SDP_DeleteRecord(bta_av_cb.sdp_a2dp_handle); bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE); } #if (BTA_AV_SINK_INCLUDED == TRUE) if (bta_av_cb.sdp_a2dp_snk_handle) { SDP_DeleteRecord(bta_av_cb.sdp_a2dp_snk_handle); bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK); } #endif #if (BTA_AR_INCLUDED == TRUE) // deregister from AVDT bta_ar_dereg_avdt(BTA_ID_AV); // deregister from AVCT bta_ar_dereg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, BTA_ID_AV); bta_ar_dereg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, BTA_ID_AV); bta_ar_dereg_avct(BTA_ID_AV); #endif } /* initialize control block */ memset(&bta_av_cb, 0, sizeof(tBTA_AV_CB)); Loading Loading @@ -471,6 +504,21 @@ static void bta_av_api_register(tBTA_AV_DATA* p_data) { char* p_service_name; tBTA_UTL_COD cod; if (bta_av_cb.disabling || (bta_av_cb.features == 0 && bta_av_cb.sec_mask == 0)) { APPL_TRACE_WARNING( "%s: AV instance (features=%#x, sec_mask=%#x, reg_audio=%#x) is not " "ready for app_id %d", __func__, bta_av_cb.features, bta_av_cb.sec_mask, bta_av_cb.reg_audio, p_data->api_reg.app_id); tBTA_AV_API_REG* p_buf = (tBTA_AV_API_REG*)osi_malloc(sizeof(tBTA_AV_API_REG)); memcpy(p_buf, &p_data->api_reg, sizeof(tBTA_AV_API_REG)); bta_sys_sendmsg_delayed( p_buf, base::TimeDelta::FromMilliseconds(kEnablingAttemptsIntervalMs)); return; } avdtp_stream_config.Reset(); registr.status = BTA_AV_FAIL_RESOURCES; Loading Loading @@ -641,6 +689,9 @@ static void bta_av_api_register(tBTA_AV_DATA* p_data) { } if (AVDT_CreateStream(p_scb->app_id, &p_scb->seps[codec_index].av_handle, avdtp_stream_config) != AVDT_SUCCESS) { APPL_TRACE_WARNING( "%s: bta_handle=0x%x (app_id %d) failed to alloc an SEP index:%d", __func__, p_scb->hndl, p_scb->app_id, codec_index); continue; } /* Save a copy of the codec */ Loading system/bta/sys/bta_sys.h +1 −0 Original line number Diff line number Diff line Loading @@ -222,6 +222,7 @@ extern void bta_sys_deregister(uint8_t id); extern bool bta_sys_is_register(uint8_t id); extern uint16_t bta_sys_get_sys_features(void); extern void bta_sys_sendmsg(void* p_msg); extern void bta_sys_sendmsg_delayed(void* p_msg, const base::TimeDelta& delay); extern void bta_sys_start_timer(alarm_t* alarm, uint64_t interval_ms, uint16_t event, uint16_t layer_specific); extern void bta_sys_disable(tBTA_SYS_HW_MODULE module); Loading Loading
system/bta/ar/bta_ar.cc +3 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,9 @@ void bta_ar_reg_avdt(AvdtpRcb* p_reg, tAVDT_CTRL_CBACK* p_cback, if (mask) { if (bta_ar_cb.avdt_registered == 0) { AVDT_Register(p_reg, bta_ar_avdt_cback); } else { APPL_TRACE_WARNING("%s: sys_id:%d doesn't register again (registered:%d)", __func__, sys_id, bta_ar_cb.avdt_registered); } bta_ar_cb.avdt_registered |= mask; } Loading
system/bta/av/bta_av_act.cc +11 −3 Original line number Diff line number Diff line Loading @@ -1304,6 +1304,7 @@ void bta_av_conn_chg(tBTA_AV_DATA* p_data) { ******************************************************************************/ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) { BT_HDR hdr; bool disabling_in_progress = false; uint16_t xx; p_cb->disabling = true; Loading @@ -1318,8 +1319,13 @@ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) { if (p_cb->p_scb[xx] != NULL) { hdr.layer_specific = xx + 1; bta_av_api_deregister((tBTA_AV_DATA*)&hdr); disabling_in_progress = true; } } // Since All channels are deregistering by API_DEREGISTER, the DEREG_COMP_EVT // would come first before API_DISABLE if there is no connections, and it is // no needed to setup this disabling flag. p_cb->disabling = disabling_in_progress; alarm_free(p_cb->link_signalling_timer); p_cb->link_signalling_timer = NULL; Loading Loading @@ -2250,9 +2256,9 @@ void bta_av_dereg_comp(tBTA_AV_DATA* p_data) { p_scb->hndl); mask = BTA_AV_HNDL_TO_MSK(p_scb->hdi); p_cb->reg_audio &= ~mask; if ((p_cb->conn_audio & mask) && bta_av_cb.audio_open_cnt) { if ((p_cb->conn_audio & mask) && p_cb->audio_open_cnt) { /* this channel is still marked as open. decrease the count */ bta_av_cb.audio_open_cnt--; p_cb->audio_open_cnt--; } p_cb->conn_audio &= ~mask; Loading Loading @@ -2303,7 +2309,9 @@ void bta_av_dereg_comp(tBTA_AV_DATA* p_data) { if (p_cb->disabling) { p_cb->disabling = false; bta_av_cb.features = 0; // reset enabling parameters p_cb->features = 0; p_cb->sec_mask = 0; } /* Clear the Capturing service class bit */ Loading
system/bta/av/bta_av_int.h +5 −0 Original line number Diff line number Diff line Loading @@ -603,6 +603,7 @@ typedef struct { tBTA_SEC sec_mask; /* security mask */ tBTA_AV_HNDL handle; /* the handle for SDP activity */ bool disabling; /* true if api disabled called */ uint8_t enabling_attempts; // counter to wait for previous disabling uint8_t disc; /* (hdi+1) or (rc_handle|BTA_AV_CHNL_MSK) if p_disc_db is in use */ uint8_t state; /* state machine state */ Loading @@ -617,6 +618,10 @@ typedef struct { uint8_t audio_streams; /* handle mask of streaming audio channels */ } tBTA_AV_CB; // total attempts are half seconds constexpr uint32_t kEnablingAttemptsIntervalMs = 100; constexpr uint8_t kEnablingAttemptsCountMaximum = 5; // A2DP offload VSC parameters class tBT_A2DP_OFFLOAD { public: Loading
system/bta/av/bta_av_main.cc +52 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,7 @@ const tBTA_AV_NSM_ACT bta_av_nsm_act[] = { ****************************************************************************/ /* AV control block */ tBTA_AV_CB bta_av_cb; tBTA_AV_CB bta_av_cb = {}; static const char* bta_av_st_code(uint8_t state); Loading @@ -218,6 +218,39 @@ static const char* bta_av_st_code(uint8_t state); * ******************************************************************************/ static void bta_av_api_enable(tBTA_AV_DATA* p_data) { if (bta_av_cb.disabling) { APPL_TRACE_WARNING( "%s: previous (reg_audio=%#x) is still disabling (attempts=%d)", __func__, bta_av_cb.reg_audio, bta_av_cb.enabling_attempts); if (++bta_av_cb.enabling_attempts <= kEnablingAttemptsCountMaximum) { tBTA_AV_API_ENABLE* p_buf = (tBTA_AV_API_ENABLE*)osi_malloc(sizeof(tBTA_AV_API_ENABLE)); memcpy(p_buf, &p_data->api_enable, sizeof(tBTA_AV_API_ENABLE)); bta_sys_sendmsg_delayed(p_buf, base::TimeDelta::FromMilliseconds( kEnablingAttemptsIntervalMs)); return; } if (bta_av_cb.sdp_a2dp_handle) { SDP_DeleteRecord(bta_av_cb.sdp_a2dp_handle); bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE); } #if (BTA_AV_SINK_INCLUDED == TRUE) if (bta_av_cb.sdp_a2dp_snk_handle) { SDP_DeleteRecord(bta_av_cb.sdp_a2dp_snk_handle); bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK); } #endif #if (BTA_AR_INCLUDED == TRUE) // deregister from AVDT bta_ar_dereg_avdt(BTA_ID_AV); // deregister from AVCT bta_ar_dereg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, BTA_ID_AV); bta_ar_dereg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, BTA_ID_AV); bta_ar_dereg_avct(BTA_ID_AV); #endif } /* initialize control block */ memset(&bta_av_cb, 0, sizeof(tBTA_AV_CB)); Loading Loading @@ -471,6 +504,21 @@ static void bta_av_api_register(tBTA_AV_DATA* p_data) { char* p_service_name; tBTA_UTL_COD cod; if (bta_av_cb.disabling || (bta_av_cb.features == 0 && bta_av_cb.sec_mask == 0)) { APPL_TRACE_WARNING( "%s: AV instance (features=%#x, sec_mask=%#x, reg_audio=%#x) is not " "ready for app_id %d", __func__, bta_av_cb.features, bta_av_cb.sec_mask, bta_av_cb.reg_audio, p_data->api_reg.app_id); tBTA_AV_API_REG* p_buf = (tBTA_AV_API_REG*)osi_malloc(sizeof(tBTA_AV_API_REG)); memcpy(p_buf, &p_data->api_reg, sizeof(tBTA_AV_API_REG)); bta_sys_sendmsg_delayed( p_buf, base::TimeDelta::FromMilliseconds(kEnablingAttemptsIntervalMs)); return; } avdtp_stream_config.Reset(); registr.status = BTA_AV_FAIL_RESOURCES; Loading Loading @@ -641,6 +689,9 @@ static void bta_av_api_register(tBTA_AV_DATA* p_data) { } if (AVDT_CreateStream(p_scb->app_id, &p_scb->seps[codec_index].av_handle, avdtp_stream_config) != AVDT_SUCCESS) { APPL_TRACE_WARNING( "%s: bta_handle=0x%x (app_id %d) failed to alloc an SEP index:%d", __func__, p_scb->hndl, p_scb->app_id, codec_index); continue; } /* Save a copy of the codec */ Loading
system/bta/sys/bta_sys.h +1 −0 Original line number Diff line number Diff line Loading @@ -222,6 +222,7 @@ extern void bta_sys_deregister(uint8_t id); extern bool bta_sys_is_register(uint8_t id); extern uint16_t bta_sys_get_sys_features(void); extern void bta_sys_sendmsg(void* p_msg); extern void bta_sys_sendmsg_delayed(void* p_msg, const base::TimeDelta& delay); extern void bta_sys_start_timer(alarm_t* alarm, uint64_t interval_ms, uint16_t event, uint16_t layer_specific); extern void bta_sys_disable(tBTA_SYS_HW_MODULE module); Loading