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

Commit 20e6684a authored by Grzegorz Kołodziejczyk's avatar Grzegorz Kołodziejczyk
Browse files

le_audio: Unify local audio source notification usage

Notify local audio source has common usage as local audio sink, let them
both have the same helper method for better readability.

Bug: 360051130
Test: atest bluetooth_le_audio_client_test
Flag: EXEMPT; simple fix
Change-Id: I4c4f2e4d746ab185c2d7a8e1c3043c8ef9bb1224
parent 8234b73e
Loading
Loading
Loading
Loading
+26 −16
Original line number Diff line number Diff line
@@ -260,6 +260,7 @@ public:
        sink_monitor_mode_(false),
        sink_monitor_notified_status_(std::nullopt),
        source_monitor_mode_(false),
        source_monitor_notified_status_(std::nullopt),
        le_audio_source_hal_client_(nullptr),
        le_audio_sink_hal_client_(nullptr),
        close_vbc_timeout_(alarm_new("LeAudioCloseVbcTimeout")),
@@ -1006,8 +1007,7 @@ public:
     * when there would be request to stream unicast.
     */
    if (!sink_monitor_mode_ && source_monitor_mode_ && !group_is_streaming) {
      callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource,
                                             UnicastMonitorModeStatus::STREAMING_REQUESTED);
      notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_REQUESTED);
    }

    bool result = groupStateMachine_->StartStream(group, configuration_context_type,
@@ -1248,18 +1248,15 @@ public:

      LeAudioDeviceGroup* group = aseGroups_.FindById(active_group_id_);
      if (!group) {
        callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource,
                                               UnicastMonitorModeStatus::STREAMING_SUSPENDED);
        notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED);

        return;
      }

      if (group->IsStreaming()) {
        callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource,
                                               UnicastMonitorModeStatus::STREAMING);
        notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING);
      } else {
        callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource,
                                               UnicastMonitorModeStatus::STREAMING_SUSPENDED);
        notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED);
      }
    } else {
      log::error("invalid direction: 0x{:02x} monitor mode set", direction);
@@ -1395,6 +1392,7 @@ public:
      return;
    }
    sink_monitor_notified_status_ = std::nullopt;
    source_monitor_notified_status_ = std::nullopt;
    log::info("Group id: {}", active_group_id_);

    StopSuspendTimeout();
@@ -1545,8 +1543,9 @@ public:
       */
    }

    /* Reset sink listener notified status */
    /* Reset sink and source listener notified status */
    sink_monitor_notified_status_ = std::nullopt;
    source_monitor_notified_status_ = std::nullopt;
    if (com::android::bluetooth::flags::leaudio_codec_config_callback_order_fix()) {
      SendAudioGroupSelectableCodecConfigChanged(group);
      SendAudioGroupCurrentCodecConfigChanged(group);
@@ -4003,6 +4002,10 @@ public:
             << static_cast<int>(sink_monitor_notified_status_.value()) << "\n";
    }
    stream << "  Source monitor mode: " << (source_monitor_mode_ ? "true" : "false") << "\n";
    if (source_monitor_notified_status_) {
      dprintf(fd, "  Local source notified state: %d\n",
              static_cast<int>(source_monitor_notified_status_.value()));
    }

    auto codec_loc = CodecManager::GetInstance()->GetCodecLocation();
    if (codec_loc == bluetooth::le_audio::types::CodecLocation::HOST) {
@@ -4114,9 +4117,7 @@ public:

      if (com::android::bluetooth::flags::leaudio_no_context_validate_streaming_request() &&
          source_monitor_mode_) {
        callbacks_->OnUnicastMonitorModeStatus(
                bluetooth::le_audio::types::kLeAudioDirectionSource,
                UnicastMonitorModeStatus::STREAMING_REQUESTED_NO_CONTEXT_VALIDATE);
        notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_REQUESTED_NO_CONTEXT_VALIDATE);

        return false;
      }
@@ -4451,6 +4452,15 @@ public:
    }
  }

  void notifyAudioLocalSource(UnicastMonitorModeStatus status) {
    if (source_monitor_notified_status_ != status) {
      log::info("Source stream monitoring status changed to: {}", static_cast<int>(status));
      source_monitor_notified_status_ = status;
      callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource,
                                             status);
    }
  }

  void OnLocalAudioSinkResume() {
    log::info("active group_id: {} IN: audio_receiver_state_: {}, audio_sender_state_: {}",
              active_group_id_, ToString(audio_receiver_state_), ToString(audio_sender_state_));
@@ -5758,9 +5768,7 @@ public:
            }

            if (source_monitor_mode_) {
              callbacks_->OnUnicastMonitorModeStatus(
                      bluetooth::le_audio::types::kLeAudioDirectionSource,
                      UnicastMonitorModeStatus::STREAMING_SUSPENDED);
              notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED);
            }
          }
        }
@@ -5846,10 +5854,12 @@ private:
  bool in_voip_call_;
  /* Listen for streaming status on Sink stream */
  bool sink_monitor_mode_;
  /* Status which has been notified to Service */
  /* Sink stream status which has been notified to Service */
  std::optional<UnicastMonitorModeStatus> sink_monitor_notified_status_;
  /* Listen for streaming status on Source stream */
  bool source_monitor_mode_;
  /* Source stream status which has been notified to Service */
  std::optional<UnicastMonitorModeStatus> source_monitor_notified_status_;

  /* Reconnection mode */
  tBTM_BLE_CONN_TYPE reconnection_mode_;
+21 −0
Original line number Diff line number Diff line
@@ -12289,6 +12289,27 @@ TEST_F(UnicastTestHandoverMode, SetSourceMonitorModeWhileUnicastIsInactive) {
  Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_);
}
TEST_F(UnicastTestHandoverMode, SetTwiceSourceMonitorModeWhileUnicastIsInactive) {
  /* Enabling monitor mode for source while group is not active should result in
   * sending STREAMING_SUSPENDED notification.
   */
  EXPECT_CALL(mock_audio_hal_client_callbacks_,
              OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource,
                                         UnicastMonitorModeStatus::STREAMING_SUSPENDED))
          .Times(1);
  // Imitate activation of monitor mode
  do_in_main_thread(base::BindOnce(
          &LeAudioClient::SetUnicastMonitorMode, base::Unretained(LeAudioClient::Get()),
          bluetooth::le_audio::types::kLeAudioDirectionSource, true /* enable */));
  // Imitate second activation of monitor mode - should not be notified
  do_in_main_thread(base::BindOnce(
          &LeAudioClient::SetUnicastMonitorMode, base::Unretained(LeAudioClient::Get()),
          bluetooth::le_audio::types::kLeAudioDirectionSource, true /* enable */));
  SyncOnMainLoop();
  Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_);
}
TEST_F(UnicastTestHandoverMode, SetSourceMonitorModeWhileUnicastIsNotStreaming) {
  int group_id = 2;