diff --git a/desktop/general.nix b/desktop/general.nix index 3903174..81e6370 100644 --- a/desktop/general.nix +++ b/desktop/general.nix @@ -36,6 +36,7 @@ in { default = true; example = false; }; + airplay.enable = (mkEnableOption "AirPlay sink device support") // { default = true; }; }; graphics = { shaderCache = { diff --git a/desktop/multimedia.nix b/desktop/multimedia.nix index d389890..b96419a 100644 --- a/desktop/multimedia.nix +++ b/desktop/multimedia.nix @@ -8,6 +8,8 @@ let noiseFilterStrength = cfg.audio.noise-filter.strength; }; + airplayConfig = pkgs.callPackage ./pipewire/pipewire-airplay.conf.nix {}; + # Multimedia Packages myFFmpeg = let @@ -112,6 +114,9 @@ in { enable = cfg.audio.noise-filter.strength > 0.0; } ); + pipewire-airplay-sink = mkIf cfg.audio.airplay.enable ( + mkPipewireModule { conf = airplayConfig; description = "Pipewire Airplay Sink"; } + ); }; }; diff --git a/desktop/pipewire/pipewire-airplay.conf.nix b/desktop/pipewire/pipewire-airplay.conf.nix new file mode 100644 index 0000000..b36e979 --- /dev/null +++ b/desktop/pipewire/pipewire-airplay.conf.nix @@ -0,0 +1,63 @@ +{ lib +, writeText +}: + +writeText "pipewire-airplay.conf" '' +# Noise canceling source +# +# start with pipewire -c filter-chain/source-rnnoise.conf +# +context.properties = { + log.level = 3 +} + +#context.spa-libs = { +# audio.convert.* = audioconvert/libspa-audioconvert +# support.* = support/libspa-support +#} + +context.modules = [ + { name = libpipewire-module-rtkit + args = { + nice.level = -11 + } + flags = [ ifexists nofail ] + } + { name = libpipewire-module-protocol-native } + { name = libpipewire-module-client-node } + { name = libpipewire-module-adapter } + + { name = libpipewire-raop-discover + args = { + #raop.latency.ms = 1000 + stream.rules = [ + { matches = [ + { raop.ip = "~.*" + #raop.port = 1000 + #raop.name = "" + #raop.hostname = "" + #raop.domain = "" + #raop.device = "" + #raop.transport = "udp" | "tcp" + #raop.encryption.type = "RSA" | "auth_setup" | "none" + #raop.audio.codec = "PCM" | "ALAC" | "AAC" | "AAC-ELD" + #audio.channels = 2 + #audio.format = "S16" | "S24" | "S32" + #audio.rate = 44100 + #device.model = "" + } + ] + actions = { + create-stream = { + #raop.password = "" + stream.props = { + #target.object = "" + media.class = "Audio/Sink" + } + } + } + } + ] # stream.rules + } # args + } +}]''