Loading system/audio_hal_interface/aidl/hfp_client_interface_aidl.cc +21 −1 Original line number Original line Diff line number Diff line Loading @@ -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) {} Loading system/audio_hal_interface/hfp_client_interface.cc +18 −0 Original line number Original line Diff line number Diff line Loading @@ -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); } } Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading system/bta/ag/bta_ag_int.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -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 <> Loading system/bta/ag/bta_ag_sco.cc +8 −0 Original line number Original line Diff line number Diff line Loading @@ -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) && Loading Loading @@ -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() { Loading Loading
system/audio_hal_interface/aidl/hfp_client_interface_aidl.cc +21 −1 Original line number Original line Diff line number Diff line Loading @@ -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) {} Loading
system/audio_hal_interface/hfp_client_interface.cc +18 −0 Original line number Original line Diff line number Diff line Loading @@ -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); } } Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading
system/bta/ag/bta_ag_int.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -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 <> Loading
system/bta/ag/bta_ag_sco.cc +8 −0 Original line number Original line Diff line number Diff line Loading @@ -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) && Loading Loading @@ -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() { Loading