device-manager: Support to load sink2/source2 02/262502/9
authorJaechul Lee <jcsing.lee@samsung.com>
Thu, 12 Aug 2021 05:45:46 +0000 (14:45 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Thu, 19 Aug 2021 01:44:54 +0000 (10:44 +0900)
pulseaudio tries to load tizenaudio-sink2/source2 instead of
tizenaudio-sink/source if 'tizen2' keyword is found in device-map file.

[Version] 13.0.71
[Issue Type] Improvement

Change-Id: Ie9c67f4888fb628961811d906e4d6c396700b14e
Signed-off-by: Jaechul Lee <jcsing.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/device-manager.c

index 9935f2822379824e637be25bdda6a0a97b0523e8..3445223c0a725a8d3741ed7caaca630548307878 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          13.0.70
+Version:          13.0.71
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index a1a717e60cf3c93e5193408a214d973d567ac070..c5491e086849c6ab8dee2d76fb83591f170d5b00 100644 (file)
@@ -58,6 +58,7 @@
 #define DEVICE_MAP_FILE                     PA_DEFAULT_CONFIG_DIR"/device-map.json"
 #define DEVICE_STR_MAX                      40
 #define DEVICE_DIRECTION_MAX                3
+#define DEVICE_MODULE_STRING_MAX            256
 #define DEVICE_PARAM_STRING_MAX             150
 #define DEVICE_AVAIL_COND_NUM_MAX           2
 #define DEVICE_AVAIL_COND_STR_MAX           6
@@ -424,16 +425,18 @@ static bool pulse_device_is_tunnel(pa_object *pdevice) {
 }
 
 static bool pulse_device_is_tizenaudio(pa_object *pdevice) {
+    char name[DEVICE_NAME_MAX];
+
     if (!pdevice)
         return false;
 
-    if (pa_sink_isinstance(pdevice)) {
-        pa_sink *sink = PA_SINK(pdevice);
-        return pa_safe_streq(sink->module->name, "module-tizenaudio-sink");
-    } else {
-        pa_source *source = PA_SOURCE(pdevice);
-        return pa_safe_streq(source->module->name, "module-tizenaudio-source");
-    }
+    if (!module_table[DM_DEVICE_CLASS_TIZEN].custom_device_get_func)
+        return false;
+
+    if (module_table[DM_DEVICE_CLASS_TIZEN].custom_device_get_func(pdevice, name))
+        return false;
+
+    return true;
 }
 
 static bool pulse_device_is_usb(pa_object *pdevice) {
@@ -572,11 +575,40 @@ static bool pulse_device_is_monitor(pa_object *pdevice) {
     return false;
 }
 
-static const char* device_class_get_module_name(dm_device_class_t device_class, bool is_sink) {
+static char* device_class_get_module_name(dm_device_class_t device_class, const char *device_string, bool is_sink) {
+    char version[8] = "";
+    char module_name[DEVICE_MODULE_STRING_MAX];
+    const char *_module_name;
+
     if (device_class >= DM_DEVICE_CLASS_MAX)
         return NULL;
 
-    return module_table[device_class].module_name[is_sink];
+    if (!device_string)
+        return NULL;
+
+    _module_name = module_table[device_class].module_name[is_sink];
+
+    /* supports tizen[2-9] keyword in device-map */
+    if (device_class == DM_DEVICE_CLASS_TIZEN) {
+        int v;
+        char *class;
+        const char *state = NULL, *prefix = "tizen";
+
+        class = pa_split(device_string, ":", &state);
+
+        if (!pa_streq(class, prefix)) {
+            if (!pa_atoi(class + strlen(prefix), &v))
+                snprintf(version, sizeof(version), "%d", v);
+            else
+                pa_log_warn("failed to get a version from class(%s)", class);
+        }
+
+        pa_xfree(class);
+    }
+
+    snprintf(module_name, DEVICE_MODULE_STRING_MAX, "%s%s", _module_name, version);
+
+    return pa_xstrdup(module_name);
 }
 
 static device_type_info* _device_manager_get_type_info(pa_idxset *type_infos, const char *type, const char *role) {
@@ -916,7 +948,8 @@ static int pulse_device_get_alsa_device_name(pa_object *pdevice, char *device_na
 
 static int pulse_device_get_tizen_device_name(pa_object *pdevice, char *device_name) {
     pa_proplist *prop;
-    const char *card, *device;
+    const char *card, *device, *version;
+    char class[8] = "tizen";
 
     prop = pulse_device_get_proplist(pdevice);
 
@@ -924,12 +957,17 @@ static int pulse_device_get_tizen_device_name(pa_object *pdevice, char *device_n
         pa_log_error("failed to get property 'tizen.card'");
         return -1;
     }
+
     if (!(device = pa_proplist_gets(prop, "tizen.device"))) {
         pa_log_error("failed to get property 'tizen.device'");
         return -1;
     }
 
-    snprintf(device_name, DEVICE_NAME_MAX, "tizen:%s,%s", card, device);
+    if ((version = pa_proplist_gets(prop, "tizen.version")))
+        snprintf(class, sizeof(class), "tizen%s", version);
+
+    snprintf(device_name, DEVICE_NAME_MAX, "%s:%s,%s", class, card, device);
+
     return 0;
 }
 
@@ -1844,7 +1882,7 @@ static pa_hook_result_t sink_proplist_changed(pa_core *core, pa_sink *sink, pa_d
     Build params for load sink or source, and load it.
 */
 static void* load_module(pa_core *c, bool is_sink, const char *device_string, const char *device_params, const char *device_role) {
-    const char *module_name;
+    char *module_name;
     pa_module *module;
     pa_sink *sink;
     pa_source *source;
@@ -1865,7 +1903,7 @@ static void* load_module(pa_core *c, bool is_sink, const char *device_string, co
     }
     pa_log_info("device class : %d", device_class);
 
-    if (!(module_name = device_class_get_module_name(device_class, is_sink))) {
+    if (!(module_name = device_class_get_module_name(device_class, device_string, is_sink))) {
         pa_log_error("Get proper module name to load failed");
         return NULL;
     }
@@ -1873,16 +1911,19 @@ static void* load_module(pa_core *c, bool is_sink, const char *device_string, co
 
     if (build_params_to_load_module(device_string, device_params, device_class, full_params) < 0) {
         pa_log_error("build param to load module failed");
-        return NULL;
+        goto exit;
     }
     pa_log_info("argument : %s", full_params);
 
     if (pa_module_load(&module, c, module_name, full_params)) {
         pa_log_error("Load module with name '%s' argument '%s' failed", module_name, full_params);
-        return NULL;
+        goto exit;
     }
     pa_log_info("module loaded : %s %u with '%s'", module->name, module->index, module->argument);
 
+    pa_xfree(module_name);
+    module_name = NULL;
+
     if (is_sink) {
         PA_IDXSET_FOREACH(sink, c->sinks, device_idx) {
             if (sink->module == module) {
@@ -1905,6 +1946,10 @@ static void* load_module(pa_core *c, bool is_sink, const char *device_string, co
 
     pa_log_warn("Failed to find matching %s after load module", is_sink ? "sink" : "source");
 
+exit:
+    if (module_name)
+        pa_xfree(module_name);
+
     return NULL;
 }