[pulseaudio-discuss] [PATCH 12/17] bluetooth: Store port pointers instead of port names in userdata

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Mon Dec 30 05:04:47 PST 2013


It's more convenient that way.
---
 src/modules/bluetooth/module-bluetooth-device.c | 89 +++++++++++--------------
 1 file changed, 39 insertions(+), 50 deletions(-)

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index f133d56..59acaf8 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -152,8 +152,8 @@ struct userdata {
     pa_bluetooth_discovery *discovery;
     bool auto_connect;
 
-    char *output_port_name;
-    char *input_port_name;
+    pa_device_port *output_port;
+    pa_device_port *input_port;
 
     pa_card *card;
     pa_device_prototype *sink_prototype;
@@ -1251,7 +1251,6 @@ static void handle_transport_state_change(struct userdata *u, struct pa_bluetoot
     enum profile profile;
     pa_card_profile *cp;
     pa_bluetooth_transport_state_t state;
-    pa_device_port *port;
 
     pa_assert(u);
     pa_assert(transport);
@@ -1266,11 +1265,8 @@ 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, 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, u->input_port_name));
-    pa_device_port_set_available(port, get_port_availability(u, PA_DIRECTION_INPUT));
+    pa_device_port_set_available(u->output_port, get_port_availability(u, PA_DIRECTION_OUTPUT));
+    pa_device_port_set_available(u->input_port, get_port_availability(u, PA_DIRECTION_INPUT));
 
     /* Acquire or release transport as needed */
     acquire = (state == PA_BLUETOOTH_TRANSPORT_STATE_PLAYING && u->profile == profile);
@@ -1508,20 +1504,16 @@ static pa_hook_result_t transport_speaker_gain_changed_cb(pa_bluetooth_discovery
 }
 
 static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_direction_t direction) {
-    pa_device_port *port;
-
     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, u->output_port_name));
-        pa_assert_se(pa_hashmap_put(sink_new_data->ports, port->name, port) >= 0);
-        pa_device_port_ref(port);
+        pa_assert_se(pa_hashmap_put(sink_new_data->ports, u->output_port->name, u->output_port) >= 0);
+        pa_device_port_ref(u->output_port);
     } else {
         pa_source_new_data *source_new_data = sink_or_source_new_data;
 
-        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);
+        pa_assert_se(pa_hashmap_put(source_new_data->ports, u->input_port->name, u->input_port) >= 0);
+        pa_device_port_ref(u->input_port);
     }
 }
 
@@ -2071,10 +2063,9 @@ off:
 
 /* Run from main thread */
 static int create_card_ports(struct userdata *u, pa_hashmap *ports) {
-    pa_device_port *output_port = NULL;
-    pa_device_port *input_port = NULL;
     pa_device_port_new_data port_data;
-
+    char *output_port_name;
+    char *input_port_name;
     const char *name_prefix = NULL;
     const char *input_description = NULL;
     const char *output_description = NULL;
@@ -2142,50 +2133,57 @@ static int create_card_ports(struct userdata *u, pa_hashmap *ports) {
     if (!input_description)
         input_description = _("Bluetooth Input");
 
-    u->output_port_name = pa_sprintf_malloc("%s-output", name_prefix);
-    u->input_port_name = pa_sprintf_malloc("%s-input", name_prefix);
+    output_port_name = pa_sprintf_malloc("%s-output", name_prefix);
+    input_port_name = pa_sprintf_malloc("%s-input", name_prefix);
 
     pa_device_port_new_data_init(&port_data);
-    pa_device_port_new_data_set_name(&port_data, u->output_port_name);
+    pa_device_port_new_data_set_name(&port_data, output_port_name);
     pa_device_port_new_data_set_description(&port_data, output_description);
     pa_device_port_new_data_set_direction(&port_data, PA_DIRECTION_OUTPUT);
     pa_device_port_new_data_set_available(&port_data, get_port_availability(u, PA_DIRECTION_OUTPUT));
     pa_node_new_data_set_fallback_name_prefix(&port_data.node_data, "bluetooth");
 
-    output_port = pa_device_port_new(u->core, &port_data, 0);
+    u->output_port = pa_device_port_new(u->core, &port_data, 0);
     pa_device_port_new_data_done(&port_data);
 
-    if (!output_port) {
-        pa_log("Failed to create port %s.", u->output_port_name);
+    if (!u->output_port) {
+        pa_log("Failed to create port %s.", output_port_name);
         goto fail;
     }
 
     pa_device_port_new_data_init(&port_data);
-    pa_device_port_new_data_set_name(&port_data, u->input_port_name);
+    pa_device_port_new_data_set_name(&port_data, input_port_name);
     pa_device_port_new_data_set_description(&port_data, input_description);
     pa_device_port_new_data_set_direction(&port_data, PA_DIRECTION_INPUT);
     pa_device_port_new_data_set_available(&port_data, get_port_availability(u, PA_DIRECTION_INPUT));
     pa_node_new_data_set_fallback_name_prefix(&port_data.node_data, "bluetooth");
 
-    input_port = pa_device_port_new(u->core, &port_data, 0);
+    u->input_port = pa_device_port_new(u->core, &port_data, 0);
     pa_device_port_new_data_done(&port_data);
 
-    if (!input_port) {
-        pa_log("Failed to create port %s.", u->input_port_name);
+    if (!u->input_port) {
+        pa_log("Failed to create port %s.", input_port_name);
         goto fail;
     }
 
-    pa_assert_se(pa_hashmap_put(ports, output_port->name, output_port) >= 0);
-    pa_assert_se(pa_hashmap_put(ports, input_port->name, input_port) >= 0);
+    pa_assert_se(pa_hashmap_put(ports, u->output_port->name, u->output_port) >= 0);
+    pa_assert_se(pa_hashmap_put(ports, u->input_port->name, u->input_port) >= 0);
 
     return 0;
 
 fail:
-    if (output_port)
-        pa_device_port_unref(output_port);
+    if (u->output_port) {
+        pa_device_port_unref(u->output_port);
+        u->output_port = NULL;
+    }
+
+    if (u->input_port) {
+        pa_device_port_unref(u->input_port);
+        u->input_port = NULL;
+    }
 
-    if (input_port)
-        pa_device_port_unref(input_port);
+    pa_xfree(input_port_name);
+    pa_xfree(output_port_name);
 
     return -1;
 }
@@ -2193,15 +2191,9 @@ fail:
 /* Run from main thread */
 static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid, pa_hashmap *ports) {
     enum profile profile = PROFILE_OFF;
-    pa_device_port *input_port, *output_port;
     pa_card_profile *p = NULL;
     enum profile *d;
 
-    pa_assert(u->input_port_name);
-    pa_assert(u->output_port_name);
-    pa_assert_se(input_port = pa_hashmap_get(ports, u->input_port_name));
-    pa_assert_se(output_port = pa_hashmap_get(ports, u->output_port_name));
-
     if (pa_streq(uuid, A2DP_SINK_UUID))
         profile = PROFILE_A2DP;
     else if (pa_streq(uuid, A2DP_SOURCE_UUID))
@@ -2227,7 +2219,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         pa_hashmap_put(p->sink_prototypes, u->sink_prototype, u->sink_prototype);
         p->max_sink_channels = 2;
         p->max_source_channels = 0;
-        pa_hashmap_put(output_port->profiles, p->name, p);
+        pa_hashmap_put(u->output_port->profiles, p->name, p);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PROFILE_A2DP;
@@ -2237,7 +2229,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         pa_hashmap_put(p->source_prototypes, u->source_prototype, u->source_prototype);
         p->max_sink_channels = 0;
         p->max_source_channels = 2;
-        pa_hashmap_put(input_port->profiles, p->name, p);
+        pa_hashmap_put(u->input_port->profiles, p->name, p);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PROFILE_A2DP_SOURCE;
@@ -2252,8 +2244,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
             p->max_source_channels = 1;
         }
 
-        pa_hashmap_put(input_port->profiles, p->name, p);
-        pa_hashmap_put(output_port->profiles, p->name, p);
+        pa_hashmap_put(u->input_port->profiles, p->name, p);
+        pa_hashmap_put(u->output_port->profiles, p->name, p);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PROFILE_HSP;
@@ -2268,8 +2260,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
             p->max_source_channels = 1;
         }
 
-        pa_hashmap_put(input_port->profiles, p->name, p);
-        pa_hashmap_put(output_port->profiles, p->name, p);
+        pa_hashmap_put(u->input_port->profiles, p->name, p);
+        pa_hashmap_put(u->output_port->profiles, p->name, p);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PROFILE_HFGW;
@@ -2672,9 +2664,6 @@ 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);
 
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list