#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
}
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) {
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) {
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);
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;
}
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;
}
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;
}
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) {
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;
}