{ config, lib, pkgs, ... }: with lib; let cfg = config.services.uvcvideo; uvcdynctrl-udev-rules = packages: pkgs.callPackage ./uvcdynctrl-udev-rules.nix { drivers = packages; udevDebug = false; }; in { options = { services.uvcvideo.dynctrl = { enable = mkOption { type = types.bool; default = false; description = '' Whether to enable uvcvideo dynamic controls. Note that enabling this brings the uvcdynctrl tool into your environment and register all dynamic controls from specified packages to the uvcvideo driver. ''; }; packages = mkOption { type = types.listOf types.path; example = literalExample "[ pkgs.tiscamera ]"; description = '' List of packages containing uvcvideo dynamic controls rules. All files found in pkg/share/uvcdynctrl/data will be included. Note that these will serve as input to the libwebcam package which through its own udev rule will register the dynamic controls from specified packages to the uvcvideo driver. ''; apply = map getBin; }; }; }; config = mkIf cfg.dynctrl.enable { services.udev.packages = [ (uvcdynctrl-udev-rules cfg.dynctrl.packages) ]; environment.systemPackages = [ pkgs.libwebcam ]; }; }