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

Commit e010dcab authored by Yuyang Huang's avatar Yuyang Huang
Browse files

Add support for SuspendStream

Previously only StopStream is implemented

Bug: 343763558
Bug: 315234036
Flag: com::android::bluetooth::flags::is_sco_managed_by_audio
Test: atest net_test_bta
Change-Id: I726dd9b0aa3e8605fafdc20a0cb5671c420d887d
parent ab408fbe
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -130,7 +130,27 @@ uint8_t HfpTransport::GetPendingCmd() const { return hfp_pending_cmd_; }
void HfpTransport::LogBytesProcessed(size_t bytes_read) {}

BluetoothAudioCtrlAck HfpTransport::SuspendRequest() {
  return BluetoothAudioCtrlAck::FAILURE_UNSUPPORTED;
  log::info("handling");
  if (hfp_pending_cmd_ != HFP_CTRL_CMD_NONE) {
    log::warn("busy in pending_cmd={}", hfp_pending_cmd_);
    return BluetoothAudioCtrlAck::FAILURE_BUSY;
  }

  RawAddress addr = bta_ag_get_active_device();
  if (addr.IsEmpty()) {
    log::info("No active device found, mark SCO as suspended");
    return BluetoothAudioCtrlAck::SUCCESS_FINISHED;
  }

  hfp_pending_cmd_ = HFP_CTRL_CMD_SUSPEND;
  auto instance = bluetooth::headset::GetInterface();
  if (instance == nullptr) {
    log::error("headset instance is nullptr");
    return BluetoothAudioCtrlAck::FAILURE;
  }
  auto status = instance->DisconnectAudio(&addr);
  log::info("DisconnectAudio status = {} - {}", status, bt_status_text(status));
  return BluetoothAudioCtrlAck::SUCCESS_FINISHED;
}

void HfpTransport::SetLatencyMode(LatencyMode latency_mode) {}
+18 −0
Original line number Diff line number Diff line
@@ -221,6 +221,12 @@ void HfpClientInterface::Decode::CancelStreamingRequest() {
    case aidl::hfp::HFP_CTRL_CMD_NONE:
      log::warn("no pending start stream request");
      return;
    case aidl::hfp::HFP_CTRL_CMD_SUSPEND:
      log::info("suspends");
      aidl::hfp::HfpEncodingTransport::software_hal_interface->StreamSuspended(
          aidl::BluetoothAudioCtrlAck::SUCCESS_FINISHED);
      instance->ResetPendingCmd();
      return;
    default:
      log::warn("Invalid state, {}", pending_cmd);
  }
@@ -367,6 +373,12 @@ void HfpClientInterface::Encode::CancelStreamingRequest() {
    case aidl::hfp::HFP_CTRL_CMD_NONE:
      log::warn("no pending start stream request");
      return;
    case aidl::hfp::HFP_CTRL_CMD_SUSPEND:
      log::info("suspends");
      aidl::hfp::HfpEncodingTransport::software_hal_interface->StreamSuspended(
          aidl::BluetoothAudioCtrlAck::SUCCESS_FINISHED);
      instance->ResetPendingCmd();
      return;
    default:
      log::warn("Invalid state, {}", pending_cmd);
  }
@@ -505,6 +517,12 @@ void HfpClientInterface::Offload::CancelStreamingRequest() {
    case aidl::hfp::HFP_CTRL_CMD_NONE:
      log::warn("no pending start stream request");
      return;
    case aidl::hfp::HFP_CTRL_CMD_SUSPEND:
      log::info("suspends");
      aidl::hfp::HfpEncodingTransport::offloading_hal_interface
          ->StreamSuspended(aidl::BluetoothAudioCtrlAck::SUCCESS_FINISHED);
      instance->ResetPendingCmd();
      return;
    default:
      log::warn("Invalid state, {}", pending_cmd);
  }
+4 −0
Original line number Diff line number Diff line
@@ -483,6 +483,10 @@ void bta_ag_send_qcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
 * @return true if SCO managed by Audio is enabled, false otherwise
 */
bool bta_ag_is_sco_managed_by_audio();
/**
 * Respond to Audio HAL's SuspendStream request when SCO is disconnected
 */
void bta_ag_stream_suspended();

namespace fmt {
template <>
+8 −0
Original line number Diff line number Diff line
@@ -1502,6 +1502,8 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& /* data */) {

    bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);

    bta_ag_stream_suspended();

    /* if av got suspended by this call, let it resume. */
    /* In case call stays alive regardless of sco, av should not be affected. */
    if (((p_scb->call_ind == BTA_AG_CALL_INACTIVE) &&
@@ -1604,6 +1606,12 @@ bool bta_ag_is_sco_managed_by_audio() {
  return value;
}

void bta_ag_stream_suspended() {
  if (bta_ag_is_sco_managed_by_audio() && hfp_offload_interface) {
    hfp_offload_interface->CancelStreamingRequest();
  }
}

const RawAddress& bta_ag_get_active_device() { return active_device_addr; }

void bta_clear_active_device() {