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

Commit b747da53 authored by Henri Chataing's avatar Henri Chataing Committed by Gerrit Code Review
Browse files

Merge "btif_a2dp_source: Trace offload a2dp sessions" into main

parents f3be8e11 4f585543
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -130,6 +130,8 @@ void btif_a2dp_on_offload_started(const RawAddress& peer_addr, tBTA_AV_STATUS st

  switch (status) {
    case BTA_AV_SUCCESS:
      // Call required to update the session state for metrics.
      btif_a2dp_source_start_audio_req();
      ack = BluetoothAudioStatus::SUCCESS;
      break;
    case BTA_AV_FAIL_RESOURCES:
+22 −34
Original line number Diff line number Diff line
@@ -761,7 +761,6 @@ void btif_a2dp_source_on_stopped(tBTA_AV_SUSPEND* p_av_suspend) {
    }
  } else {
    bluetooth::audio::a2dp::ack_stream_suspended(BluetoothAudioStatus::SUCCESS);
    return;
  }

  if (btif_a2dp_source_cb.State() == BtifA2dpSource::kStateOff) {
@@ -797,7 +796,6 @@ void btif_a2dp_source_on_suspended(tBTA_AV_SUSPEND* p_av_suspend) {
    }
  } else if (btif_av_is_a2dp_offload_running()) {
    bluetooth::audio::a2dp::ack_stream_suspended(BluetoothAudioStatus::SUCCESS);
    return;
  }

  // ensure tx frames are immediately suspended
@@ -819,60 +817,54 @@ static void btif_a2dp_source_audio_tx_start_event(void) {
  log::info("streaming {} state={}", btif_a2dp_source_is_streaming(),
            btif_a2dp_source_cb.StateStr());

  btif_a2dp_source_cb.stats.Reset();
  btif_a2dp_source_cb.stats.session_start_us = bluetooth::common::time_get_os_boottime_us();
  btif_a2dp_source_cb.stats.session_end_us = 0;

  A2dpCodecConfig* codec_config = bta_av_get_a2dp_current_codec();
  if (codec_config != nullptr) {
    btif_a2dp_source_cb.stats.codec_index = codec_config->codecIndex();
  }

  if (btif_av_is_a2dp_offload_running()) {
    return;
  }

  /* Reset the media feeding state */
  log::assert_that(btif_a2dp_source_cb.encoder_interface != nullptr,
                   "assert failed: btif_a2dp_source_cb.encoder_interface != nullptr");
  btif_a2dp_source_cb.encoder_interface->feeding_reset();

  log::verbose("starting timer {} ms",
  log::verbose("starting media encoder timer with interval {}ms",
               btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms());

  /* audio engine starting, reset tx suspended flag */
  btif_a2dp_source_cb.tx_flush = false;

  wakelock_acquire();
  btif_a2dp_source_cb.encoder_interface->feeding_reset();
  btif_a2dp_source_cb.tx_flush = false;
  btif_a2dp_source_cb.sw_audio_is_encoding = true;
  btif_a2dp_source_cb.media_alarm.SchedulePeriodic(
          btif_a2dp_source_thread.GetWeakPtr(), FROM_HERE,
          base::BindRepeating(&btif_a2dp_source_audio_handle_timer),
          std::chrono::milliseconds(
                  btif_a2dp_source_cb.encoder_interface->get_encoder_interval_ms()));
  btif_a2dp_source_cb.sw_audio_is_encoding = true;

  btif_a2dp_source_cb.stats.Reset();
  // Assign session_start_us to 1 when
  // bluetooth::common::time_get_os_boottime_us() is 0 to indicate
  // btif_a2dp_source_start_audio_req() has been called
  btif_a2dp_source_cb.stats.session_start_us = bluetooth::common::time_get_os_boottime_us();
  if (btif_a2dp_source_cb.stats.session_start_us == 0) {
    btif_a2dp_source_cb.stats.session_start_us = 1;
  }
  btif_a2dp_source_cb.stats.session_end_us = 0;
  A2dpCodecConfig* codec_config = bta_av_get_a2dp_current_codec();
  if (codec_config != nullptr) {
    btif_a2dp_source_cb.stats.codec_index = codec_config->codecIndex();
  }
}

static void btif_a2dp_source_audio_tx_stop_event(void) {
  log::info("streaming {} state={}", btif_a2dp_source_is_streaming(),
            btif_a2dp_source_cb.StateStr());

  btif_a2dp_source_cb.stats.session_end_us = bluetooth::common::time_get_os_boottime_us();

  btif_a2dp_source_update_metrics();
  btif_a2dp_source_accumulate_stats(&btif_a2dp_source_cb.stats,
                                    &btif_a2dp_source_cb.accumulated_stats);

  if (btif_av_is_a2dp_offload_running()) {
    return;
  }

  if (!btif_a2dp_source_is_streaming()) {
    return;
  }

  btif_a2dp_source_cb.stats.session_end_us = bluetooth::common::time_get_os_boottime_us();
  btif_a2dp_source_update_metrics();
  btif_a2dp_source_accumulate_stats(&btif_a2dp_source_cb.stats,
                                    &btif_a2dp_source_cb.accumulated_stats);

  /* Drain data still left in the queue */
  static constexpr size_t AUDIO_STREAM_OUTPUT_BUFFER_SZ = 28 * 512;
  uint8_t p_buf[AUDIO_STREAM_OUTPUT_BUFFER_SZ * 2];
@@ -1258,15 +1250,11 @@ static void btif_a2dp_source_update_metrics(void) {
  A2dpSessionMetrics metrics;
  metrics.codec_index = stats.codec_index;
  metrics.is_a2dp_offload = btif_av_is_a2dp_offload_running();

  // session_start_us is 0 when btif_a2dp_source_start_audio_req() is not called
  // mark the metric duration as invalid (-1) in this case
  if (stats.session_start_us != 0) {
    int64_t session_end_us = stats.session_end_us == 0
                                     ? bluetooth::common::time_get_os_boottime_us()
                                     : stats.session_end_us;
    if (static_cast<uint64_t>(session_end_us) > stats.session_start_us) {
      metrics.audio_duration_ms = (session_end_us - stats.session_start_us) / 1000;
    }
    metrics.audio_duration_ms = (stats.session_end_us - stats.session_start_us) / 1000;
  }

  if (enqueue_stats.total_updates > 1) {