forked from CCCHH/nix-infra
Make AirPlay 2 work for Shairport Sync on Audio host
- use nqptp - use Shairport Sync and nqptp versions, which work - disable IPv6, since Shairport Sync doesn't work with it for some reason - configure firewall for AirPlay 2 - use correct subnet
This commit is contained in:
parent
eaedf34aa2
commit
c72b30aa6a
|
@ -1,19 +1,21 @@
|
||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
networking.interfaces.net0 = {
|
networking = {
|
||||||
|
interfaces.net0 = {
|
||||||
ipv4.addresses = [
|
ipv4.addresses = [
|
||||||
{
|
{
|
||||||
address = "10.31.210.10";
|
address = "10.31.210.10";
|
||||||
prefixLength = 25;
|
prefixLength = 23;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
ipv6.addresses = [
|
};
|
||||||
{
|
defaultGateway = "10.31.210.1";
|
||||||
address = "2a07:c480:0:1d2:0000:0000:1000:000a";
|
nameservers = [
|
||||||
prefixLength = 64;
|
"10.31.210.1"
|
||||||
}
|
|
||||||
];
|
];
|
||||||
|
# Disable IPv6, since Shairport-Sync doesn't work with IPv6. Unclear why.
|
||||||
|
enableIPv6 = false;
|
||||||
};
|
};
|
||||||
systemd.network.links."10-net0" = {
|
systemd.network.links."10-net0" = {
|
||||||
matchConfig.MACAddress = "1E:EF:2D:92:81:DA";
|
matchConfig.MACAddress = "1E:EF:2D:92:81:DA";
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
{ ... }:
|
# Sources for this configuration:
|
||||||
|
# - https://github.com/mikebrady/shairport-sync/blob/f5c4b51da827a7f8d9a72a1b6f986807aba47bfc/AIRPLAY2.md
|
||||||
|
# - https://github.com/mikebrady/nqptp
|
||||||
|
# - https://github.com/mikebrady/nqptp/blob/050a8c2de9f3e1f4859abf9b36d2f18afd4c34d7/nqptp.service.in
|
||||||
|
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
services.shairport-sync = {
|
services.shairport-sync = {
|
||||||
enable = true;
|
enable = true;
|
||||||
openFirewall = true;
|
arguments = "-o alsa -- -d plughw:1,0 -r 48000";
|
||||||
arguments = "-v -o alsa -- -d plughw:1,0 -r 48000";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.etc.shairport-sync-config = {
|
environment.etc.shairport-sync-config = {
|
||||||
|
@ -11,4 +16,50 @@
|
||||||
source = ./shairport-sync.conf;
|
source = ./shairport-sync.conf;
|
||||||
target = "shairport-sync.conf";
|
target = "shairport-sync.conf";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
users.users.nqptp = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = "nqptp";
|
||||||
|
};
|
||||||
|
users.groups.nqptp = { };
|
||||||
|
|
||||||
|
systemd.services.nqptp = {
|
||||||
|
enable = true;
|
||||||
|
description = "NQPTP -- Not Quite PTP";
|
||||||
|
unitConfig = {
|
||||||
|
Wants = [ "network-online.target" ];
|
||||||
|
After = [ "network.target" "network-online.target" ];
|
||||||
|
Before = [ "shairport-sync.service" ];
|
||||||
|
};
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = "${pkgs.nqptp}/bin/nqptp";
|
||||||
|
User = "nqptp";
|
||||||
|
Group = "nqptp";
|
||||||
|
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
|
||||||
|
};
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# See here for docs:
|
||||||
|
# https://github.com/mikebrady/shairport-sync/blob/4ca5a15de2d53c69e6c3c23b0440c27978bb91df/TROUBLESHOOTING.md#ufw-firewall-blocking-ports-commonly-includes-raspberry-pi
|
||||||
|
# These docs seem like they also include the ports for AirPlay 1. Since we're
|
||||||
|
# doing just AirPlay 2, we can have a more restrictive firewall than
|
||||||
|
# documented there.
|
||||||
|
# This more restritive firewall also matches with a packet capture I did.
|
||||||
|
networking.firewall = {
|
||||||
|
allowedTCPPorts = [ 7000 ];
|
||||||
|
allowedUDPPorts = [ 319 320 5353 ];
|
||||||
|
allowedTCPPortRanges = [
|
||||||
|
{
|
||||||
|
from = 32768;
|
||||||
|
to = 60999;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
allowedUDPPortRanges = [
|
||||||
|
{
|
||||||
|
from = 32768;
|
||||||
|
to = 60999;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
34
flake.nix
34
flake.nix
|
@ -18,12 +18,38 @@
|
||||||
|
|
||||||
outputs = { nixpkgs, nixpkgs-unstable, nixos-generators, ... }:
|
outputs = { nixpkgs, nixpkgs-unstable, nixos-generators, ... }:
|
||||||
let
|
let
|
||||||
# Shairport Sync with metadata and MQTT support.
|
# Shairport Sync 4.3.1 (with nqptp 1.2.4) with metadata, MQTT and AirPlay 2 support.
|
||||||
shairportSyncExtendedNixpkgsUnstableOverlay = final: prev: {
|
shairportSync431ExtendedNixpkgsUnstableOverlay = final: prev: {
|
||||||
shairport-sync = (prev.shairport-sync.override { enableMetadata = true; }).overrideAttrs (finalAttr: previousAttr: {
|
shairport-sync = (prev.shairport-sync.override { enableMetadata = true; enableAirplay2 = true; }).overrideAttrs (finalAttr: previousAttr: {
|
||||||
# See: https://github.com/mikebrady/shairport-sync/blob/e78a88b64adfe7b5f88fd6faedf55c57445bb240/CONFIGURATION%20FLAGS.md
|
# See: https://github.com/mikebrady/shairport-sync/blob/e78a88b64adfe7b5f88fd6faedf55c57445bb240/CONFIGURATION%20FLAGS.md
|
||||||
configureFlags = previousAttr.configureFlags ++ [ "--with-mqtt-client" ];
|
configureFlags = previousAttr.configureFlags ++ [ "--with-mqtt-client" ];
|
||||||
buildInputs = previousAttr.buildInputs ++ [ final.mosquitto ];
|
buildInputs = previousAttr.buildInputs ++ [ final.mosquitto ];
|
||||||
|
# Use specific Shairport Sync and nqptp versions, since with those the
|
||||||
|
# following error doesn't happen:
|
||||||
|
# fatal error: The nqptp service on this system, which is required for
|
||||||
|
# Shairport Sync to operate, does not seem to be initialised.
|
||||||
|
src = final.fetchFromGitHub {
|
||||||
|
owner = "mikebrady";
|
||||||
|
repo = finalAttr.pname;
|
||||||
|
rev = "4.3.1";
|
||||||
|
hash = "sha256-Yj0SKMKACj2B/ADPkUzO4EvaYZX39erKmjaTsr5UN0s=";
|
||||||
|
};
|
||||||
|
});
|
||||||
|
nqptp = prev.nqptp.overrideAttrs (finalAttr: previousAttr: {
|
||||||
|
# See Shairport Sync version note.
|
||||||
|
src = final.fetchFromGitHub {
|
||||||
|
owner = "mikebrady";
|
||||||
|
repo = finalAttr.pname;
|
||||||
|
rev = "1.2.4";
|
||||||
|
hash = "sha256-roTNcr3v2kzE6vQ5plAVtlw1+2yJplltOYsGGibtoZo=";
|
||||||
|
};
|
||||||
|
# Custom install phase to avoid setcap.
|
||||||
|
# See:
|
||||||
|
# https://github.com/mikebrady/nqptp/blob/1.2.4/Makefile.am#L23
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp nqptp $out/bin/
|
||||||
|
'';
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
|
@ -31,7 +57,7 @@
|
||||||
meta = {
|
meta = {
|
||||||
nixpkgs = nixpkgs.legacyPackages."x86_64-linux";
|
nixpkgs = nixpkgs.legacyPackages."x86_64-linux";
|
||||||
nodeNixpkgs = {
|
nodeNixpkgs = {
|
||||||
audio = nixpkgs-unstable.legacyPackages."x86_64-linux".extend shairportSyncExtendedNixpkgsUnstableOverlay;
|
audio = nixpkgs-unstable.legacyPackages."x86_64-linux".extend shairportSync431ExtendedNixpkgsUnstableOverlay;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue