This commit is contained in:
ChaotiCryptidz 2022-01-26 23:05:24 +00:00
parent c696c80012
commit 9a3493bf0c
11 changed files with 179 additions and 26 deletions

View file

@ -1,21 +1,15 @@
{ ... }:
{ pkgs, ... }:
let
sink_name = "rtp-raspberry";
description = "Raspberry Output";
sink_name = "roc-raspberry";
description = "Raspberry ROC Output";
ip_addr = "100.118.202.64";
#ip_addr = "100.115.10.34";
in {
hardware.pulseaudio = {
extraConfig = ''
load-module module-null-sink sink_name=${sink_name} sink_properties="device.description='${description}'"
load-module module-rtp-send source=${sink_name}.monitor destination_ip=${ip_addr}
'';
};
services.mpd.extraConfig = ''
audio_output {
type "pulse"
type "pipe"
name "${description}"
target "${sink_name}"
server "127.0.0.1"
command "${pkgs.roc-send-pcm}/bin/roc-send-pcm s16le 44.1k 2 ${ip_addr}"
}
'';
}

View file

@ -1,5 +1,5 @@
{ pkgs, lib, tree, ... }: {
#imports = [ ./mpd-broadcast/broadcast.nix ];
imports = [ ./mpd-broadcast/broadcast.nix ];
environment.systemPackages = with pkgs; [ mpc_cli ];

View file

@ -14,7 +14,10 @@
profiles.laptop
#profiles.connectivity.bluetooth
# Bluetooth
profiles.connectivity.bluetooth
profiles.sound.pulseaudio.pulse-bluetooth
profiles.connectivity.network_manager
profiles.connectivity.ios

View file

@ -1,10 +1,7 @@
{ pkgs, tree, ... }: {
imports = [ ./mpd-music-sync.nix ] ++ (with tree; [
profiles.sound.pulseaudio.pulse-recv-native-localhost
profiles.sound.pulseaudio.pulse-recv-rtp
]);
imports = [ ./mpd-music-sync.nix ];
environment.systemPackages = with pkgs; [ mpc_cli roc-toolkit ];
environment.systemPackages = with pkgs; [ mpc_cli mpv roc-toolkit-patched ];
systemd.tmpfiles.rules = [
"d /var/lib/mpd 0755 mpd mpd -"

View file

@ -34,8 +34,16 @@
networking.useDHCP = true;
networking.wireless = {
enable = true;
userControlled.enable = true;
environmentFile = "/secrets/wifi-env";
networks.BT-JGA898.psk = "@PSK_HOME@";
networks.BT-JGA898 = {
priority = 10;
psk = "@PSK_HOME@";
};
networks."Kitteh iPhone" = {
priority = 100;
psk = "@PSK_HOTSPOT@";
};
};
sdImage.compressImage = lib.mkForce false;

View file

@ -1,4 +1,23 @@
{ tree, ... }: {
{ tree, pkgs, ... }:
let
process-media-controls = pkgs.writeText "process-media-controls" ''
import asyncio
import os
from evdev import InputDevice, categorize, ecodes
dev = InputDevice('/dev/input/event0')
async def scanner(dev):
async for ev in dev.async_read_loop():
if ev.type == ecodes.EV_KEY:
if ev.code in [ecodes.KEY_PLAYCD, ecodes.KEY_PAUSECD] and ev.value == 0:
print("Play/Pause Pressed")
os.system("pactl set-sink-mute @DEFAULT_SINK@ toggle")
loop = asyncio.get_event_loop()
loop.run_until_complete(scanner(dev))
'';
in {
imports = with tree; [
profiles.connectivity.bluetooth
@ -6,13 +25,50 @@
profiles.sound.pulseaudio.pulse-systemwide
profiles.sound.pulseaudio.pulse-bluetooth
profiles.sound.pulseaudio.pulse-recv-native-localhost
profiles.sound.pulseaudio.pulse-recv-rtp
];
systemd = {
services.roc-recv = {
requires = [ "network.target" "pulseaudio.service" ];
after = [ "network.target" "pulseaudio.service" ];
wantedBy = [ "multi-user.target" ];
script = ''
PULSE_SERVER=127.0.0.1 ${pkgs.roc-toolkit-patched}/bin/roc-recv --source "rtp:0.0.0.0:10001"
'';
serviceConfig = { Restart = "always"; };
};
services.process-media-controls = {
requires = [ "network.target" "pulseaudio.service" ];
after = [ "network.target" "pulseaudio.service" ];
wantedBy = [ "multi-user.target" ];
path = [ pkgs.pulseaudio ];
script = let
python = pkgs.python39.withPackages
(ps: with ps; [ pkgs.python39Packages.evdev ]);
in ''
(${python.interpreter} ${process-media-controls}) || true
'';
serviceConfig = {
Restart = "always";
StartLimitAction = "none";
};
};
timers.bt-autoconnect = {
wantedBy = [ "timers.target" ];
partOf = [ "bt-autoconnect.service" ];
timerConfig.OnCalendar = "minutely";
};
services.bt-autoconnect = {
serviceConfig.Type = "oneshot";
script = ''
${pkgs.bluez}/bin/bluetoothctl connect 3E:39:E7:B2:86:29 || true
'';
};
};
hardware.pulseaudio.extraConfig = ''
load-module module-bluetooth-policy
load-module module-bluetooth-discover
set-default-sink bluez_card.3E_39_E7_B2_86_29
'';
}
p

View file

@ -0,0 +1,15 @@
import asyncio
import os
from evdev import InputDevice, categorize, ecodes
dev = InputDevice('/dev/input/event0')
async def scanner(dev):
async for ev in dev.async_read_loop():
if ev.type == ecodes.EV_KEY:
if ev.code in [ecodes.KEY_PLAYCD, ecodes.KEY_PAUSECD] and ev.value == 0:
print("Play/Pause Pressed")
os.system("pactl set-sink-mute @DEFAULT_SINK@ toggle")
loop = asyncio.get_event_loop()
loop.run_until_complete(scanner(dev))

View file

@ -10,4 +10,7 @@ final: prev: {
multimc = prev.polymc.override {
msaClientID = "499546d9-bbfe-4b9b-a086-eb3d75afb78f";
};
roc-toolkit-patched = final.callPackage ./roc-toolkit-patched { };
roc-send-pcm = final.callPackage ./roc-send-pcm { };
}

View file

@ -0,0 +1,9 @@
{ pkgs, ... }:
pkgs.writeShellScriptBin "roc-send-pcm" ''
FORMAT=$1
RATE=$2
CHANNELS=$3
IP_ADDR=$4
${pkgs.ffmpeg}/bin/ffmpeg -f $FORMAT -ar $RATE -ac $CHANNELS -i /dev/stdin -f wav -y /dev/stdout | ${pkgs.roc-toolkit-patched}/bin/roc-send --source "rtp:$IP_ADDR:10001" --driver wav /dev/stdin
''

View file

@ -0,0 +1,68 @@
{ stdenv,
lib,
fetchFromGitHub,
sconsPackages,
ragel,
gengetopt,
pkg-config,
libuv,
openfecSupport ? true,
openfec,
libunwindSupport ? true,
libunwind,
pulseaudioSupport ? true,
libpulseaudio,
soxSupport ? true,
sox
}:
stdenv.mkDerivation rec {
pname = "roc-toolkit";
version = "0.1.5";
src = fetchFromGitHub {
owner = "roc-streaming";
repo = "roc-toolkit";
rev = "v${version}";
sha256 = "sha256:1pld340zfch4p3qaf5anrspq7vmxrgf9ddsdsq92pk49axaaz19w";
};
nativeBuildInputs = [
sconsPackages.scons_3_0_1
ragel
gengetopt
pkg-config
];
buildInputs = [
libuv
libunwind
openfec
libpulseaudio
sox
];
sconsFlags =
[ "--build=${stdenv.buildPlatform.config}"
"--host=${stdenv.hostPlatform.config}"
"--prefix=${placeholder "out"}"
"--disable-tests" ] ++
lib.optional (!soxSupport) "--disable-sox" ++
lib.optional (!libunwindSupport) "--disable-libunwind" ++
lib.optional (!pulseaudioSupport) "--disable-pulseaudio" ++
(if (!openfecSupport)
then ["--disable-openfec"]
else [ "--with-libraries=${openfec}/lib"
"--with-openfec-includes=${openfec.dev}/include" ]);
prePatch = lib.optionalString stdenv.isAarch64
"sed -i 's/c++98/c++11/g' SConstruct";
meta = with lib; {
description = "Roc is a toolkit for real-time audio streaming over the network";
homepage = "https://github.com/roc-streaming/roc-toolkit";
license = licenses.mpl20;
maintainers = with maintainers; [ bgamari ];
platforms = platforms.unix;
};
}

View file

@ -1,7 +1,7 @@
{ ... }: {
hardware.pulseaudio = {
extraConfig = ''
load-module module-rtp-recv latency_msec=500 sap_address=0.0.0.0
load-module module-rtp-recv latency_msec=5000 sap_address=0.0.0.0
'';
};
}