On 21.09.2017 19:08, James Bottomley wrote:
On Thu, 2017-09-21 at 19:15 +0300, Tanu Kaskinen wrote:
On Thu, 2017-09-21 at 17:47 +0200, Georg Chini wrote:
On 21.09.2017 16:47, James Bottomley wrote:
On Thu, 2017-09-21 at 17:28 +0300, Tanu Kaskinen wrote:
I think we should use the native backend for the HFP AG role by
default. If the native HFP AG implementation causes a conflict
with ofono in its default configuration (which seems likely to
be the case), then "headset=auto" should not enable the native
HFP AG implementation, which then means that we should use
"headset=native" by default.

Using "headset=native" by default means that we lose HFP HF
support in the default configuration, but I don't think that's
a big loss.
Setting the default to native works for me: it's basically what
all distros get today anyway because they don't install ofono by
default.   That probably means we don't need the elaborate
switching for HSP_AG either, but it would become harmless, so
could be removed later.

If we want to support the "HFP AG support through PA, HFP HF
support through ofono" case, then some new configuration option
is needed, and I think it would be clearest if that would be a
separate patch after this series.
This is not true, the patch supplies an option to enable/disable
the HFP implementation. Simple usage of that switch would
provide all the required functionality.
Yeah, sorry, I wasn't aware of that option, as I hadn't read the
patch. You two just seemed to be choosing between enabling or
disabling the native HFP AG implementation by default, and I just
wanted to say that I want it to be enabled by default, but without
breaking "headset=auto".

The default for the option would just be disabled in "auto" mode
and enabled in "native" mode.
The option seems to be named "enable_profile_hfp_hf", which suggests
that disabling it will disable the ofono implementation of HFP AG as
well, and that's not what we want. Maybe rename the option to
"enable_native_hfp_hf"?
I updated the current patch to rename the option and condition it on
the backend setting (see below.  Patch would need integrating into the
series, since the option rename needs to go back into patch 2 but it
gives you the idea)

There is not a big code change needed, only a check
if the headset mode is "auto" or "native" and changing the
default accordingly.
The above is the essence of what I proposed to solve the
issue with headset=auto and I really don't understand why
this is causing such discussions. Leaving it as is definitely
breaks "headset=auto".
Ok, sounds fine, with the added note that we should set
"headset=native" by default.
OK, something like this

James

---

diff --git a/src/modules/bluetooth/backend-native.c 
b/src/modules/bluetooth/backend-native.c
index 16b2aa6c..c3a79d75 100644
--- a/src/modules/bluetooth/backend-native.c
+++ b/src/modules/bluetooth/backend-native.c
@@ -822,7 +822,7 @@ pa_bluetooth_backend 
*pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_d
      if (enable_hs_role)
         profile_init(backend, PA_BLUETOOTH_PROFILE_HFP_AG);
      profile_init(backend, PA_BLUETOOTH_PROFILE_HSP_HS);
-    if (pa_bluetooth_discovery_get_enable_profile_hfp_hf(y))
+    if (pa_bluetooth_discovery_get_enable_native_hfp_hf(y))
          profile_init(backend, PA_BLUETOOTH_PROFILE_HFP_HF);
return backend;
diff --git a/src/modules/bluetooth/bluez5-util.c 
b/src/modules/bluetooth/bluez5-util.c
index 6c77113e..8be8a11d 100644
--- a/src/modules/bluetooth/bluez5-util.c
+++ b/src/modules/bluetooth/bluez5-util.c
@@ -92,7 +92,7 @@ struct pa_bluetooth_discovery {
      int headset_backend;
      pa_bluetooth_backend *ofono_backend, *native_backend;
      PA_LLIST_HEAD(pa_dbus_pending, pending);
-    bool enable_profile_hfp_hf;
+    bool enable_native_hfp_hf;
  };
static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_discovery *y, DBusMessage *m,
@@ -173,11 +173,11 @@ static const char 
*transport_state_to_string(pa_bluetooth_transport_state_t stat
  }
static bool device_supports_profile(pa_bluetooth_device *device, pa_bluetooth_profile_t profile) {
-    bool show_hfp, show_hsp, enable_profile_hfp_hf;
+    bool show_hfp, show_hsp, enable_native_hfp_hf;
- enable_profile_hfp_hf = pa_bluetooth_discovery_get_enable_profile_hfp_hf(device->discovery);
+    enable_native_hfp_hf = 
pa_bluetooth_discovery_get_enable_native_hfp_hf(device->discovery);
- if (enable_profile_hfp_hf) {
+    if (enable_native_hfp_hf) {
          show_hfp = pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF);
          show_hsp = !show_hfp;
      } else {
@@ -553,12 +553,12 @@ pa_bluetooth_device* 
pa_bluetooth_discovery_get_device_by_path(pa_bluetooth_disc
      return NULL;
  }
-bool pa_bluetooth_discovery_get_enable_profile_hfp_hf(pa_bluetooth_discovery *y)
+bool pa_bluetooth_discovery_get_enable_native_hfp_hf(pa_bluetooth_discovery *y)
  {
      pa_assert(y);
      pa_assert(PA_REFCNT_VALUE(y) > 0);
- return y->enable_profile_hfp_hf;
+    return y->enable_native_hfp_hf;
  }
pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_address(pa_bluetooth_discovery *y, const char *remote, const char *local) {
@@ -1754,7 +1754,7 @@ static void endpoint_done(pa_bluetooth_discovery *y, 
pa_bluetooth_profile_t prof
      }
  }
-pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int headset_backend, bool enable_profile_hfp_hf) {
+pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int 
headset_backend, bool enable_native_hfp_hf) {
      pa_bluetooth_discovery *y;
      DBusError err;
      DBusConnection *conn;
@@ -1764,7 +1764,7 @@ pa_bluetooth_discovery* 
pa_bluetooth_discovery_get(pa_core *c, int headset_backe
      PA_REFCNT_INIT(y);
      y->core = c;
      y->headset_backend = headset_backend;
-    y->enable_profile_hfp_hf = enable_profile_hfp_hf;
+    y->enable_native_hfp_hf = enable_native_hfp_hf;
      y->adapters = pa_hashmap_new_full(pa_idxset_string_hash_func, 
pa_idxset_string_compare_func, NULL,
                                        (pa_free_cb_t) adapter_free);
      y->devices = pa_hashmap_new_full(pa_idxset_string_hash_func, 
pa_idxset_string_compare_func, NULL,
diff --git a/src/modules/bluetooth/bluez5-util.h 
b/src/modules/bluetooth/bluez5-util.h
index 78c4f2fa..23f9a798 100644
--- a/src/modules/bluetooth/bluez5-util.h
+++ b/src/modules/bluetooth/bluez5-util.h
@@ -166,5 +166,5 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core 
*core, int headset_ba
  pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y);
  void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y);
  void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool 
is_running);
-bool pa_bluetooth_discovery_get_enable_profile_hfp_hf(pa_bluetooth_discovery 
*y);
+bool pa_bluetooth_discovery_get_enable_native_hfp_hf(pa_bluetooth_discovery 
*y);
  #endif
diff --git a/src/modules/bluetooth/module-bluez5-device.c 
b/src/modules/bluetooth/module-bluez5-device.c
index 3d362f4b..d37ce9ce 100644
--- a/src/modules/bluetooth/module-bluez5-device.c
+++ b/src/modules/bluetooth/module-bluez5-device.c
@@ -2010,7 +2010,7 @@ static int add_card(struct userdata *u) {
      pa_bluetooth_profile_t *p;
      const char *uuid;
      void *state;
-    bool enable_profile_hfp_hf, has_both;
+    bool enable_native_hfp_hf, has_both;
pa_assert(u);
      pa_assert(u->device);
@@ -2041,13 +2041,13 @@ static int add_card(struct userdata *u) {
create_card_ports(u, data.ports); - enable_profile_hfp_hf = pa_bluetooth_discovery_get_enable_profile_hfp_hf(u->discovery);
+    enable_native_hfp_hf = 
pa_bluetooth_discovery_get_enable_native_hfp_hf(u->discovery);
- has_both = enable_profile_hfp_hf && pa_hashmap_get(d->uuids, PA_BLUETOOTH_UUID_HFP_HF) && pa_hashmap_get(d->uuids, PA_BLUETOOTH_UUID_HSP_HS);
+    has_both = enable_native_hfp_hf && pa_hashmap_get(d->uuids, PA_BLUETOOTH_UUID_HFP_HF) 
&& pa_hashmap_get(d->uuids, PA_BLUETOOTH_UUID_HSP_HS);
      PA_HASHMAP_FOREACH(uuid, d->uuids, state) {
          pa_bluetooth_profile_t profile;
- if (!enable_profile_hfp_hf && pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF)) {
+        if (!enable_native_hfp_hf && pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF)) 
{
              pa_log_info("device supports HFP but disabling profile as 
requested");
              continue;
          }
diff --git a/src/modules/bluetooth/module-bluez5-discover.c 
b/src/modules/bluetooth/module-bluez5-discover.c
index 52d848f0..b6e2803e 100644
--- a/src/modules/bluetooth/module-bluez5-discover.c
+++ b/src/modules/bluetooth/module-bluez5-discover.c
@@ -93,7 +93,7 @@ static pa_hook_result_t 
device_connection_changed_cb(pa_bluetooth_discovery *y,
  }
#ifdef HAVE_BLUEZ_5_NATIVE_HEADSET
-const char *default_headset_backend = "auto";
+const char *default_headset_backend = "native";
  #else
  const char *default_headset_backend = "ofono";
  #endif
@@ -104,7 +104,7 @@ int pa__init(pa_module *m) {
      const char *headset_str;
      int headset_backend;
      bool autodetect_mtu;
-    bool enable_profile_hfp_hf = true;
+    bool enable_native_hfp_hf;
pa_assert(m); @@ -125,12 +125,14 @@ int pa__init(pa_module *m) {
          goto fail;
      }
+ enable_native_hfp_hf = (headset_backend == HEADSET_BACKEND_NATIVE);
+
      autodetect_mtu = false;
      if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 
0) {
          pa_log("Invalid boolean value for autodetect_mtu parameter");
      }
-    if (pa_modargs_get_value_boolean(ma, "enable_profile_hfp_hf", 
&enable_profile_hfp_hf) < 0) {
-        pa_log("enable_profile_hfp_hf must be true or false");
+    if (pa_modargs_get_value_boolean(ma, "enable_native_hfp_hf", 
&enable_native_hfp_hf) < 0) {
+        pa_log("enable_native_hfp_hf must be true or false");
          goto fail;
      }
@@ -140,7 +142,7 @@ int pa__init(pa_module *m) {
      u->autodetect_mtu = autodetect_mtu;
      u->loaded_device_paths = pa_hashmap_new(pa_idxset_string_hash_func, 
pa_idxset_string_compare_func);
- if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend, enable_profile_hfp_hf)))
+    if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend, 
enable_native_hfp_hf)))
          goto fail;
u->device_connection_changed_slot =
_______________________________________________
Yes, that looks OK to me. BTW, I did not yet look deeper into the code
but I noticed that you are calling profile_done() unconditionally. This will
break if the profile was never initialized.

_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to