From 35fa72ba73cf1913cf6314092997bcfae3e2a4de Mon Sep 17 00:00:00 2001 From: Maxim Devaev Date: Fri, 17 Jul 2026 19:40:39 +0300 Subject: [PATCH] janus: webcam: check the device state --- janus/src/config.c | 2 ++ janus/src/config.h | 1 + janus/src/plugin.c | 15 +++++++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/janus/src/config.c b/janus/src/config.c index 9fea816..75cdd20 100644 --- a/janus/src/config.c +++ b/janus/src/config.c @@ -77,6 +77,7 @@ us_config_s *us_config_init(const char *config_dir_path) { config->vplay_sink_name = _get_value(jcfg, "vplay", "sink"); config->vplay_sink_mode = _get_uint(jcfg, "vplay", "sink_mode", 0660, 8); + config->vplay_dev_path = _get_value(jcfg, "vplay", "device"); goto ok; @@ -95,6 +96,7 @@ void us_config_destroy(us_config_s *config) { US_DELETE(config->tc358743_dev_path, free); US_DELETE(config->aplay_dev_name, free); US_DELETE(config->vplay_sink_name, free); + US_DELETE(config->vplay_dev_path, free); free(config); } diff --git a/janus/src/config.h b/janus/src/config.h index 59a116d..2682f4a 100644 --- a/janus/src/config.h +++ b/janus/src/config.h @@ -37,6 +37,7 @@ typedef struct { char *vplay_sink_name; uint vplay_sink_mode; + char *vplay_dev_path; } us_config_s; diff --git a/janus/src/plugin.c b/janus/src/plugin.c index 56e7898..9169033 100644 --- a/janus/src/plugin.c +++ b/janus/src/plugin.c @@ -386,6 +386,7 @@ static void *_aplay_thread(void *arg) { return NULL; } +static bool _is_camera_enabled(void); static void _camera_set_active(uint width, uint height, uint fps); static void _camera_set_inactive(); @@ -615,6 +616,16 @@ static void _push_camera_event(us_janus_client_s *client, bool requested) { json_decref(event); } +static bool _is_camera_enabled(void) { + bool enabled = us_str_is_ok(_g_config->vplay_sink_name); + if (enabled && us_str_is_ok(_g_config->vplay_dev_path)) { + if (access(_g_config->vplay_dev_path, F_OK) != 0) { + enabled = false; + } + } + return enabled; +} + static void _camera_set_active(uint width, uint height, uint fps) { _LOCK_VPLAY; US_A(!_g_camera.active); @@ -787,7 +798,7 @@ static struct janus_plugin_result *_plugin_handle_message( } READ_BOOL(with_acap, "audio", us_au_probe(_g_config->acap_dev_name)); READ_BOOL(with_aplay, "mic", us_au_probe(_g_config->aplay_dev_name)); - READ_BOOL(with_vplay, "camera", us_str_is_ok(_g_config->vplay_sink_name)); + READ_BOOL(with_vplay, "camera", _is_camera_enabled()); # undef READ_BOOL { json_t *const obj = json_object_get(params, "orientation"); @@ -858,7 +869,7 @@ static struct janus_plugin_result *_plugin_handle_message( "audio", us_au_probe(_g_config->acap_dev_name), "mic", us_au_probe(_g_config->aplay_dev_name), "camera", - "enabled", us_str_is_ok(_g_config->vplay_sink_name), + "enabled", _is_camera_enabled(), "request", camera_req, "ice", "url", (ice_url != NULL ? ice_url : _g_default_ice_url)