nixos-lib/desktop/multimedia.nix

123 lines
3.4 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.aviallon.desktop;
generalCfg = config.aviallon.general;
filterConfig = pkgs.callPackage ./pipewire/pipewire-noise-filter.conf.nix {
noiseFilterStrength = cfg.audio.noise-filter.strength;
};
airplayConfig = pkgs.callPackage ./pipewire/pipewire-airplay.conf.nix {};
# Multimedia Packages
myFFmpeg = let
withUnfree = pkgs.unstable.ffmpeg-full.override {
withUnfree = true;
withTensorflow = !pkgs.unstable.libtensorflow.meta.broken;
};
in withUnfree;
myFFmpeg_opt = config.aviallon.optimizations.optimizePkg { lto = false; } myFFmpeg;
#ffmpeg_4 = config.aviallon.optimizations.optimizePkg { } pkgs.ffmpeg_4;
#obs-studio = pkgs.obs-studio.override { inherit ffmpeg_4; };
#myWrapOBS = pkgs.wrapOBS.override { inherit obs-studio; };
myWrapOBS = pkgs.wrapOBS;
in {
config = mkIf (cfg.enable && !generalCfg.minimal) {
environment.systemPackages = with pkgs; [
myFFmpeg_opt
krita
(myWrapOBS { plugins = with obs-studio-plugins; [
obs-pipewire-audio-capture
]; })
scribus
yt-dlp
jellyfin-media-player
jamesdsp # Audio post-processing
];
nixpkgs.overlays = [(final: prev: {
myFFmpeg = myFFmpeg_opt;
})];
# Enable sound.
sound.enable = mkOverride 40 false;
hardware.pulseaudio.enable = mkOverride 40 false;
services.pipewire = {
enable = true;
pulse.enable = true;
jack.enable = true;
alsa.enable = true;
alsa.support32Bit = mkDefault true;
wireplumber.enable = true;
};
environment.etc = {
"wireplumber/bluetooth.lua.d/51-bluez-config.lua".text = ''
bluez_monitor.properties = {
["bluez5.enable-sbc-xq"] = true,
["bluez5.enable-msbc"] = true,
["bluez5.enable-hw-volume"] = true,
["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]"
}
'';
"pipewire/pipewire-pulse.conf.d/combined-outputs.json".text = ''
{
"context.exec": [
{
"args": "load-module module-combine-sink sink_name=\"Sorties combinées\"",
"path": "pactl"
}
]
}
'';
};
security.rtkit.enable = true; # Real-time support for pipewire
aviallon.programs.allowUnfreeList = [
"ffmpeg-full" # Because of unfree codecs
];
# Hardware-agnostic audio denoising
systemd.user.services = let
mkPipewireModule = {conf, description}: {
unitConfig = {
Slice = "session.slice";
};
serviceConfig = {
ExecStart = [
"${pkgs.pipewire}/bin/pipewire -c ${conf}"
];
Type = "simple";
Restart = "on-failure";
};
bindsTo = [ "pipewire.service" ];
after = [ "pipewire.service" ];
environment = {
PIPEWIRE_DEBUG = "3";
};
wantedBy = [ "pipewire.service" ];
inherit description;
};
in {
pipewire-noise-filter = mkIf cfg.audio.noise-filter.enable (
(mkPipewireModule { conf = filterConfig; description = "Pipewire Noise Filter"; }) //
{
enable = cfg.audio.noise-filter.strength > 0.0;
}
);
pipewire-airplay-sink = mkIf cfg.audio.airplay.enable (
mkPipewireModule { conf = airplayConfig; description = "Pipewire Airplay Sink"; }
);
};
};
}