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

Commit 697011ac authored by Grzegorz Kołodziejczyk's avatar Grzegorz Kołodziejczyk
Browse files

le_audio: Add safe binds for LE Audio HAL clients

This replaces unsafe calls of base::Unretain with weak pointer.
This solution guarantees to terminate safely if the lifetime
expectations are violated.

Tag: #feature
Bug: 299238288
Test: atest bluetooth_le_audio_test
Change-Id: Ifeb1c252c8c0de4c942cb96ecf3ac456281327a3
parent 373e5fbd
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -101,11 +101,14 @@ class LeAudioSinkAudioHalClient {
 public:
  class Callbacks {
   public:
    Callbacks() = default;
    virtual ~Callbacks() = default;
    virtual void OnAudioSuspend(void) = 0;
    virtual void OnAudioResume(void) = 0;
    virtual void OnAudioMetadataUpdate(
        std::vector<struct record_track_metadata> sink_metadata) = 0;

    base::WeakPtrFactory<Callbacks> weak_factory_{this};
  };

  virtual ~LeAudioSinkAudioHalClient() = default;
@@ -137,12 +140,15 @@ class LeAudioSourceAudioHalClient {
 public:
  class Callbacks {
   public:
    Callbacks() = default;
    virtual ~Callbacks() = default;
    virtual void OnAudioDataReady(const std::vector<uint8_t>& data) = 0;
    virtual void OnAudioSuspend(void) = 0;
    virtual void OnAudioResume(void) = 0;
    virtual void OnAudioMetadataUpdate(
        std::vector<struct playback_track_metadata> source_metadata) = 0;

    base::WeakPtrFactory<Callbacks> weak_factory_{this};
  };

  virtual ~LeAudioSourceAudioHalClient() = default;
+3 −3
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ bool SinkImpl::OnResumeReq(bool start_media_task) {
  bt_status_t status = do_in_main_thread(
      FROM_HERE,
      base::BindOnce(&LeAudioSinkAudioHalClient::Callbacks::OnAudioResume,
                     base::Unretained(audioSinkCallbacks_)));
                     audioSinkCallbacks_->weak_factory_.GetWeakPtr()));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
@@ -146,7 +146,7 @@ bool SinkImpl::OnSuspendReq() {
  bt_status_t status = do_in_main_thread(
      FROM_HERE,
      base::BindOnce(&LeAudioSinkAudioHalClient::Callbacks::OnAudioSuspend,
                     base::Unretained(audioSinkCallbacks_)));
                     audioSinkCallbacks_->weak_factory_.GetWeakPtr()));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
@@ -170,7 +170,7 @@ bool SinkImpl::OnMetadataUpdateReq(const sink_metadata_t& sink_metadata) {
      FROM_HERE,
      base::BindOnce(
          &LeAudioSinkAudioHalClient::Callbacks::OnAudioMetadataUpdate,
          base::Unretained(audioSinkCallbacks_), metadata));
          audioSinkCallbacks_->weak_factory_.GetWeakPtr(), metadata));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
+3 −3
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ bool SourceImpl::OnResumeReq(bool start_media_task) {
  bt_status_t status = do_in_main_thread(
      FROM_HERE,
      base::BindOnce(&LeAudioSourceAudioHalClient::Callbacks::OnAudioResume,
                     base::Unretained(audioSourceCallbacks_)));
                     audioSourceCallbacks_->weak_factory_.GetWeakPtr()));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
@@ -255,7 +255,7 @@ bool SourceImpl::OnSuspendReq() {
  bt_status_t status = do_in_main_thread(
      FROM_HERE,
      base::BindOnce(&LeAudioSourceAudioHalClient::Callbacks::OnAudioSuspend,
                     base::Unretained(audioSourceCallbacks_)));
                     audioSourceCallbacks_->weak_factory_.GetWeakPtr()));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
@@ -280,7 +280,7 @@ bool SourceImpl::OnMetadataUpdateReq(const source_metadata_t& source_metadata) {
      FROM_HERE,
      base::BindOnce(
          &LeAudioSourceAudioHalClient::Callbacks::OnAudioMetadataUpdate,
          base::Unretained(audioSourceCallbacks_), metadata));
          audioSourceCallbacks_->weak_factory_.GetWeakPtr(), metadata));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }