diff options
Diffstat (limited to 'audio/unix.c')
-rw-r--r-- | audio/unix.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/audio/unix.c b/audio/unix.c index e30a2257..472347b1 100644 --- a/audio/unix.c +++ b/audio/unix.c @@ -648,8 +648,6 @@ static void start_discovery(struct audio_device *dev, struct unix_client *client struct a2dp_data *a2dp; int err = 0; - client->type = select_service(dev, client->interface); - switch (client->type) { case TYPE_SINK: a2dp = &client->d.a2dp; @@ -691,8 +689,6 @@ static void start_config(struct audio_device *dev, struct unix_client *client) struct headset_data *hs; unsigned int id; - client->type = select_service(dev, client->interface); - switch (client->type) { case TYPE_SINK: a2dp = &client->d.a2dp; @@ -758,8 +754,6 @@ static void start_resume(struct audio_device *dev, struct unix_client *client) struct headset_data *hs; unsigned int id; - client->type = select_service(dev, client->interface); - switch (client->type) { case TYPE_SINK: a2dp = &client->d.a2dp; @@ -813,8 +807,6 @@ static void start_suspend(struct audio_device *dev, struct unix_client *client) struct headset_data *hs; unsigned int id; - client->type = select_service(dev, client->interface); - switch (client->type) { case TYPE_SINK: a2dp = &client->d.a2dp; @@ -870,8 +862,8 @@ static void handle_getcapabilities_req(struct unix_client *client, str2ba(req->device, &bdaddr); if (client->interface) { - g_free(client->interface); - client->interface = NULL; + error("Got GET_CAPABILITIES for an initialized client"); + goto failed; } if (req->transport == BT_CAPABILITIES_TRANSPORT_SCO) @@ -883,15 +875,19 @@ static void handle_getcapabilities_req(struct unix_client *client, goto failed; dev = manager_find_device(&bdaddr, client->interface, TRUE); + if (!dev && (req->flags & BT_FLAG_AUTOCONNECT)) + dev = manager_find_device(&bdaddr, client->interface, FALSE); + if (!dev) { - if (req->flags & BT_FLAG_AUTOCONNECT) - dev = manager_find_device(&bdaddr, client->interface, FALSE); - else - goto failed; + error("Unable to find a matching device"); + goto failed; } - if (!dev) + client->type = select_service(dev, client->interface); + if (client->type == TYPE_NONE) { + error("No matching service found"); goto failed; + } start_discovery(dev, client); @@ -904,7 +900,10 @@ failed: static int handle_sco_transport(struct unix_client *client, struct bt_set_configuration_req *req) { - client->interface = g_strdup(AUDIO_HEADSET_INTERFACE); + if (!client->interface) + client->interface = g_strdup(AUDIO_HEADSET_INTERFACE); + else if (!g_str_equal(client->interface, AUDIO_HEADSET_INTERFACE)) + return -EIO; debug("config sco - device = %s access_mode = %u", req->device, req->access_mode); @@ -919,7 +918,10 @@ static int handle_a2dp_transport(struct unix_client *client, struct sbc_codec_cap sbc_cap; struct mpeg_codec_cap mpeg_cap; - client->interface = g_strdup(AUDIO_SINK_INTERFACE); + if (!client->interface) + client->interface = g_strdup(AUDIO_SINK_INTERFACE); + else if (!g_str_equal(client->interface, AUDIO_SINK_INTERFACE)) + return -EIO; if (client->caps) { g_slist_foreach(client->caps, (GFunc) g_free, NULL); @@ -1003,11 +1005,6 @@ static void handle_setconfiguration_req(struct unix_client *client, str2ba(req->device, &bdaddr); - if (client->interface) { - g_free(client->interface); - client->interface = NULL; - } - if (req->codec.transport == BT_CAPABILITIES_TRANSPORT_SCO) { err = handle_sco_transport(client, req); if (err < 0) { |