diff --git a/src/media/video/v4l2/video_device_monitor_impl.cpp b/src/media/video/v4l2/video_device_monitor_impl.cpp index 0a36bb675da709ffdc359b61db43eedcc7e377f4..36ff0354653bbaa7c11c2a04f9cb9fda0ad6c74d 100644 --- a/src/media/video/v4l2/video_device_monitor_impl.cpp +++ b/src/media/video/v4l2/video_device_monitor_impl.cpp @@ -82,33 +82,11 @@ private: }; std::string -getDeviceString(udev* udev, const std::string& dev_path) +getDeviceString(struct udev_device* udev_device) { - std::string unique_device_string; - struct stat statbuf; - if (stat(dev_path.c_str(), &statbuf) < 0) { - return {}; - } - auto type = S_ISBLK(statbuf.st_mode) ? 'b' : S_ISCHR(statbuf.st_mode) ? 'c' : 0; - - auto opened_dev = udev_device_new_from_devnum(udev, type, statbuf.st_rdev); - auto dev = opened_dev; - - while (dev != nullptr) { - auto serial = udev_device_get_sysattr_value(dev, "serial"); - if (nullptr == serial) { - dev = udev_device_get_parent(dev); - } else { - unique_device_string += udev_device_get_sysattr_value(dev, "idVendor"); - unique_device_string += udev_device_get_sysattr_value(dev, "idProduct"); - unique_device_string += serial; - break; - } - } - if (opened_dev) { - udev_device_unref(opened_dev); - } - return unique_device_string; + if (auto serial = udev_device_get_property_value(udev_device, "ID_SERIAL")) + return serial; + throw std::invalid_argument("No ID_SERIAL detected"); } static int @@ -167,14 +145,14 @@ VideoDeviceMonitorImpl::VideoDeviceMonitorImpl(VideoDeviceMonitor* monitor) // udev_device_get_devnode will fail continue; } - auto unique_name = getDeviceString(udev_, path); - JAMI_DBG("udev: adding device with id %s", unique_name.c_str()); - std::map<std::string, std::string> info = {{"devPath", path}}; - std::vector<std::map<std::string, std::string>> devInfo = {info}; try { + auto unique_name = getDeviceString(dev); + JAMI_DBG("udev: adding device with id %s", unique_name.c_str()); + std::map<std::string, std::string> info = {{"devPath", path}}; + std::vector<std::map<std::string, std::string>> devInfo = {info}; monitor_->addDevice(unique_name, &devInfo); currentPathToId_.emplace(path, unique_name); - } catch (const std::runtime_error& e) { + } catch (const std::exception& e) { JAMI_ERR("%s", e.what()); } } @@ -253,30 +231,30 @@ VideoDeviceMonitorImpl::run() // udev_device_get_devnode will fail break; } - auto unique_name = getDeviceString(udev_, path); - - const char* action = udev_device_get_action(dev); - if (!strcmp(action, "add")) { - JAMI_DBG("udev: adding device with id %s", unique_name.c_str()); - std::map<std::string, std::string> info = {{"devPath", path}}; - std::vector<std::map<std::string, std::string>> devInfo = {info}; - try { + try { + auto unique_name = getDeviceString(dev); + + const char* action = udev_device_get_action(dev); + if (!strcmp(action, "add")) { + JAMI_DBG("udev: adding device with id %s", unique_name.c_str()); + std::map<std::string, std::string> info = {{"devPath", path}}; + std::vector<std::map<std::string, std::string>> devInfo = {info}; monitor_->addDevice(unique_name, &devInfo); currentPathToId_.emplace(path, unique_name); - } catch (const std::runtime_error& e) { - JAMI_ERR("%s", e.what()); - } - } else if (!strcmp(action, "remove")) { - auto it = currentPathToId_.find(path); - if (it != currentPathToId_.end()) { - JAMI_DBG("udev: removing %s", it->second.c_str()); - monitor_->removeDevice(it->second); - currentPathToId_.erase(it); - } else { - // In case of fallback - JAMI_DBG("udev: removing %s", path); - monitor_->removeDevice(path); + } else if (!strcmp(action, "remove")) { + auto it = currentPathToId_.find(path); + if (it != currentPathToId_.end()) { + JAMI_DBG("udev: removing %s", it->second.c_str()); + monitor_->removeDevice(it->second); + currentPathToId_.erase(it); + } else { + // In case of fallback + JAMI_DBG("udev: removing %s", path); + monitor_->removeDevice(path); + } } + } catch (const std::exception& e) { + JAMI_ERR("%s", e.what()); } } udev_device_unref(dev);