linux-v4l2: Always display currently selected device.
This adds some code to the device enumeration that checks if the currently selected device is present. In case it is not it will add the device but disable it.master
parent
24d1495b84
commit
3a85d662be
|
@ -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)
|
static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings)
|
||||||
{
|
{
|
||||||
UNUSED_PARAMETER(settings);
|
|
||||||
|
|
||||||
DIR *dirp;
|
DIR *dirp;
|
||||||
struct dirent *dp;
|
struct dirent *dp;
|
||||||
struct dstr device;
|
struct dstr device;
|
||||||
|
bool cur_device_found;
|
||||||
|
size_t cur_device_index;
|
||||||
|
const char *cur_device_name;
|
||||||
|
|
||||||
dirp = opendir("/sys/class/video4linux");
|
dirp = opendir("/sys/class/video4linux");
|
||||||
if (!dirp)
|
if (!dirp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
cur_device_found = false;
|
||||||
|
cur_device_name = obs_data_get_string(settings, "device_id");
|
||||||
|
|
||||||
obs_property_list_clear(prop);
|
obs_property_list_clear(prop);
|
||||||
|
|
||||||
dstr_init_copy(&device, "/dev/");
|
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,
|
blog(LOG_INFO, "Found device '%s' at %s", video_cap.card,
|
||||||
device.array);
|
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);
|
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);
|
closedir(dirp);
|
||||||
dstr_free(&device);
|
dstr_free(&device);
|
||||||
}
|
}
|
||||||
|
@ -566,9 +581,9 @@ static void device_removed(const char *dev, void *vptr)
|
||||||
|
|
||||||
#endif
|
#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();
|
obs_properties_t *props = obs_properties_create();
|
||||||
|
|
||||||
|
@ -595,12 +610,16 @@ static obs_properties_t *v4l2_properties(void *unused)
|
||||||
obs_properties_add_bool(props,
|
obs_properties_add_bool(props,
|
||||||
"system_timing", obs_module_text("UseSystemTiming"));
|
"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(device_list, device_selected);
|
||||||
obs_property_set_modified_callback(input_list, input_selected);
|
obs_property_set_modified_callback(input_list, input_selected);
|
||||||
obs_property_set_modified_callback(format_list, format_selected);
|
obs_property_set_modified_callback(format_list, format_selected);
|
||||||
obs_property_set_modified_callback(resolution_list,
|
obs_property_set_modified_callback(resolution_list,
|
||||||
resolution_selected);
|
resolution_selected);
|
||||||
|
|
||||||
return props;
|
return props;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue