Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c775258 authored by Hansong Zhang's avatar Hansong Zhang
Browse files

Replace A2DP source osi/alarm with common/Timer

Test: A2DP stream music
Change-Id: I4f7325b3eb3be07eca6c599c7f6f5e037b8e7a64
parent e776017d
Loading
Loading
Loading
Loading
+22 −30
Original line number Diff line number Diff line
@@ -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;

@@ -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) {}
@@ -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();
@@ -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;
@@ -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,
@@ -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",
@@ -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())
@@ -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) {
@@ -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());

@@ -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
@@ -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());

@@ -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);

@@ -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;
@@ -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;
  }