|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
index 9ec9244b..99efa066 100644
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
--- a/src/modules/bluetooth/backend-native.c
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+++ b/src/modules/bluetooth/backend-native.c
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -53,6 +53,43 @@ struct transport_data {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pa_mainloop_api *mainloop;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
};
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+struct hfp_config {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ uint32_t capabilities;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ int state;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+};
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+/*
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ * the separate hansfree headset (HF) and Audio Gateway (AG) features
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+enum hfp_hf_features {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_EC_NR = 0,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_CALL_WAITING = 1,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_CLI = 2,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_VR = 3,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_RVOL = 4,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_ESTATUS = 5,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_ECALL = 6,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_HF_CODECS = 7,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+};
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+enum hfp_ag_features {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_THREE_WAY = 0,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_EC_NR = 1,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_VR = 2,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_RING = 3,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_NUM_TAG = 4,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_REJECT = 5,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_ESTATUS = 6,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_ECALL = 7,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_EERR = 8,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ HFP_AG_CODECS = 9,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+};
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+/* gateway features we support, which is as little as we can get away with */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+static uint32_t hfp_features =
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ /* HFP 1.6 requires this */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ (1 << HFP_AG_ESTATUS );
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
#define BLUEZ_SERVICE "org.bluez"
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
#define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1"
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -109,6 +146,27 @@ static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_backend *backend, D
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
return p;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+static void rfcomm_write(int fd, const char *str)
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+{
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ size_t len;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ char buf[512];
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ pa_log_debug("RFCOMM >> %s", str);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ sprintf(buf, "\r\n%s\r\n", str);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ len = write(fd, buf, strlen(buf));
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ if (len != strlen(buf))
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ pa_log_error("RFCOMM write error: %s", pa_cstrerror(errno));
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+static void hfp_send_features(int fd)
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+{
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ char buf[512];
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ sprintf(buf, "+BRSF: %d", hfp_features);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ rfcomm_write(fd, buf);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
static int sco_do_connect(pa_bluetooth_transport *t) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pa_bluetooth_device *d = t->device;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
struct sockaddr_sco addr;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -352,6 +410,61 @@ static void register_profile(pa_bluetooth_backend *b, const char *profile, const
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
send_and_add_to_pending(b, m, register_profile_reply, pa_xstrdup(profile));
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+static void transport_put(pa_bluetooth_transport *t)
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+{
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ pa_bluetooth_transport_put(t);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile));
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf)
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+{
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ struct hfp_config *c = t->config;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ int val;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ /* stateful negotiation */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ if (c->state == 0 && sscanf(buf, "AT+BRSF=%d", &val) == 1) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ c->capabilities = val;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ pa_log_info("HFP capabilities returns 0x%x", val);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ hfp_send_features(fd);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ c->state = 1;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ return true;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ } else if (c->state == 1 && pa_startswith(buf, "AT+CIND=?")) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ /* we declare minimal no indicators */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ rfcomm_write(fd, "+CIND: "
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ /* many indicators can be supported, only call and
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ * callheld are mandatory, so that's all we repy */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ "(\"call\",(0-1)),"
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ "(\"callheld\",(0-2))");
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ c->state = 2;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ return true;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ } else if (c->state == 2 && pa_startswith(buf, "AT+CIND?")) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ rfcomm_write(fd, "+CIND: 0,0");
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ c->state = 3;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ return true;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ } else if ((c->state == 2 || c->state == 3) && pa_startswith(buf, "AT+CMER=")) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ rfcomm_write(fd, "\r\nOK\r\n");
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ c->state = 4;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ transport_put(t);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ return false;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ /* if we get here, negotiation should be complete */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ if (c->state != 4) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ pa_log_error("HFP negotiation failed in state %d with inbound %s\n",
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ c->state, buf);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ rfcomm_write(fd, "ERROR");
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ return false;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ /*
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ * once we're fully connected, just reply OK to everything
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ * it will just be the headset sending the occasional status
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ * update, but we process only the ones we care about
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ return true;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pa_bluetooth_transport *t = userdata;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -398,6 +511,8 @@ static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_i
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
do_reply = true;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
} else if (sscanf(buf, "AT+CKPD=%d", &dummy) == 1) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
do_reply = true;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ } else if (t->config) { /* t->config is only non-null for hfp profile */
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ do_reply = hfp_rfcomm_handle(fd, t, buf);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
} else {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
do_reply = false;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -540,7 +655,9 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
sender = dbus_message_get_sender(m);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pathfd = pa_sprintf_malloc ("%s/fd%d", path, fd);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
- t = pa_bluetooth_transport_new(d, sender, pathfd, p, NULL, 0);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ t = pa_bluetooth_transport_new(d, sender, pathfd, p, NULL,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ p == PA_BLUETOOTH_PROFILE_HFP_HF ?
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ sizeof(struct hfp_config) : 0);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pa_xfree(pathfd);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
t->acquire = sco_acquire_cb;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -558,9 +675,8 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
sco_listen(t);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
- pa_bluetooth_transport_put(t);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
-
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
- pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile));
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ if (p != PA_BLUETOOTH_PROFILE_HFP_HF)
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ transport_put(t);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pa_assert_se(r = dbus_message_new_method_return(m));
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
index 80a025d5..8be8a11d 100644
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
--- a/src/modules/bluetooth/bluez5-util.c
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+++ b/src/modules/bluetooth/bluez5-util.c
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -150,7 +150,10 @@ pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
if (size > 0) {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
t->config = pa_xnew(uint8_t, size);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
- memcpy(t->config, config, size);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ if (config)
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ memcpy(t->config, config, size);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ else
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ memset(t->config, 0, size);
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
}
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
return t;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
index b077ca2c..23f9a798 100644
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
--- a/src/modules/bluetooth/bluez5-util.h
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+++ b/src/modules/bluetooth/bluez5-util.h
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
@@ -73,7 +73,7 @@ struct pa_bluetooth_transport {
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
pa_bluetooth_profile_t profile;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
uint8_t codec;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
- uint8_t *config;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
+ void *config;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
size_t config_size;
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
|
|
![](https://seccdn.libravatar.org/avatar/082b19ca4e231b0f1c8cc127e76ebbc2c8d4915ed5e40f8dad503c31c9b743c6?s=16&d=retro) |
51d25e2 |
uint16_t microphone_gain;
|