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
68 lines
2.6 KiB
Diff
68 lines
2.6 KiB
Diff
From 739ca09cc36553703d2b24ba99b64f8641fcf987 Mon Sep 17 00:00:00 2001
|
|
From: Dylan Van Assche <me@dylanvanassche.be>
|
|
Date: Thu, 14 Apr 2022 20:16:24 +0200
|
|
Subject: [PATCH 12/26] bluetooth: support AT+CNUM
|
|
|
|
AT+CNUM returns the phone number of the subscriber.
|
|
Supports this AT command when ModemManager is available.
|
|
---
|
|
src/modules/bluetooth/backend-native.c | 25 +++++++++++++++++++++++++
|
|
src/modules/bluetooth/bluez5-util.h | 6 ++++++
|
|
2 files changed, 31 insertions(+)
|
|
|
|
diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
|
|
index c0c14acf3..19ca497d5 100644
|
|
--- a/src/modules/bluetooth/backend-native.c
|
|
+++ b/src/modules/bluetooth/backend-native.c
|
|
@@ -724,6 +724,31 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf
|
|
default:
|
|
pa_assert_not_reached();
|
|
}
|
|
+ } else if (strstr(buf, "AT+CNUM")) {
|
|
+ char *number;
|
|
+ unsigned int type;
|
|
+
|
|
+ /* Return error if ModemManager is unavailable */
|
|
+ if (!discovery->native_backend->modemmanager || !pa_modemmanager_has_modem(discovery->native_backend->modemmanager)) {
|
|
+ pa_log_debug("ModemManager backend unavailable, cannot answer AT+CNUM");
|
|
+ rfcomm_write_error(discovery->native_backend, fd, CMEE_NO_CONNECTION_TO_PHONE);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ number = pa_modemmanager_get_own_number(discovery->native_backend->modemmanager);
|
|
+ if (!number) {
|
|
+ rfcomm_write_error(discovery->native_backend, fd, CMEE_AG_FAILURE);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ /* International numbers start with '+' */
|
|
+ if (strncmp("+", number, 1) == 0)
|
|
+ type = CLIP_INTERNATIONAL_NUMBER;
|
|
+ else
|
|
+ type = CLIP_NATIONAL_NUMBER;
|
|
+
|
|
+ rfcomm_write_response(fd, "+CNUM: ,\"%s\",%d,,4", number, type);
|
|
+ return true;
|
|
}
|
|
|
|
/* first-time initialize selected codec to CVSD */
|
|
diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
|
|
index 9ac9880a8..638a793b7 100644
|
|
--- a/src/modules/bluetooth/bluez5-util.h
|
|
+++ b/src/modules/bluetooth/bluez5-util.h
|
|
@@ -227,6 +227,12 @@ typedef enum pa_bluetooth_cops {
|
|
COPS_UNKNOWN_FORMAT = 2
|
|
} pa_bluetooth_cops_t;
|
|
|
|
+/* CLIP number formats, described in Bluetooth HFP 1.8 spec */
|
|
+typedef enum pa_bluetooth_clip {
|
|
+ CLIP_INTERNATIONAL_NUMBER = 145,
|
|
+ CLIP_NATIONAL_NUMBER = 129
|
|
+} pa_bluetooth_clip_t;
|
|
+
|
|
#ifdef HAVE_BLUEZ_5_OFONO_HEADSET
|
|
pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y);
|
|
void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *b);
|
|
--
|
|
2.35.1
|
|
|