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

Commit 7ae5a1a3 authored by Grzegorz Kolodziejczyk's avatar Grzegorz Kolodziejczyk Committed by Gerrit Code Review
Browse files

Merge "le_audio: Introduce Source listening mode" into main

parents 55bb2ee5 fd07ea33
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -236,6 +236,7 @@ class LeAudioClientImpl : public LeAudioClient {
        in_voip_call_(false),
        sink_monitor_mode_(false),
        sink_monitor_notified_status_(std::nullopt),
        source_monitor_mode_(false),
        current_source_codec_config({0, 0, 0, 0}),
        current_sink_codec_config({0, 0, 0, 0}),
        le_audio_source_hal_client_(nullptr),
@@ -916,6 +917,16 @@ class LeAudioClientImpl : public LeAudioClient {
          bluetooth::common::time_get_os_boottime_us();
    }

    /* If assistant have some connected delegators that needs to be informed
     * when there would be request to stream unicast.
     */
    if (IS_FLAG_ENABLED(leaudio_broadcast_audio_handover_policies) &&
        !sink_monitor_mode_ && source_monitor_mode_ && !group->IsStreaming()) {
      callbacks_->OnUnicastMonitorModeStatus(
          le_audio::types::kLeAudioDirectionSource,
          UnicastMonitorModeStatus::STREAMING_REQUESTED);
    }

    bool result = groupStateMachine_->StartStream(
        group, configuration_context_type, remote_contexts, ccids);

@@ -1051,6 +1062,32 @@ class LeAudioClientImpl : public LeAudioClient {

      LOG_DEBUG("enable: %d", enable);
      sink_monitor_mode_ = enable;
    } else if (direction == le_audio::types::kLeAudioDirectionSource) {
      LOG_DEBUG("enable: %d", enable);
      source_monitor_mode_ = enable;

      if (!enable) {
        return;
      }

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

        return;
      }

      if (group->IsStreaming()) {
        callbacks_->OnUnicastMonitorModeStatus(
            le_audio::types::kLeAudioDirectionSource,
            UnicastMonitorModeStatus::STREAMING);
      } else {
        callbacks_->OnUnicastMonitorModeStatus(
            le_audio::types::kLeAudioDirectionSource,
            UnicastMonitorModeStatus::STREAMING_SUSPENDED);
      }
    } else {
      LOG_ERROR("invalid direction: 0x%02x monitor mode set", direction);
    }
@@ -3767,6 +3804,8 @@ class LeAudioClientImpl : public LeAudioClient {
      dprintf(fd, "  Local sink notified state: %d\n",
              sink_monitor_notified_status_.value());
    }
    dprintf(fd, "  Source monitor mode: %s\n",
            source_monitor_mode_ ? "true" : "false");
    dprintf(fd, "  Start time: ");
    for (auto t : stream_start_history_queue_) {
      dprintf(fd, ", %d ms", static_cast<int>(t));
@@ -5524,6 +5563,12 @@ class LeAudioClientImpl : public LeAudioClient {
              notifyAudioLocalSink(
                  UnicastMonitorModeStatus::STREAMING_SUSPENDED);
            }

            if (source_monitor_mode_) {
              callbacks_->OnUnicastMonitorModeStatus(
                  le_audio::types::kLeAudioDirectionSource,
                  UnicastMonitorModeStatus::STREAMING_SUSPENDED);
            }
          }
        }

@@ -5602,6 +5647,8 @@ class LeAudioClientImpl : public LeAudioClient {
  bool sink_monitor_mode_;
  /* 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_;

  /* Reconnection mode */
  tBTM_BLE_CONN_TYPE reconnection_mode_;