Loading system/btif/src/btif_a2dp_source.cc +22 −30 Original line number Diff line number Diff line Loading @@ -42,13 +42,16 @@ #include "common/message_loop_thread.h" #include "common/metrics.h" #include "common/time_util.h" #include "common/timer.h" #include "osi/include/fixed_queue.h" #include "osi/include/log.h" #include "osi/include/osi.h" #include "osi/include/wakelock.h" #include "uipc.h" using bluetooth::common::A2dpSessionMetrics; using bluetooth::common::BluetoothMetricsLogger; using bluetooth::common::Timer; extern std::unique_ptr<tUIPC_STATE> a2dp_uipc; Loading Loading @@ -174,7 +177,6 @@ class BtifA2dpSource { BtifA2dpSource() : tx_audio_queue(nullptr), tx_flush(false), media_alarm(nullptr), encoder_interface(nullptr), encoder_interval_ms(0), state_(kStateOff) {} Loading @@ -183,8 +185,8 @@ class BtifA2dpSource { fixed_queue_free(tx_audio_queue, nullptr); tx_audio_queue = nullptr; tx_flush = false; alarm_free(media_alarm); media_alarm = nullptr; media_alarm.CancelAndWait(); wakelock_release(); encoder_interface = nullptr; encoder_interval_ms = 0; stats.Reset(); Loading @@ -210,7 +212,7 @@ class BtifA2dpSource { fixed_queue_t* tx_audio_queue; bool tx_flush; /* Discards any outgoing data when true */ alarm_t* media_alarm; Timer media_alarm; const tA2DP_ENCODER_INTERFACE* encoder_interface; uint64_t encoder_interval_ms; /* Local copy of the encoder interval */ BtifMediaStats stats; Loading Loading @@ -247,7 +249,6 @@ static void btif_a2dp_source_encoder_user_config_update_event( static void btif_a2dp_source_audio_feeding_update_event( const btav_a2dp_codec_config_t& codec_audio_config); static bool btif_a2dp_source_audio_tx_flush_req(void); static void btif_a2dp_source_alarm_cb(void* context); static void btif_a2dp_source_audio_handle_timer(void); static uint32_t btif_a2dp_source_read_callback(uint8_t* p_buf, uint32_t len); static bool btif_a2dp_source_enqueue_callback(BT_HDR* p_buf, size_t frames_n, Loading Loading @@ -388,7 +389,7 @@ static void btif_a2dp_source_start_session_delayed( bool btif_a2dp_source_restart_session(const RawAddress& old_peer_address, const RawAddress& new_peer_address) { bool is_streaming = alarm_is_scheduled(btif_a2dp_source_cb.media_alarm); bool is_streaming = btif_a2dp_source_cb.media_alarm.IsScheduled(); LOG_INFO(LOG_TAG, "%s: old_peer_address=%s new_peer_address=%s is_streaming=%s " "state=%s", Loading Loading @@ -471,8 +472,8 @@ static void btif_a2dp_source_shutdown_delayed(void) { btif_a2dp_source_cb.StateStr().c_str()); // Stop the timer alarm_free(btif_a2dp_source_cb.media_alarm); btif_a2dp_source_cb.media_alarm = nullptr; btif_a2dp_source_cb.media_alarm.CancelAndWait(); wakelock_release(); btif_a2dp_control_cleanup(); if (btif_av_is_a2dp_offload_enabled()) Loading Loading @@ -512,7 +513,7 @@ bool btif_a2dp_source_media_task_is_shutting_down(void) { } bool btif_a2dp_source_is_streaming(void) { return alarm_is_scheduled(btif_a2dp_source_cb.media_alarm); return btif_a2dp_source_cb.media_alarm.IsScheduled(); } static void btif_a2dp_source_setup_codec(const RawAddress& peer_address) { Loading Loading @@ -697,7 +698,7 @@ void btif_a2dp_source_set_tx_flush(bool enable) { static void btif_a2dp_source_audio_tx_start_event(void) { LOG_INFO(LOG_TAG, "%s: media_alarm is %srunning, streaming %s state=%s", __func__, alarm_is_scheduled(btif_a2dp_source_cb.media_alarm) ? "" : "not ", btif_a2dp_source_cb.media_alarm.IsScheduled() ? "" : "not ", btif_a2dp_source_is_streaming() ? "true" : "false", btif_a2dp_source_cb.StateStr().c_str()); Loading @@ -710,17 +711,13 @@ static void btif_a2dp_source_audio_tx_start_event(void) { APPL_TRACE_EVENT( "%s: starting timer %" PRIu64 " ms", __func__, btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms()); alarm_free(btif_a2dp_source_cb.media_alarm); btif_a2dp_source_cb.media_alarm = alarm_new_periodic("btif.a2dp_source_media_alarm"); if (btif_a2dp_source_cb.media_alarm == nullptr) { LOG_ERROR(LOG_TAG, "%s: unable to allocate media alarm", __func__); return; } alarm_set(btif_a2dp_source_cb.media_alarm, btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms(), btif_a2dp_source_alarm_cb, nullptr); wakelock_acquire(); btif_a2dp_source_cb.media_alarm.SchedulePeriodic( btif_a2dp_source_thread.GetWeakPtr(), FROM_HERE, base::Bind(&btif_a2dp_source_audio_handle_timer), base::TimeDelta::FromMilliseconds( btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms())); btif_a2dp_source_cb.stats.Reset(); // Assign session_start_us to 1 when Loading @@ -741,7 +738,7 @@ static void btif_a2dp_source_audio_tx_start_event(void) { static void btif_a2dp_source_audio_tx_stop_event(void) { LOG_INFO(LOG_TAG, "%s: media_alarm is %srunning, streaming %s state=%s", __func__, alarm_is_scheduled(btif_a2dp_source_cb.media_alarm) ? "" : "not ", btif_a2dp_source_cb.media_alarm.IsScheduled() ? "" : "not ", btif_a2dp_source_is_streaming() ? "true" : "false", btif_a2dp_source_cb.StateStr().c_str()); Loading @@ -761,8 +758,8 @@ static void btif_a2dp_source_audio_tx_stop_event(void) { UIPC_Read(*a2dp_uipc, UIPC_CH_ID_AV_AUDIO, &event, p_buf, sizeof(p_buf))); /* Stop the timer first */ alarm_free(btif_a2dp_source_cb.media_alarm); btif_a2dp_source_cb.media_alarm = nullptr; btif_a2dp_source_cb.media_alarm.CancelAndWait(); wakelock_release(); UIPC_Close(*a2dp_uipc, UIPC_CH_ID_AV_AUDIO); Loading @@ -789,18 +786,13 @@ static void btif_a2dp_source_audio_tx_stop_event(void) { btif_a2dp_source_cb.encoder_interface->feeding_reset(); } static void btif_a2dp_source_alarm_cb(UNUSED_ATTR void* context) { btif_a2dp_source_thread.DoInThread( FROM_HERE, base::Bind(&btif_a2dp_source_audio_handle_timer)); } static void btif_a2dp_source_audio_handle_timer(void) { if (btif_av_is_a2dp_offload_enabled()) return; uint64_t timestamp_us = bluetooth::common::time_get_os_boottime_us(); log_tstamps_us("A2DP Source tx timer", timestamp_us); if (!alarm_is_scheduled(btif_a2dp_source_cb.media_alarm)) { if (!btif_a2dp_source_cb.media_alarm.IsScheduled()) { LOG_ERROR(LOG_TAG, "%s: ERROR Media task Scheduled after Suspend", __func__); return; Loading Loading @@ -847,7 +839,7 @@ static bool btif_a2dp_source_enqueue_callback(BT_HDR* p_buf, size_t frames_n, btif_a2dp_control_log_bytes_read(bytes_read); /* Check if timer was stopped (media task stopped) */ if (!alarm_is_scheduled(btif_a2dp_source_cb.media_alarm)) { if (!btif_a2dp_source_cb.media_alarm.IsScheduled()) { osi_free(p_buf); return false; } Loading Loading
system/btif/src/btif_a2dp_source.cc +22 −30 Original line number Diff line number Diff line Loading @@ -42,13 +42,16 @@ #include "common/message_loop_thread.h" #include "common/metrics.h" #include "common/time_util.h" #include "common/timer.h" #include "osi/include/fixed_queue.h" #include "osi/include/log.h" #include "osi/include/osi.h" #include "osi/include/wakelock.h" #include "uipc.h" using bluetooth::common::A2dpSessionMetrics; using bluetooth::common::BluetoothMetricsLogger; using bluetooth::common::Timer; extern std::unique_ptr<tUIPC_STATE> a2dp_uipc; Loading Loading @@ -174,7 +177,6 @@ class BtifA2dpSource { BtifA2dpSource() : tx_audio_queue(nullptr), tx_flush(false), media_alarm(nullptr), encoder_interface(nullptr), encoder_interval_ms(0), state_(kStateOff) {} Loading @@ -183,8 +185,8 @@ class BtifA2dpSource { fixed_queue_free(tx_audio_queue, nullptr); tx_audio_queue = nullptr; tx_flush = false; alarm_free(media_alarm); media_alarm = nullptr; media_alarm.CancelAndWait(); wakelock_release(); encoder_interface = nullptr; encoder_interval_ms = 0; stats.Reset(); Loading @@ -210,7 +212,7 @@ class BtifA2dpSource { fixed_queue_t* tx_audio_queue; bool tx_flush; /* Discards any outgoing data when true */ alarm_t* media_alarm; Timer media_alarm; const tA2DP_ENCODER_INTERFACE* encoder_interface; uint64_t encoder_interval_ms; /* Local copy of the encoder interval */ BtifMediaStats stats; Loading Loading @@ -247,7 +249,6 @@ static void btif_a2dp_source_encoder_user_config_update_event( static void btif_a2dp_source_audio_feeding_update_event( const btav_a2dp_codec_config_t& codec_audio_config); static bool btif_a2dp_source_audio_tx_flush_req(void); static void btif_a2dp_source_alarm_cb(void* context); static void btif_a2dp_source_audio_handle_timer(void); static uint32_t btif_a2dp_source_read_callback(uint8_t* p_buf, uint32_t len); static bool btif_a2dp_source_enqueue_callback(BT_HDR* p_buf, size_t frames_n, Loading Loading @@ -388,7 +389,7 @@ static void btif_a2dp_source_start_session_delayed( bool btif_a2dp_source_restart_session(const RawAddress& old_peer_address, const RawAddress& new_peer_address) { bool is_streaming = alarm_is_scheduled(btif_a2dp_source_cb.media_alarm); bool is_streaming = btif_a2dp_source_cb.media_alarm.IsScheduled(); LOG_INFO(LOG_TAG, "%s: old_peer_address=%s new_peer_address=%s is_streaming=%s " "state=%s", Loading Loading @@ -471,8 +472,8 @@ static void btif_a2dp_source_shutdown_delayed(void) { btif_a2dp_source_cb.StateStr().c_str()); // Stop the timer alarm_free(btif_a2dp_source_cb.media_alarm); btif_a2dp_source_cb.media_alarm = nullptr; btif_a2dp_source_cb.media_alarm.CancelAndWait(); wakelock_release(); btif_a2dp_control_cleanup(); if (btif_av_is_a2dp_offload_enabled()) Loading Loading @@ -512,7 +513,7 @@ bool btif_a2dp_source_media_task_is_shutting_down(void) { } bool btif_a2dp_source_is_streaming(void) { return alarm_is_scheduled(btif_a2dp_source_cb.media_alarm); return btif_a2dp_source_cb.media_alarm.IsScheduled(); } static void btif_a2dp_source_setup_codec(const RawAddress& peer_address) { Loading Loading @@ -697,7 +698,7 @@ void btif_a2dp_source_set_tx_flush(bool enable) { static void btif_a2dp_source_audio_tx_start_event(void) { LOG_INFO(LOG_TAG, "%s: media_alarm is %srunning, streaming %s state=%s", __func__, alarm_is_scheduled(btif_a2dp_source_cb.media_alarm) ? "" : "not ", btif_a2dp_source_cb.media_alarm.IsScheduled() ? "" : "not ", btif_a2dp_source_is_streaming() ? "true" : "false", btif_a2dp_source_cb.StateStr().c_str()); Loading @@ -710,17 +711,13 @@ static void btif_a2dp_source_audio_tx_start_event(void) { APPL_TRACE_EVENT( "%s: starting timer %" PRIu64 " ms", __func__, btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms()); alarm_free(btif_a2dp_source_cb.media_alarm); btif_a2dp_source_cb.media_alarm = alarm_new_periodic("btif.a2dp_source_media_alarm"); if (btif_a2dp_source_cb.media_alarm == nullptr) { LOG_ERROR(LOG_TAG, "%s: unable to allocate media alarm", __func__); return; } alarm_set(btif_a2dp_source_cb.media_alarm, btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms(), btif_a2dp_source_alarm_cb, nullptr); wakelock_acquire(); btif_a2dp_source_cb.media_alarm.SchedulePeriodic( btif_a2dp_source_thread.GetWeakPtr(), FROM_HERE, base::Bind(&btif_a2dp_source_audio_handle_timer), base::TimeDelta::FromMilliseconds( btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms())); btif_a2dp_source_cb.stats.Reset(); // Assign session_start_us to 1 when Loading @@ -741,7 +738,7 @@ static void btif_a2dp_source_audio_tx_start_event(void) { static void btif_a2dp_source_audio_tx_stop_event(void) { LOG_INFO(LOG_TAG, "%s: media_alarm is %srunning, streaming %s state=%s", __func__, alarm_is_scheduled(btif_a2dp_source_cb.media_alarm) ? "" : "not ", btif_a2dp_source_cb.media_alarm.IsScheduled() ? "" : "not ", btif_a2dp_source_is_streaming() ? "true" : "false", btif_a2dp_source_cb.StateStr().c_str()); Loading @@ -761,8 +758,8 @@ static void btif_a2dp_source_audio_tx_stop_event(void) { UIPC_Read(*a2dp_uipc, UIPC_CH_ID_AV_AUDIO, &event, p_buf, sizeof(p_buf))); /* Stop the timer first */ alarm_free(btif_a2dp_source_cb.media_alarm); btif_a2dp_source_cb.media_alarm = nullptr; btif_a2dp_source_cb.media_alarm.CancelAndWait(); wakelock_release(); UIPC_Close(*a2dp_uipc, UIPC_CH_ID_AV_AUDIO); Loading @@ -789,18 +786,13 @@ static void btif_a2dp_source_audio_tx_stop_event(void) { btif_a2dp_source_cb.encoder_interface->feeding_reset(); } static void btif_a2dp_source_alarm_cb(UNUSED_ATTR void* context) { btif_a2dp_source_thread.DoInThread( FROM_HERE, base::Bind(&btif_a2dp_source_audio_handle_timer)); } static void btif_a2dp_source_audio_handle_timer(void) { if (btif_av_is_a2dp_offload_enabled()) return; uint64_t timestamp_us = bluetooth::common::time_get_os_boottime_us(); log_tstamps_us("A2DP Source tx timer", timestamp_us); if (!alarm_is_scheduled(btif_a2dp_source_cb.media_alarm)) { if (!btif_a2dp_source_cb.media_alarm.IsScheduled()) { LOG_ERROR(LOG_TAG, "%s: ERROR Media task Scheduled after Suspend", __func__); return; Loading Loading @@ -847,7 +839,7 @@ static bool btif_a2dp_source_enqueue_callback(BT_HDR* p_buf, size_t frames_n, btif_a2dp_control_log_bytes_read(bytes_read); /* Check if timer was stopped (media task stopped) */ if (!alarm_is_scheduled(btif_a2dp_source_cb.media_alarm)) { if (!btif_a2dp_source_cb.media_alarm.IsScheduled()) { osi_free(p_buf); return false; } Loading