device-manager: Add 'role' parameter to _device_manager_get_type_info() 54/207954/1
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 14 Jun 2019 07:26:56 +0000 (16:26 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 14 Jun 2019 07:26:56 +0000 (16:26 +0900)
This function is related to device descriptions in device-map.json.
It is also revised considering the role.

load_sink/source() is fixed to return sink/source even if the device
has been already loaded instead of NULL.

[Version] 11.1.50
[Issue type] Improvement

Change-Id: I01a2d898e48e4e06ce5d316e68eaa50f9d7b3a6f
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/device-manager-dbus.c
src/device-manager.c

index d873447..b68e0b6 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          11.1.49
+Version:          11.1.50
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index f065055..6682567 100644 (file)
@@ -895,16 +895,21 @@ static void handle_get_bt_a2dp_status(DBusConnection *conn, DBusMessage *msg, vo
 static void handle_load_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_device_manager *dm;
     char *type, *role;
+    pa_sink *sink;
     DBusMessage *reply = NULL;
 
-    pa_assert_se((reply = dbus_message_new_method_return(msg)));
     dm = (pa_device_manager *) userdata;
     pa_assert_se(dbus_message_get_args(msg, NULL,
                                        DBUS_TYPE_STRING, &type,
                                        DBUS_TYPE_STRING, &role,
                                        DBUS_TYPE_INVALID));
 
-    pa_device_manager_load_sink(dm, type, role);
+    if (!(sink = pa_device_manager_load_sink(dm, type, role))) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "%s", "org.tizen.multimedia.audio.Internal");
+        return;
+    }
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
     pa_assert_se(dbus_connection_send(conn, reply, NULL));
     dbus_message_unref(reply);
 }
index 9fa9e32..f801e53 100644 (file)
@@ -590,12 +590,33 @@ static const char* device_class_get_module_name(dm_device_class_t device_class,
     }
 }
 
-static struct device_type_info* _device_manager_get_type_info(pa_idxset *type_infos, const char *type) {
+static struct device_type_info* _device_manager_get_type_info(pa_idxset *type_infos, const char *type, const char *role) {
     struct device_type_info *type_info;
     uint32_t type_idx;
+    const char *device_string;
+    const char *_role;
+    void *state;
+
+    pa_assert(type_infos);
+    pa_assert(type);
 
     PA_IDXSET_FOREACH(type_info, type_infos, type_idx) {
         if (device_type_is_equal(type_info->type, type)) {
+            if (role) {
+                if (type_info->playback_devices) {
+                    PA_HASHMAP_FOREACH_KV(_role, device_string, type_info->playback_devices, state) {
+                        if (pa_safe_streq(_role, role))
+                            return type_info;
+                    }
+                }
+                if (type_info->capture_devices) {
+                    PA_HASHMAP_FOREACH_KV(_role, device_string, type_info->capture_devices, state) {
+                        if (pa_safe_streq(_role, role))
+                            return type_info;
+                    }
+                }
+                continue;
+            }
             return type_info;
         }
     }
@@ -1830,7 +1851,7 @@ void handle_device_connected(pa_device_manager *dm, const char *type,
     pa_log_info("Device connected, type(%s) name(%s) system_id(%s) detected_type(%d)",
             type, pa_strempty(name), pa_strempty(system_id), detected_type);
 
-    type_info = _device_manager_get_type_info(dm->type_infos, type);
+    type_info = _device_manager_get_type_info(dm->type_infos, type, NULL);
 
     if (device_type_is_equal(type, DEVICE_TYPE_BT_SCO)) {
         pa_tz_device_new_data_init(&data, dm->device_list, dm->comm, dm->dbus_conn);
@@ -2288,14 +2309,14 @@ static pa_sink* load_sink(pa_device_manager *dm, const char *type, const char *r
     pa_log_info("Load Sink for '%s.%s'", type, role);
     PA_IDXSET_FOREACH(device, dm->device_list, device_idx) {
         if (pa_safe_streq(type, pa_tz_device_get_type(device))) {
-            if (pa_tz_device_get_sink(device, role)) {
+            if ((sink = pa_tz_device_get_sink(device, role))) {
                 pa_log_warn("Proper sink for '%s.%s' already loaded", type, role);
-                return NULL;
+                return sink;
             }
         }
     }
 
-    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type))) {
+    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type, role))) {
         pa_log_error("No type map for %s", type);
         return NULL;
     }
@@ -2344,7 +2365,7 @@ static void unload_sink(pa_device_manager *dm, const char *type, const char *rol
 
     pa_log_info("Unload Sink for '%s.%s'", type, role);
 
-    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type))) {
+    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type, role))) {
         pa_log_error("No type map for %s", type);
         return;
     }
@@ -2379,14 +2400,14 @@ static pa_source* load_source(pa_device_manager *dm, const char *type, const cha
 
     PA_IDXSET_FOREACH(device, dm->device_list, device_idx) {
         if (pa_safe_streq(type, pa_tz_device_get_type(device))) {
-            if (pa_tz_device_get_source(device, role)) {
+            if ((source = pa_tz_device_get_source(device, role))) {
                 pa_log_warn("Proper source for '%s.%s' already loaded", type, role);
-                return NULL;
+                return source;
             }
         }
     }
 
-    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type))) {
+    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type, role))) {
         pa_log_error("No type map for %s", type);
         return NULL;
     }
@@ -2435,7 +2456,7 @@ static void unload_source(pa_device_manager *dm, const char *type, const char *r
 
     pa_log_info("Unload Source for '%s.%s'", type, role);
 
-    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type))) {
+    if (!(type_info = _device_manager_get_type_info(dm->type_infos, type, role))) {
         pa_log_error("No type map for %s", type);
         return;
     }
@@ -2551,7 +2572,7 @@ const char* pa_device_manager_get_device_string(pa_device_manager *dm, bool is_p
     pa_assert(type);
     pa_assert(role);
 
-    type_info = _device_manager_get_type_info(dm->type_infos, type);
+    type_info = _device_manager_get_type_info(dm->type_infos, type, role);
     if (type_info == NULL) {
         pa_log_error("No type info for %s", type);
         return NULL;