[pulseaudio-commits] src/modules
Tanu Kaskinen
tanuk at kemper.freedesktop.org
Mon Oct 22 09:03:07 PDT 2012
src/modules/bluetooth/module-bluetooth-device.c | 43 ++++++++----------------
1 file changed, 15 insertions(+), 28 deletions(-)
New commits:
commit 0b72a87c26ea3dc3b23176f4ebbc5b4dd789fc59
Author: Mikel Astiz <mikel.astiz at bmw-carit.de>
Date: Mon Oct 22 10:46:39 2012 +0200
bluetooth: Hold device pointer while module loaded
Instead of repeatedly asking the discovery API to find a device given
our device path, let's hold a pointer to the device and make sure we
remove the reference when the hook is fired reporting that the device
has been removed. This makes the code easier to follow and slightly
more efficient.
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 7167390..39c5d5c 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -139,6 +139,7 @@ struct userdata {
pa_core *core;
pa_module *module;
+ pa_bluetooth_device *device;
char *address;
char *path;
pa_bluetooth_transport *transport;
@@ -380,7 +381,6 @@ static pa_bt_audio_state_t get_profile_audio_state(const struct userdata *u, con
static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
const char *accesstype = "rw";
- pa_bluetooth_device *d;
pa_assert(u->transport);
@@ -392,12 +392,6 @@ static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
pa_log_debug("Acquiring transport %s", u->transport->path);
- d = pa_bluetooth_discovery_get_by_path(u->discovery, u->path);
- if (!d) {
- pa_log_error("Failed to get device object.");
- return -1;
- }
-
if (!start) {
/* FIXME: we are trying to acquire the transport only if the stream is
playing, without actually initiating the stream request from our side
@@ -406,7 +400,7 @@ static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
suspended in the meantime, so we can't really guarantee that the
stream will not be requested until BlueZ's API supports this
atomically. */
- if (get_profile_audio_state(u, d) < PA_BT_AUDIO_STATE_PLAYING) {
+ if (get_profile_audio_state(u, u->device) < PA_BT_AUDIO_STATE_PLAYING) {
pa_log_info("Failed optional acquire of transport %s", u->transport->path);
return -1;
}
@@ -1975,19 +1969,13 @@ static pa_hook_result_t transport_removed_cb(pa_bluetooth_transport *t, void *ca
/* Run from main thread */
static int setup_transport(struct userdata *u) {
- pa_bluetooth_device *d;
pa_bluetooth_transport *t;
pa_assert(u);
pa_assert(!u->transport);
- if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
- pa_log_error("Failed to get device object.");
- return -1;
- }
-
/* check if profile has a transport */
- t = pa_bluetooth_device_get_transport(d, u->profile);
+ t = pa_bluetooth_device_get_transport(u->device, u->profile);
if (t == NULL) {
pa_log_warn("Profile has no transport");
return -1;
@@ -2203,12 +2191,7 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
d = PA_CARD_PROFILE_DATA(new_profile);
if (*d != PROFILE_OFF) {
- const pa_bluetooth_device *device;
-
- if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
- pa_log_error("Failed to get device object.");
- return -PA_ERR_IO;
- }
+ const pa_bluetooth_device *device = u->device;
if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) {
pa_log_warn("HSP is not connected, refused to switch profile");
@@ -2254,7 +2237,8 @@ off:
return -PA_ERR_IO;
}
-static void create_ports_for_profile(struct userdata *u, const pa_bluetooth_device *device, pa_card_new_data *card_new_data, pa_card_profile *profile) {
+static void create_ports_for_profile(struct userdata *u, pa_card_new_data *card_new_data, pa_card_profile *profile) {
+ pa_bluetooth_device *device = u->device;
pa_device_port *port;
enum profile *d;
@@ -2324,7 +2308,7 @@ static void create_ports_for_profile(struct userdata *u, const pa_bluetooth_devi
}
/* Run from main thread */
-static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
+static int add_card(struct userdata *u) {
pa_card_new_data data;
pa_bool_t b;
pa_card_profile *p;
@@ -2332,6 +2316,7 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
const char *ff;
char *n;
const char *default_profile;
+ const pa_bluetooth_device *device = u->device;
pa_assert(u);
pa_assert(device);
@@ -2375,7 +2360,7 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
d = PA_CARD_PROFILE_DATA(p);
*d = PROFILE_A2DP;
- create_ports_for_profile(u, device, &data, p);
+ create_ports_for_profile(u, &data, p);
pa_hashmap_put(data.profiles, p->name, p);
}
@@ -2390,7 +2375,7 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
d = PA_CARD_PROFILE_DATA(p);
*d = PROFILE_A2DP_SOURCE;
- create_ports_for_profile(u, device, &data, p);
+ create_ports_for_profile(u, &data, p);
pa_hashmap_put(data.profiles, p->name, p);
}
@@ -2406,7 +2391,7 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
d = PA_CARD_PROFILE_DATA(p);
*d = PROFILE_HSP;
- create_ports_for_profile(u, device, &data, p);
+ create_ports_for_profile(u, &data, p);
pa_hashmap_put(data.profiles, p->name, p);
}
@@ -2421,7 +2406,7 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
d = PA_CARD_PROFILE_DATA(p);
*d = PROFILE_HFGW;
- create_ports_for_profile(u, device, &data, p);
+ create_ports_for_profile(u, &data, p);
pa_hashmap_put(data.profiles, p->name, p);
}
@@ -2609,8 +2594,10 @@ int pa__init(pa_module* m) {
u->device_removed_slot = pa_hook_connect(&device->hooks[PA_BLUETOOTH_DEVICE_HOOK_REMOVED], PA_HOOK_NORMAL,
(pa_hook_cb_t) device_removed_cb, u);
+ u->device = device;
+
/* Add the card structure. This will also initialize the default profile */
- if (add_card(u, device) < 0)
+ if (add_card(u) < 0)
goto fail;
if (!(u->msg = pa_msgobject_new(bluetooth_msg)))
More information about the pulseaudio-commits
mailing list