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

Commit 62be6aac authored by Yuyang Huang's avatar Yuyang Huang Committed by Gerrit Code Review
Browse files

Merge "Add support for SuspendStream" into main

parents c62fb0bd e010dcab
Loading
Loading
Loading
Loading
+21 −1
Original line number Original line 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) {}
void HfpTransport::LogBytesProcessed(size_t bytes_read) {}


BluetoothAudioCtrlAck HfpTransport::SuspendRequest() {
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) {}
void HfpTransport::SetLatencyMode(LatencyMode latency_mode) {}
+18 −0
Original line number Original line Diff line number Diff line
@@ -221,6 +221,12 @@ void HfpClientInterface::Decode::CancelStreamingRequest() {
    case aidl::hfp::HFP_CTRL_CMD_NONE:
    case aidl::hfp::HFP_CTRL_CMD_NONE:
      log::warn("no pending start stream request");
      log::warn("no pending start stream request");
      return;
      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:
    default:
      log::warn("Invalid state, {}", pending_cmd);
      log::warn("Invalid state, {}", pending_cmd);
  }
  }
@@ -367,6 +373,12 @@ void HfpClientInterface::Encode::CancelStreamingRequest() {
    case aidl::hfp::HFP_CTRL_CMD_NONE:
    case aidl::hfp::HFP_CTRL_CMD_NONE:
      log::warn("no pending start stream request");
      log::warn("no pending start stream request");
      return;
      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:
    default:
      log::warn("Invalid state, {}", pending_cmd);
      log::warn("Invalid state, {}", pending_cmd);
  }
  }
@@ -505,6 +517,12 @@ void HfpClientInterface::Offload::CancelStreamingRequest() {
    case aidl::hfp::HFP_CTRL_CMD_NONE:
    case aidl::hfp::HFP_CTRL_CMD_NONE:
      log::warn("no pending start stream request");
      log::warn("no pending start stream request");
      return;
      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:
    default:
      log::warn("Invalid state, {}", pending_cmd);
      log::warn("Invalid state, {}", pending_cmd);
  }
  }
+4 −0
Original line number Original line 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
 * @return true if SCO managed by Audio is enabled, false otherwise
 */
 */
bool bta_ag_is_sco_managed_by_audio();
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 {
namespace fmt {
template <>
template <>
+8 −0
Original line number Original line 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_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. */
    /* if av got suspended by this call, let it resume. */
    /* In case call stays alive regardless of sco, av should not be affected. */
    /* In case call stays alive regardless of sco, av should not be affected. */
    if (((p_scb->call_ind == BTA_AG_CALL_INACTIVE) &&
    if (((p_scb->call_ind == BTA_AG_CALL_INACTIVE) &&
@@ -1604,6 +1606,12 @@ bool bta_ag_is_sco_managed_by_audio() {
  return value;
  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; }
const RawAddress& bta_ag_get_active_device() { return active_device_addr; }


void bta_clear_active_device() {
void bta_clear_active_device() {