2021-12-30 13:39:12 +00:00
|
|
|
let
|
2022-10-21 18:38:19 +00:00
|
|
|
mkTest = { systemWide ? false , fullVersion ? false }:
|
2021-12-30 13:39:12 +00:00
|
|
|
import ./make-test-python.nix ({ pkgs, lib, ... }:
|
|
|
|
let
|
|
|
|
testFile = pkgs.fetchurl {
|
|
|
|
url =
|
2022-10-21 18:38:19 +00:00
|
|
|
"https://file-examples.com/storage/fe5947fd2362fc197a3c2df/2017/11/file_example_MP3_700KB.mp3";
|
2021-12-30 13:39:12 +00:00
|
|
|
hash = "sha256-+iggJW8s0/LfA/okfXsB550/55Q0Sq3OoIzuBrzOPJQ=";
|
|
|
|
};
|
|
|
|
|
|
|
|
makeTestPlay = key:
|
|
|
|
{ sox, alsa-utils }:
|
|
|
|
pkgs.writeScriptBin key ''
|
|
|
|
set -euxo pipefail
|
|
|
|
${sox}/bin/play ${testFile}
|
|
|
|
${sox}/bin/sox ${testFile} -t wav - | ${alsa-utils}/bin/aplay
|
|
|
|
touch /tmp/${key}_success
|
|
|
|
'';
|
|
|
|
|
|
|
|
testers = builtins.mapAttrs makeTestPlay {
|
|
|
|
testPlay = { inherit (pkgs) sox alsa-utils; };
|
|
|
|
testPlay32 = { inherit (pkgs.pkgsi686Linux) sox alsa-utils; };
|
|
|
|
};
|
|
|
|
in {
|
2022-10-21 18:38:19 +00:00
|
|
|
name = "pulseaudio${lib.optionalString fullVersion "Full"}${lib.optionalString systemWide "-systemWide"}";
|
2021-12-30 13:39:12 +00:00
|
|
|
meta = with pkgs.lib.maintainers; {
|
|
|
|
maintainers = [ synthetica ] ++ pkgs.pulseaudio.meta.maintainers;
|
|
|
|
};
|
|
|
|
|
2022-04-03 18:54:34 +00:00
|
|
|
nodes.machine = { ... }:
|
2021-12-30 13:39:12 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
imports = [ ./common/wayland-cage.nix ];
|
|
|
|
hardware.pulseaudio = {
|
|
|
|
enable = true;
|
|
|
|
support32Bit = true;
|
|
|
|
inherit systemWide;
|
2022-10-21 18:38:19 +00:00
|
|
|
} // lib.optionalAttrs fullVersion {
|
|
|
|
package = pkgs.pulseaudioFull;
|
2021-12-30 13:39:12 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
environment.systemPackages = [ testers.testPlay pkgs.pavucontrol ]
|
|
|
|
++ lib.optional pkgs.stdenv.isx86_64 testers.testPlay32;
|
|
|
|
} // lib.optionalAttrs systemWide {
|
2022-10-21 18:38:19 +00:00
|
|
|
users.users.alice.extraGroups = [ "pulse-access" ];
|
2021-12-30 13:39:12 +00:00
|
|
|
systemd.services.pulseaudio.wantedBy = [ "multi-user.target" ];
|
|
|
|
};
|
|
|
|
|
|
|
|
enableOCR = true;
|
|
|
|
|
|
|
|
testScript = { ... }: ''
|
|
|
|
machine.wait_until_succeeds("pgrep xterm")
|
|
|
|
machine.wait_for_text("alice@machine")
|
|
|
|
|
|
|
|
machine.send_chars("testPlay \n")
|
|
|
|
machine.wait_for_file("/tmp/testPlay_success")
|
|
|
|
${lib.optionalString pkgs.stdenv.isx86_64 ''
|
|
|
|
machine.send_chars("testPlay32 \n")
|
|
|
|
machine.wait_for_file("/tmp/testPlay32_success")
|
|
|
|
''}
|
|
|
|
machine.screenshot("testPlay")
|
|
|
|
|
2022-10-21 18:38:19 +00:00
|
|
|
${lib.optionalString (!systemWide) ''
|
|
|
|
machine.send_chars("pacmd info && touch /tmp/pacmd_success\n")
|
|
|
|
machine.wait_for_file("/tmp/pacmd_success")
|
|
|
|
''}
|
|
|
|
|
2021-12-30 13:39:12 +00:00
|
|
|
# Pavucontrol only loads when Pulseaudio is running. If it isn't, the
|
2022-10-21 18:38:19 +00:00
|
|
|
# text "Dummy Output" (sound device name) will never show.
|
2021-12-30 13:39:12 +00:00
|
|
|
machine.send_chars("pavucontrol\n")
|
2022-10-21 18:38:19 +00:00
|
|
|
machine.wait_for_text("Dummy Output")
|
2021-12-30 13:39:12 +00:00
|
|
|
machine.screenshot("Pavucontrol")
|
|
|
|
'';
|
|
|
|
});
|
|
|
|
in builtins.mapAttrs (key: val: mkTest val) {
|
2022-10-21 18:38:19 +00:00
|
|
|
user = { systemWide = false; fullVersion = false; };
|
|
|
|
system = { systemWide = true; fullVersion = false; };
|
|
|
|
userFull = { systemWide = false; fullVersion = true; };
|
|
|
|
systemFull = { systemWide = true; fullVersion = true; };
|
2021-12-30 13:39:12 +00:00
|
|
|
}
|