f9c7ffa9b6
PulseAudio is used for handling all audio on postmarketOS. This also involves Bluetooth audio such as A2DP, HSP and HFP audio. In the case of HFP/HSP, the HF and AG can interact with each other through AT commands defined in the Bluetooth HFP 1.8 spec. This set of patches implements HFP support to allow Bluetooth devices to accept/reject/hangup calls, dial numbers, DTMF tone generation, query signal strength, roaming status, service status, AG battery level, call status, etc. More details in the upstream MR: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/693 Available in edge for testing this merge request with a broader user base. Not intended for backporting to stable branches. [ci:skip-build]: already built successfully in CI
72 lines
3.4 KiB
Diff
72 lines
3.4 KiB
Diff
From 12610afa56b74e7db44086d81709faedda2b83e9 Mon Sep 17 00:00:00 2001
|
|
From: Dylan Van Assche <me@dylanvanassche.be>
|
|
Date: Sat, 16 Apr 2022 19:53:38 +0200
|
|
Subject: [PATCH 24/26] bluetooth: support AT+CHUP
|
|
|
|
Hangup or reject a call when the HF sends 'AT+CHUP'.
|
|
If the call is on going, it is ended. If the call is ringing and
|
|
incoming, it is rejected. The same interface in ModemManager is used for
|
|
this functionality. This AT command is only available if ModemManager is
|
|
present.
|
|
---
|
|
src/modules/bluetooth/backend-native.c | 37 ++++++++++++++++++++++++--
|
|
1 file changed, 35 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
|
|
index 6f6241479..d502cff78 100644
|
|
--- a/src/modules/bluetooth/backend-native.c
|
|
+++ b/src/modules/bluetooth/backend-native.c
|
|
@@ -144,7 +144,7 @@ typedef enum pa_bluetooth_ag_to_hf_indicators {
|
|
/* gateway features we support, which is as little as we can get away with */
|
|
static uint32_t hfp_features =
|
|
/* HFP 1.6 requires this */
|
|
- (1 << HFP_AG_ESTATUS ) | (1 << HFP_AG_CODECS) | (1 << HFP_AG_INDICATORS) | (1 << HFP_AG_EERR);
|
|
+ (1 << HFP_AG_ESTATUS ) | (1 << HFP_AG_CODECS) | (1 << HFP_AG_INDICATORS) | (1 << HFP_AG_EERR) | (1 << HFP_AG_REJECT);
|
|
|
|
#define HSP_AG_PROFILE "/Profile/HSPAGProfile"
|
|
#define HFP_AG_PROFILE "/Profile/HFPAGProfile"
|
|
@@ -904,7 +904,40 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf
|
|
|
|
/* AT response will be reported through PA_BLUETOOTH_HOST_OPERATION_{SUCCEED, FAILED} hook */
|
|
return false;
|
|
- }
|
|
+ } else if (strstr(buf, "AT+CHUP")) {
|
|
+ pa_hashmap *calls;
|
|
+ char *call_key = NULL;
|
|
+ call_status_t *call = NULL;
|
|
+
|
|
+ /* AT+CHUP is only possible if ModemManager is availble */
|
|
+ if (!discovery->native_backend->modemmanager || !pa_modemmanager_has_modem(discovery->native_backend->modemmanager)) {
|
|
+ pa_log_debug("ModemManager backend unavailable, cannot reject call with AT+CHUP");
|
|
+ rfcomm_write_error(discovery->native_backend, fd, CMEE_NO_CONNECTION_TO_PHONE);
|
|
+ return false;
|
|
+ } else if (!pa_modemmanager_has_service(discovery->native_backend->modemmanager)) {
|
|
+ pa_log_debug("No network service, cannot reject call with ATD+CHUP");
|
|
+ rfcomm_write_error(discovery->native_backend, fd, CMEE_NO_NETWORK_SERVICE);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ /* Hangup/reject call is available */
|
|
+ calls = pa_modemmanager_get_calls(discovery->native_backend->modemmanager);
|
|
+ call_key = pa_modemmanager_get_active_call_key(discovery->native_backend->modemmanager);
|
|
+ if (call_key)
|
|
+ call = pa_hashmap_get(calls, call_key);
|
|
+
|
|
+ if (call && (call->status == PA_MODEMMANAGER_CALL_STATE_ACTIVE
|
|
+ || call->status == PA_MODEMMANAGER_CALL_STATE_RINGING
|
|
+ || call->status == PA_MODEMMANAGER_CALL_STATE_DIALING))
|
|
+ pa_modemmanager_end_call(discovery->native_backend->modemmanager, call_key);
|
|
+ else {
|
|
+ pa_log_warn("Cannot end call, call must be active, ringing or dialing");
|
|
+ rfcomm_write_error(discovery->native_backend, fd, CMEE_OPERATION_NOT_ALLOWED);
|
|
+ }
|
|
+
|
|
+ /* AT response will be reported through PA_BLUETOOTH_HOST_OPERATION_{SUCCEED, FAILED} hook */
|
|
+ return false;
|
|
+ }
|
|
|
|
/*
|
|
* Out-of-spec Bluetooth HFP 1.8 AT commands.
|
|
--
|
|
2.35.1
|
|
|