|
@@ -224,16 +224,20 @@ static void v4l2_defaults(obs_data_t *settings)
|
|
|
*/
|
|
|
static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings)
|
|
|
{
|
|
|
- UNUSED_PARAMETER(settings);
|
|
|
-
|
|
|
DIR *dirp;
|
|
|
struct dirent *dp;
|
|
|
struct dstr device;
|
|
|
+ bool cur_device_found;
|
|
|
+ size_t cur_device_index;
|
|
|
+ const char *cur_device_name;
|
|
|
|
|
|
dirp = opendir("/sys/class/video4linux");
|
|
|
if (!dirp)
|
|
|
return;
|
|
|
|
|
|
+ cur_device_found = false;
|
|
|
+ cur_device_name = obs_data_get_string(settings, "device_id");
|
|
|
+
|
|
|
obs_property_list_clear(prop);
|
|
|
|
|
|
dstr_init_copy(&device, "/dev/");
|
|
@@ -277,9 +281,20 @@ static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings)
|
|
|
blog(LOG_INFO, "Found device '%s' at %s", video_cap.card,
|
|
|
device.array);
|
|
|
|
|
|
+ /* check if this is the currently used device */
|
|
|
+ if (cur_device_name && !strcmp(cur_device_name, device.array))
|
|
|
+ cur_device_found = true;
|
|
|
+
|
|
|
v4l2_close(fd);
|
|
|
}
|
|
|
|
|
|
+ /* add currently selected device if not present, but disable it ... */
|
|
|
+ if (!cur_device_found && cur_device_name && strlen(cur_device_name)) {
|
|
|
+ cur_device_index = obs_property_list_add_string(prop,
|
|
|
+ cur_device_name, cur_device_name);
|
|
|
+ obs_property_list_item_disable(prop, cur_device_index, true);
|
|
|
+ }
|
|
|
+
|
|
|
closedir(dirp);
|
|
|
dstr_free(&device);
|
|
|
}
|
|
@@ -566,9 +581,9 @@ static void device_removed(const char *dev, void *vptr)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
-static obs_properties_t *v4l2_properties(void *unused)
|
|
|
+static obs_properties_t *v4l2_properties(void *vptr)
|
|
|
{
|
|
|
- UNUSED_PARAMETER(unused);
|
|
|
+ V4L2_DATA(vptr);
|
|
|
|
|
|
obs_properties_t *props = obs_properties_create();
|
|
|
|
|
@@ -595,12 +610,16 @@ static obs_properties_t *v4l2_properties(void *unused)
|
|
|
obs_properties_add_bool(props,
|
|
|
"system_timing", obs_module_text("UseSystemTiming"));
|
|
|
|
|
|
- v4l2_device_list(device_list, NULL);
|
|
|
+ obs_data_t *settings = obs_source_get_settings(data->source);
|
|
|
+ v4l2_device_list(device_list, settings);
|
|
|
+ obs_data_release(settings);
|
|
|
+
|
|
|
obs_property_set_modified_callback(device_list, device_selected);
|
|
|
obs_property_set_modified_callback(input_list, input_selected);
|
|
|
obs_property_set_modified_callback(format_list, format_selected);
|
|
|
obs_property_set_modified_callback(resolution_list,
|
|
|
resolution_selected);
|
|
|
+
|
|
|
return props;
|
|
|
}
|
|
|
|