OSDN Git Service

audio/A2DP: Return -ENOPROTOOPT if record doesn't exist
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 13 Nov 2013 13:26:36 +0000 (15:26 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Wed, 13 Nov 2013 14:48:26 +0000 (16:48 +0200)
In case record is not registered it means no endpoint is available so
return -ENOPROTOOPT to indicate that it is currently not available.

profiles/audio/a2dp.c

index 6b3d6b2..864cb18 100644 (file)
@@ -1861,10 +1861,22 @@ static void a2dp_sink_remove(struct btd_service *service)
 static int a2dp_source_connect(struct btd_service *service)
 {
        struct btd_device *dev = btd_service_get_device(service);
+       struct btd_adapter *adapter = device_get_adapter(dev);
+       struct a2dp_server *server;
        const char *path = device_get_path(dev);
 
        DBG("path %s", path);
 
+       server = find_server(servers, adapter);
+       if (!server || !server->sink_enabled) {
+               DBG("Unexpected error: cannot find server");
+               return -EPROTONOSUPPORT;
+       }
+
+       /* Return protocol not available if no record/endpoint exists */
+       if (server->sink_record_id == 0)
+               return -ENOPROTOOPT;
+
        return source_connect(service);
 }
 
@@ -1881,10 +1893,22 @@ static int a2dp_source_disconnect(struct btd_service *service)
 static int a2dp_sink_connect(struct btd_service *service)
 {
        struct btd_device *dev = btd_service_get_device(service);
+       struct btd_adapter *adapter = device_get_adapter(dev);
+       struct a2dp_server *server;
        const char *path = device_get_path(dev);
 
        DBG("path %s", path);
 
+       server = find_server(servers, adapter);
+       if (!server || !server->source_enabled) {
+               DBG("Unexpected error: cannot find server");
+               return -EPROTONOSUPPORT;
+       }
+
+       /* Return protocol not available if no record/endpoint exists */
+       if (server->source_record_id == 0)
+               return -ENOPROTOOPT;
+
        return sink_connect(service);
 }