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

Commit 4cb702cc authored by Josh Wu's avatar Josh Wu
Browse files

Add LeAudioBroadcastSession

* Add Broadcast methods to MetricsCollector
* Implement LogLeAudioBroadcastSessionReported logging API
* Add Broadcast cases to MetricsCollectorTest

Test: atest BluetoothInstrumentationTests
Tag: #feature
Bug: 207811438
Change-Id: I9858d3841de7e3244acc3ff62efe2e497b08899a
parent a04ceabd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -768,6 +768,7 @@ cc_test {
        "le_audio/broadcaster/mock_state_machine.cc",
        "le_audio/client_audio.cc",
        "le_audio/le_audio_types.cc",
        "le_audio/metrics_collector_linux.cc",
        "le_audio/mock_iso_manager.cc",
        "test/common/mock_controller.cc",
        "le_audio/mock_codec_manager.cc",
+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "bta/include/bta_le_audio_broadcaster_api.h"
#include "bta/le_audio/broadcaster/state_machine.h"
#include "bta/le_audio/le_audio_types.h"
#include "bta/le_audio/metrics_collector.h"
#include "device/include/controller.h"
#include "embdrv/lc3/include/lc3.h"
#include "gd/common/strings.h"
@@ -278,6 +279,7 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks {

      broadcasts_[broadcast_id]->ProcessMessage(
          BroadcastStateMachine::Message::START, nullptr);
      le_audio::MetricsCollector::Get()->OnBroadcastStateChanged(true);
    } else {
      LOG_ERROR("No such broadcast_id=%d", broadcast_id);
    }
@@ -295,6 +297,7 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks {
    broadcasts_[broadcast_id]->SetMuted(true);
    broadcasts_[broadcast_id]->ProcessMessage(
        BroadcastStateMachine::Message::STOP, nullptr);
    le_audio::MetricsCollector::Get()->OnBroadcastStateChanged(false);
  }

  void DestroyAudioBroadcast(uint32_t broadcast_id) override {
+19 −10
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

#include "metrics_collector.h"

#include <chrono>
#include <memory>
#include <vector>

@@ -24,17 +23,15 @@

namespace le_audio {

using ClockTimePoint =
    std::chrono::time_point<std::chrono::high_resolution_clock>;
using bluetooth::le_audio::ConnectionState;
using le_audio::types::LeAudioContextType;

const static ClockTimePoint kInvalidTimePoint{};
const static metrics::ClockTimePoint kInvalidTimePoint{};

MetricsCollector* MetricsCollector::instance = nullptr;

inline int64_t get_timedelta_nanos(const ClockTimePoint& t1,
                                   const ClockTimePoint& t2) {
inline int64_t get_timedelta_nanos(const metrics::ClockTimePoint& t1,
                                   const metrics::ClockTimePoint& t2) {
  if (t1 == kInvalidTimePoint || t2 == kInvalidTimePoint) {
    return -1;
  }
@@ -79,9 +76,9 @@ inline int32_t to_atom_context_type(const LeAudioContextType stack_type) {
class DeviceMetrics {
 public:
  RawAddress address_;
  ClockTimePoint connecting_timepoint_ = kInvalidTimePoint;
  ClockTimePoint connected_timepoint_ = kInvalidTimePoint;
  ClockTimePoint disconnected_timepoint_ = kInvalidTimePoint;
  metrics::ClockTimePoint connecting_timepoint_ = kInvalidTimePoint;
  metrics::ClockTimePoint connected_timepoint_ = kInvalidTimePoint;
  metrics::ClockTimePoint disconnected_timepoint_ = kInvalidTimePoint;
  int32_t connection_status_ = 0;
  int32_t disconnection_status_ = 0;

@@ -114,7 +111,7 @@ class GroupMetricsImpl : public GroupMetrics {
  int32_t group_size_;
  std::vector<std::unique_ptr<DeviceMetrics>> device_metrics_;
  std::unordered_map<RawAddress, DeviceMetrics*> opened_devices_;
  ClockTimePoint beginning_timepoint_;
  metrics::ClockTimePoint beginning_timepoint_;
  std::vector<int64_t> streaming_offset_nanos_;
  std::vector<int64_t> streaming_duration_nanos_;
  std::vector<int32_t> streaming_context_type_;
@@ -283,6 +280,18 @@ void MetricsCollector::OnStreamEnded(int32_t group_id) {
  }
}

void MetricsCollector::OnBroadcastStateChanged(bool started) {
  if (started) {
    broadcast_beginning_timepoint_ = std::chrono::high_resolution_clock::now();
  } else {
    auto broadcast_ending_timepoint_ =
        std::chrono::high_resolution_clock::now();
    bluetooth::common::LogLeAudioBroadcastSessionReported(get_timedelta_nanos(
        broadcast_beginning_timepoint_, broadcast_ending_timepoint_));
    broadcast_beginning_timepoint_ = kInvalidTimePoint;
  }
}

void MetricsCollector::Flush() {
  LOG(INFO) << __func__;
  for (auto& p : opened_groups_) {
+15 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <hardware/bt_le_audio.h>

#include <chrono>
#include <cstdint>
#include <memory>
#include <unordered_map>
@@ -27,6 +28,11 @@

namespace le_audio {

namespace metrics {
using ClockTimePoint =
    std::chrono::time_point<std::chrono::high_resolution_clock>;
}

enum ConnectionStatus : int32_t {
  UNKNOWN = 0,
  SUCCESS = 1,
@@ -116,6 +122,13 @@ class MetricsCollector {
   */
  void OnStreamEnded(int32_t group_id);

  /**
   * When there is a change in Bluetooth LE Audio broadcast state
   *
   * @param started if broadcast streaming is started.
   */
  void OnBroadcastStateChanged(bool started);

  /**
   * Flush all log to statsd
   *
@@ -131,6 +144,8 @@ class MetricsCollector {

  std::unordered_map<int32_t, std::unique_ptr<GroupMetrics>> opened_groups_;
  std::unordered_map<int32_t, int32_t> group_size_table_;

  metrics::ClockTimePoint broadcast_beginning_timepoint_;
};

}  // namespace le_audio
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ void MetricsCollector::OnStreamStarted(

void MetricsCollector::OnStreamEnded(int32_t group_id) {}

void MetricsCollector::OnBroadcastStateChanged(bool started) {}

void MetricsCollector::Flush() {}

}  // namespace le_audio
Loading