On 03/04/2013 04:38 PM, Mikel Astiz wrote:
From: Mikel Astiz <[email protected]>

Use the information provided by the form factor to decide which name and
description should be used during port creation.
---
  src/modules/bluetooth/module-bluetooth-device.c | 82 +++++++++++++++++++++++--
  1 file changed, 76 insertions(+), 6 deletions(-)

diff --git a/src/modules/bluetooth/module-bluetooth-device.c 
b/src/modules/bluetooth/module-bluetooth-device.c
index 9dc0cb3..2741734 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -152,6 +152,9 @@ struct userdata {
      pa_bluetooth_discovery *discovery;
      bool auto_connect;

+    char *output_port_name;
+    char *input_port_name;
+
      pa_card *card;
      pa_sink *sink;
      pa_source *source;
@@ -1269,10 +1272,10 @@ static void handle_transport_state_change(struct 
userdata *u, struct pa_bluetoot
      pa_card_profile_set_available(cp, transport_state_to_availability(state));

      /* Update port availability */
-    pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output"));
+    pa_assert_se(port = pa_hashmap_get(u->card->ports, u->output_port_name));
      pa_device_port_set_available(port, get_port_availability(u, 
PA_DIRECTION_OUTPUT));

-    pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-input"));
+    pa_assert_se(port = pa_hashmap_get(u->card->ports, u->input_port_name));
      pa_device_port_set_available(port, get_port_availability(u, 
PA_DIRECTION_INPUT));

      /* Acquire or release transport as needed */
@@ -1516,13 +1519,13 @@ static void connect_ports(struct userdata *u, void 
*sink_or_source_new_data, pa_
      if (direction == PA_DIRECTION_OUTPUT) {
          pa_sink_new_data *sink_new_data = sink_or_source_new_data;

-        pa_assert_se(port = pa_hashmap_get(u->card->ports, 
"bluetooth-output"));
+        pa_assert_se(port = pa_hashmap_get(u->card->ports, 
u->output_port_name));
          pa_assert_se(pa_hashmap_put(sink_new_data->ports, port->name, port) 
>= 0);
          pa_device_port_ref(port);
      } else {
          pa_source_new_data *source_new_data = sink_or_source_new_data;

-        pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-input"));
+        pa_assert_se(port = pa_hashmap_get(u->card->ports, 
u->input_port_name));
          pa_assert_se(pa_hashmap_put(source_new_data->ports, port->name, port) 
>= 0);
          pa_device_port_ref(port);
      }
@@ -2067,17 +2070,81 @@ off:
  /* Run from main thread */
  static void create_card_ports(struct userdata *u, pa_hashmap *ports) {
      pa_device_port *port;
+    const char *name_prefix = NULL;
+    const char *input_description = NULL;
+    const char *output_description = NULL;

      pa_assert(u);
      pa_assert(ports);
+    pa_assert(u->device);
+
+    switch (pa_bluetooth_get_form_factor(u->device->class)) {
+        case PA_BT_FORM_FACTOR_UNKNOWN:
+            name_prefix = "unknown";
+            output_description = _("Bluetooth Output");
+            input_description = _("Bluetooth Input");
+            break;
+
+        case PA_BT_FORM_FACTOR_HEADSET:
+            name_prefix = "headset";
+            input_description = output_description = _("Headset");
+            break;
+
+        case PA_BT_FORM_FACTOR_HANDSFREE:
+            name_prefix = "handsfree";
+            input_description = output_description = _("Hands-free");

I believe the "Handsfree" spelling is more common, but not sure.

+            break;
+
+        case PA_BT_FORM_FACTOR_MICROPHONE:
+            name_prefix = "microphone";
+            input_description = output_description = _("Microphone");

         input_description = _("Microphone");

+            break;
+
+        case PA_BT_FORM_FACTOR_SPEAKER:
+            name_prefix = "speaker";
+            input_description = output_description = _("Speaker");

            output_description = _("Speaker");

+            break;
+
+        case PA_BT_FORM_FACTOR_HEADPHONE:
+            name_prefix = "headphone";
+            input_description = output_description = _("Headphone");

        output_description = _("Headphone");


+            break;
+
+        case PA_BT_FORM_FACTOR_PORTABLE:
+            name_prefix = "portable";
+            input_description = output_description = _("Portable");
+            break;
+
+        case PA_BT_FORM_FACTOR_CAR:
+            name_prefix = "car";
+            input_description = output_description = _("Car");
+            break;
+
+        case PA_BT_FORM_FACTOR_HIFI:
+            name_prefix = "hifi";
+            input_description = output_description = _("HiFi");
+            break;

-    pa_assert_se(port = pa_device_port_new(u->core, "bluetooth-output", 
_("Bluetooth Output"), 0));
+        case PA_BT_FORM_FACTOR_PHONE:
+            name_prefix = "phone";
+            input_description = output_description = _("Phone");
+            break;
+    }
+

if (!name_prefix)
  name_prefix = "unknown";
if (!input_description)
  input_description = _("Bluetooth Input");
if (!output_description)
  output_description = _("Bluetooth Output");

...and then the PA_BT_FORM_FACTOR_UNKNOWN case can be skipped, as well as the asserts below.

Looks good otherwise.

+    pa_assert(name_prefix);
+    pa_assert(output_description);
+    pa_assert(input_description);
+
+    u->output_port_name = pa_sprintf_malloc("%s-output", name_prefix);
+    u->input_port_name = pa_sprintf_malloc("%s-input", name_prefix);
+
+    pa_assert_se(port = pa_device_port_new(u->core, u->output_port_name, 
output_description, 0));
      pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);
      port->is_output = 1;
      port->is_input = 0;
      port->available = get_port_availability(u, PA_DIRECTION_OUTPUT);

-    pa_assert_se(port = pa_device_port_new(u->core, "bluetooth-input", _("Bluetooth 
Input"), 0));
+    pa_assert_se(port = pa_device_port_new(u->core, u->input_port_name, 
input_description, 0));
      pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);
      port->is_output = 0;
      port->is_input = 1;
@@ -2521,6 +2588,9 @@ void pa__done(pa_module *m) {
      if (u->modargs)
          pa_modargs_free(u->modargs);

+    pa_xfree(u->output_port_name);
+    pa_xfree(u->input_port_name);
+
      pa_xfree(u->address);
      pa_xfree(u->path);





--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to