diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c index b1a2c74f6..7c1fdcf45 100644 --- a/plugins/linux-v4l2/v4l2-input.c +++ b/plugins/linux-v4l2/v4l2-input.c @@ -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; }