about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/audio
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2022-12-06 19:57:55 +0000
committerAlyssa Ross <hi@alyssa.is>2023-02-08 13:48:30 +0000
commitbf3aadfdd39aa197e18bade671fab6726349ffa4 (patch)
tree698567af766ed441d757b57a7b21e68d4a342a2b /nixpkgs/pkgs/tools/audio
parentf4afc5a01d9539ce09e47494e679c51f80723d07 (diff)
parent99665eb45f58d959d2cb9e49ddb960c79d596f33 (diff)
downloadnixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.gz
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.bz2
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.lz
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.xz
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.tar.zst
nixlib-bf3aadfdd39aa197e18bade671fab6726349ffa4.zip
Merge commit '99665eb45f58d959d2cb9e49ddb960c79d596f33'
Diffstat (limited to 'nixpkgs/pkgs/tools/audio')
-rw-r--r--nixpkgs/pkgs/tools/audio/abcmidi/default.nix4
-rw-r--r--nixpkgs/pkgs/tools/audio/asap/default.nix53
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/badfiles-plugin-nix-paths.patch21
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/builtin-plugins.nix95
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/common.nix176
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/convert-plugin-ffmpeg-path.patch34
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/default.nix317
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/imagemagick-nix-path.patch20
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/patches/bash-completion-always-print.patch (renamed from nixpkgs/pkgs/tools/audio/beets/bash-completion-always-print.patch)0
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/plugins/alternatives.nix6
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/plugins/copyartifacts.nix18
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/plugins/extrafiles.nix14
-rw-r--r--nixpkgs/pkgs/tools/audio/beets/replaygain-default-ffmpeg.patch26
-rw-r--r--nixpkgs/pkgs/tools/audio/botamusique/default.nix2
-rw-r--r--nixpkgs/pkgs/tools/audio/darkice/default.nix2
-rw-r--r--nixpkgs/pkgs/tools/audio/dsp/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/audio/fmtoy/default.nix72
-rw-r--r--nixpkgs/pkgs/tools/audio/glyr/default.nix3
-rw-r--r--nixpkgs/pkgs/tools/audio/headset-charge-indicator/default.nix63
-rw-r--r--nixpkgs/pkgs/tools/audio/headsetcontrol/default.nix4
-rw-r--r--nixpkgs/pkgs/tools/audio/liquidsoap/full.nix121
-rw-r--r--nixpkgs/pkgs/tools/audio/mictray/default.nix53
-rw-r--r--nixpkgs/pkgs/tools/audio/mpd-discord-rpc/default.nix16
-rw-r--r--nixpkgs/pkgs/tools/audio/mpdcron/default.nix3
-rw-r--r--nixpkgs/pkgs/tools/audio/mpdris2/default.nix6
-rw-r--r--nixpkgs/pkgs/tools/audio/mpdsync/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/audio/mpris-scrobbler/default.nix4
-rw-r--r--nixpkgs/pkgs/tools/audio/nanotts/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/audio/pa-applet/default.nix4
-rw-r--r--nixpkgs/pkgs/tools/audio/spotdl/default.nix9
-rw-r--r--nixpkgs/pkgs/tools/audio/stt/default.nix1
-rw-r--r--nixpkgs/pkgs/tools/audio/tts/default.nix12
-rw-r--r--nixpkgs/pkgs/tools/audio/vgmtools/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/audio/volumeicon/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/audio/yabridge/default.nix71
-rw-r--r--nixpkgs/pkgs/tools/audio/yabridge/hardcode-dependencies.patch54
-rw-r--r--nixpkgs/pkgs/tools/audio/yabridge/libyabridge-from-nix-profiles.patch71
-rw-r--r--nixpkgs/pkgs/tools/audio/yabridgectl/chainloader-from-nix-profiles.patch (renamed from nixpkgs/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch)26
-rw-r--r--nixpkgs/pkgs/tools/audio/yabridgectl/default.nix17
-rw-r--r--nixpkgs/pkgs/tools/audio/yabridgectl/remove-dependency-verification.patch18
40 files changed, 1023 insertions, 583 deletions
diff --git a/nixpkgs/pkgs/tools/audio/abcmidi/default.nix b/nixpkgs/pkgs/tools/audio/abcmidi/default.nix
index 17f4d8848481..b5b484159c36 100644
--- a/nixpkgs/pkgs/tools/audio/abcmidi/default.nix
+++ b/nixpkgs/pkgs/tools/audio/abcmidi/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "abcMIDI";
-  version = "2022.02.21";
+  version = "2022.08.01";
 
   src = fetchzip {
     url = "https://ifdo.ca/~seymour/runabc/${pname}-${version}.zip";
-    hash = "sha256-oGGtJhVugqTvXD34Q2f8L5qoYoyyT5JjuBhqh4VYAAo=";
+    hash = "sha256-qFk/Rij7P17ZlJFjsrW8snp2anCGjqxfytzopIyHLL0=";
   };
 
   meta = with lib; {
diff --git a/nixpkgs/pkgs/tools/audio/asap/default.nix b/nixpkgs/pkgs/tools/audio/asap/default.nix
new file mode 100644
index 000000000000..5ce3a80bd737
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/asap/default.nix
@@ -0,0 +1,53 @@
+{ stdenv
+, lib
+, fetchzip
+, SDL
+}:
+
+stdenv.mkDerivation rec {
+  pname = "asap";
+  version = "5.2.0";
+
+  src = fetchzip {
+    url = "mirror://sourceforge/project/asap/asap/${version}/asap-${version}.tar.gz";
+    sha256 = "1riwfds5ipgh19i3ibsyqhxlh70xix9452y4wqih9xdkixmxqbqm";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  buildInputs = [
+    SDL
+  ];
+
+  enableParallelBuilding = true;
+
+  buildFlags = [
+    "CC=${stdenv.cc.targetPrefix}cc"
+    # Only targets that don't need cito transpiler
+    "asapconv"
+    "asap-sdl"
+    "lib"
+  ];
+
+  installFlags = [
+    "prefix=${placeholder "dev"}"
+    "bindir=${placeholder "out"}/bin"
+    "install-asapconv"
+    "install-sdl"
+    "install-lib"
+  ];
+
+  meta = with lib; {
+    homepage = "http://asap.sourceforge.net/";
+    mainProgram = "asap-sdl";
+    description = "Another Slight Atari Player";
+    longDescription = ''
+      ASAP (Another Slight Atari Player) plays and converts 8-bit Atari POKEY
+      music (*.sap, *.cmc, *.mpt, *.rmt, *.tmc, ...) on modern computers and
+      mobile devices.
+    '';
+    maintainers = with maintainers; [ OPNA2608 ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/beets/badfiles-plugin-nix-paths.patch b/nixpkgs/pkgs/tools/audio/beets/badfiles-plugin-nix-paths.patch
deleted file mode 100644
index 6956183344c4..000000000000
--- a/nixpkgs/pkgs/tools/audio/beets/badfiles-plugin-nix-paths.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff --git i/beetsplug/badfiles.py w/beetsplug/badfiles.py
-index 36b45de3..5208b696 100644
---- i/beetsplug/badfiles.py
-+++ w/beetsplug/badfiles.py
-@@ -71,14 +71,14 @@ class BadFiles(BeetsPlugin):
-         return status, errors, [line for line in output.split("\n") if line]
- 
-     def check_mp3val(self, path):
--        status, errors, output = self.run_command(["mp3val", path])
-+        status, errors, output = self.run_command(["@mp3val@/bin/mp3val", path])
-         if status == 0:
-             output = [line for line in output if line.startswith("WARNING:")]
-             errors = len(output)
-         return status, errors, output
- 
-     def check_flac(self, path):
--        return self.run_command(["flac", "-wst", path])
-+        return self.run_command(["@flac@/bin/flac", "-wst", path])
- 
-     def check_custom(self, command):
-         def checker(path):
diff --git a/nixpkgs/pkgs/tools/audio/beets/builtin-plugins.nix b/nixpkgs/pkgs/tools/audio/beets/builtin-plugins.nix
new file mode 100644
index 000000000000..1fef39ef72f5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/beets/builtin-plugins.nix
@@ -0,0 +1,95 @@
+{ stdenv
+, aacgain
+, essentia-extractor
+, ffmpeg
+, flac
+, imagemagick
+, keyfinder-cli
+, lib
+, mp3gain
+, mp3val
+, python3Packages
+, ...
+}: {
+  absubmit = {
+    enable = lib.elem stdenv.hostPlatform.system essentia-extractor.meta.platforms;
+    wrapperBins = [ essentia-extractor ];
+  };
+  acousticbrainz.propagatedBuildInputs = [ python3Packages.requests ];
+  albumtypes = { };
+  aura.propagatedBuildInputs = with python3Packages; [ flask pillow ];
+  badfiles.wrapperBins = [ mp3val flac ];
+  bareasc = { };
+  beatport.propagatedBuildInputs = [ python3Packages.requests-oauthlib ];
+  bench = { };
+  bpd = { };
+  bpm = { };
+  bpsync = { };
+  bucket = { };
+  chroma.propagatedBuildInputs = [ python3Packages.pyacoustid ];
+  convert.wrapperBins = [ ffmpeg ];
+  deezer.propagatedBuildInputs = [ python3Packages.requests ];
+  discogs.propagatedBuildInputs = with python3Packages; [ discogs-client requests ];
+  duplicates = { };
+  edit = { };
+  embedart = {
+    propagatedBuildInputs = with python3Packages; [ pillow ];
+    wrapperBins = [ imagemagick ];
+  };
+  embyupdate.propagatedBuildInputs = [ python3Packages.requests ];
+  export = { };
+  fetchart = {
+    propagatedBuildInputs = with python3Packages; [ requests pillow ];
+    wrapperBins = [ imagemagick ];
+  };
+  filefilter = { };
+  fish = { };
+  freedesktop = { };
+  fromfilename = { };
+  ftintitle = { };
+  fuzzy = { };
+  gmusic = { };
+  hook = { };
+  ihate = { };
+  importadded = { };
+  importfeeds = { };
+  info = { };
+  inline = { };
+  ipfs = { };
+  keyfinder.wrapperBins = [ keyfinder-cli ];
+  kodiupdate.propagatedBuildInputs = [ python3Packages.requests ];
+  lastgenre.propagatedBuildInputs = [ python3Packages.pylast ];
+  lastimport.propagatedBuildInputs = [ python3Packages.pylast ];
+  loadext.propagatedBuildInputs = [ python3Packages.requests ];
+  lyrics.propagatedBuildInputs = [ python3Packages.beautifulsoup4 ];
+  mbcollection = { };
+  mbsubmit = { };
+  mbsync = { };
+  metasync = { };
+  missing = { };
+  mpdstats.propagatedBuildInputs = [ python3Packages.mpd2 ];
+  mpdupdate.propagatedBuildInputs = [ python3Packages.mpd2 ];
+  parentwork = { };
+  permissions = { };
+  play = { };
+  playlist.propagatedBuildInputs = [ python3Packages.requests ];
+  plexupdate = { };
+  random = { };
+  replaygain.wrapperBins = [ aacgain ffmpeg mp3gain ];
+  rewrite = { };
+  scrub = { };
+  smartplaylist = { };
+  sonosupdate.propagatedBuildInputs = [ python3Packages.soco ];
+  spotify = { };
+  subsonicplaylist.propagatedBuildInputs = [ python3Packages.requests ];
+  subsonicupdate.propagatedBuildInputs = [ python3Packages.requests ];
+  the = { };
+  thumbnails = {
+    propagatedBuildInputs = with python3Packages; [ pillow pyxdg ];
+    wrapperBins = [ imagemagick ];
+  };
+  types.testPaths = [ "test/test_types_plugin.py" ];
+  unimported = { };
+  web.propagatedBuildInputs = [ python3Packages.flask ];
+  zero = { };
+}
diff --git a/nixpkgs/pkgs/tools/audio/beets/common.nix b/nixpkgs/pkgs/tools/audio/beets/common.nix
new file mode 100644
index 000000000000..968544f2790e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/beets/common.nix
@@ -0,0 +1,176 @@
+{ stdenv
+, bashInteractive
+, diffPlugins
+, glibcLocales
+, gobject-introspection
+, gst_all_1
+, lib
+, python3Packages
+, runtimeShell
+, writeScript
+
+  # plugin deps
+, aacgain
+, essentia-extractor
+, ffmpeg
+, flac
+, imagemagick
+, keyfinder-cli
+, mp3gain
+, mp3val
+
+, src
+, version
+, pluginOverrides ? { }
+, disableAllPlugins ? false
+
+  # tests
+, runCommand
+, beets
+}@inputs:
+let
+  inherit (lib) attrNames attrValues concatMap;
+
+  mkPlugin = { enable ? !disableAllPlugins, builtin ? false, propagatedBuildInputs ? [ ], testPaths ? [ ], wrapperBins ? [ ] }: {
+    inherit enable builtin propagatedBuildInputs testPaths wrapperBins;
+  };
+
+  basePlugins = lib.mapAttrs (_: a: { builtin = true; } // a) (import ./builtin-plugins.nix inputs);
+  allPlugins = lib.mapAttrs (_: mkPlugin) (lib.recursiveUpdate basePlugins pluginOverrides);
+  builtinPlugins = lib.filterAttrs (_: p: p.builtin) allPlugins;
+  enabledPlugins = lib.filterAttrs (_: p: p.enable) allPlugins;
+  disabledPlugins = lib.filterAttrs (_: p: !p.enable) allPlugins;
+
+  pluginWrapperBins = concatMap (p: p.wrapperBins) (attrValues enabledPlugins);
+in
+python3Packages.buildPythonApplication rec {
+  pname = "beets";
+  inherit src version;
+
+  patches = [
+    # Bash completion fix for Nix
+    ./patches/bash-completion-always-print.patch
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    confuse
+    gobject-introspection
+    gst-python
+    jellyfish
+    mediafile
+    munkres
+    musicbrainzngs
+    mutagen
+    pygobject3
+    pyyaml
+    reflink
+    unidecode
+  ] ++ (concatMap (p: p.propagatedBuildInputs) (attrValues enabledPlugins));
+
+  # see: https://github.com/NixOS/nixpkgs/issues/56943#issuecomment-1131643663
+  nativeBuildInputs = [
+    gobject-introspection
+  ];
+
+  buildInputs = [
+  ] ++ (with gst_all_1; [
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+  ]);
+
+  postInstall = ''
+    mkdir -p $out/share/zsh/site-functions
+    cp extra/_beet $out/share/zsh/site-functions/
+  '';
+
+  doInstallCheck = true;
+
+  installCheckPhase = ''
+    runHook preInstallCheck
+
+    tmphome="$(mktemp -d)"
+
+    EDITOR="${writeScript "beetconfig.sh" ''
+      #!${runtimeShell}
+      cat > "$1" <<CFG
+      plugins: ${lib.concatStringsSep " " (attrNames enabledPlugins)}
+      CFG
+    ''}" HOME="$tmphome" "$out/bin/beet" config -e
+    EDITOR=true HOME="$tmphome" "$out/bin/beet" config -e
+
+    runHook postInstallCheck
+  '';
+
+  makeWrapperArgs = [
+    "--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
+    "--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
+    "--prefix PATH : ${lib.makeBinPath pluginWrapperBins}"
+  ];
+
+  checkInputs = with python3Packages; [
+    pytest
+    mock
+    rarfile
+    responses
+  ] ++ pluginWrapperBins;
+
+  disabledTestPaths = lib.flatten (attrValues (lib.mapAttrs (n: v: v.testPaths ++ [ "test/test_${n}.py" ]) disabledPlugins));
+
+  checkPhase = ''
+    runHook preCheck
+
+    # Check for undefined plugins
+    find beetsplug -mindepth 1 \
+      \! -path 'beetsplug/__init__.py' -a \
+      \( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
+      | sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
+      | sort -u > plugins_available
+    ${diffPlugins (attrNames builtinPlugins) "plugins_available"}
+
+    export BEETS_TEST_SHELL="${bashInteractive}/bin/bash --norc"
+    export HOME="$(mktemp -d)"
+
+    args=" -m pytest -r fEs"
+    eval "disabledTestPaths=($disabledTestPaths)"
+    for path in ''${disabledTestPaths[@]}; do
+      if [ -e "$path" ]; then
+        args+=" --ignore $path"
+      else
+        echo "Skipping non-existent test path '$path'"
+      fi
+    done
+
+    python $args
+
+    runHook postCheck
+  '';
+
+
+  passthru.plugins = allPlugins;
+
+  passthru.tests.gstreamer = runCommand "beets-gstreamer-test" {
+    meta.timeout = 60;
+  }
+  ''
+  set -euo pipefail
+  export HOME=$(mktemp -d)
+  mkdir $out
+
+  cat << EOF > $out/config.yaml
+replaygain:
+  backend: gstreamer
+EOF
+
+  echo $out/config.yaml
+  ${beets}/bin/beet -c $out/config.yaml > /dev/null
+  '';
+
+  meta = with lib; {
+    description = "Music tagger and library organizer";
+    homepage = "https://beets.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aszlig doronbehar lovesegfault pjones ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/beets/convert-plugin-ffmpeg-path.patch b/nixpkgs/pkgs/tools/audio/beets/convert-plugin-ffmpeg-path.patch
deleted file mode 100644
index 1bc178934486..000000000000
--- a/nixpkgs/pkgs/tools/audio/beets/convert-plugin-ffmpeg-path.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-diff --git i/beetsplug/convert.py w/beetsplug/convert.py
-index 6bc07c28..039fb452 100644
---- i/beetsplug/convert.py
-+++ w/beetsplug/convert.py
-@@ -118,22 +118,22 @@ class ConvertPlugin(BeetsPlugin):
-             'id3v23': 'inherit',
-             'formats': {
-                 'aac': {
--                    'command': 'ffmpeg -i $source -y -vn -acodec aac '
-+                    'command': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec aac '
-                     '-aq 1 $dest',
-                     'extension': 'm4a',
-                 },
-                 'alac': {
--                    'command': 'ffmpeg -i $source -y -vn -acodec alac $dest',
-+                    'command': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec alac $dest',
-                     'extension': 'm4a',
-                 },
--                'flac': 'ffmpeg -i $source -y -vn -acodec flac $dest',
--                'mp3': 'ffmpeg -i $source -y -vn -aq 2 $dest',
-+                'flac': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec flac $dest',
-+                'mp3': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -aq 2 $dest',
-                 'opus':
--                    'ffmpeg -i $source -y -vn -acodec libopus -ab 96k $dest',
-+                    '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec libopus -ab 96k $dest',
-                 'ogg':
--                    'ffmpeg -i $source -y -vn -acodec libvorbis -aq 3 $dest',
-+                    '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec libvorbis -aq 3 $dest',
-                 'wma':
--                    'ffmpeg -i $source -y -vn -acodec wmav2 -vn $dest',
-+                    '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec wmav2 -vn $dest',
-             },
-             'max_bitrate': 500,
-             'auto': False,
diff --git a/nixpkgs/pkgs/tools/audio/beets/default.nix b/nixpkgs/pkgs/tools/audio/beets/default.nix
index 6789bd5f9622..f68a0381e12a 100644
--- a/nixpkgs/pkgs/tools/audio/beets/default.nix
+++ b/nixpkgs/pkgs/tools/audio/beets/default.nix
@@ -1,279 +1,50 @@
-{ stdenv
-, lib
+{ lib
+, callPackage
 , fetchFromGitHub
-, writeScript
-, glibcLocales
-, diffPlugins
-, substituteAll
-, pythonPackages
-# can be null, if you wish to disable a reference to it. It's needed for the
-# artresizer, see:
-# https://beets.readthedocs.io/en/v1.6.0/plugins/fetchart.html#image-resizing
-, imagemagick
-, gobject-introspection
-, gst_all_1
-, runtimeShell
-
-# external plugins package set
-, beetsExternalPlugins
-
-, enableAbsubmit         ? lib.elem stdenv.hostPlatform.system essentia-extractor.meta.platforms, essentia-extractor
-, enableAcousticbrainz   ? true
-, enableAcoustid         ? true
-, enableAura             ? true
-, enableBadfiles         ? true, flac, mp3val
-, enableBeatport         ? true
-, enableBpsync           ? true
-, enableConvert          ? true, ffmpeg
-, enableDeezer           ? true
-, enableDiscogs          ? true
-, enableEmbyupdate       ? true
-, enableFetchart         ? true
-, enableKeyfinder        ? true, keyfinder-cli
-, enableKodiupdate       ? true
-, enableLastfm           ? true
-, enableLoadext          ? true
-, enableLyrics           ? true
-, enableMpd              ? true
-, enablePlaylist         ? true
-, enableReplaygain       ? true
-, enableSonosUpdate      ? true
-, enableSubsonicplaylist ? true
-, enableSubsonicupdate   ? true
-, enableThumbnails       ? true
-, enableWeb              ? true
-
-# External plugins
-, enableAlternatives     ? false
-, enableCopyArtifacts    ? false
-, enableExtraFiles       ? false
-
-, bashInteractive, bash-completion
 }:
-
-assert enableBpsync      -> enableBeatport;
-
-let
-  optionalPlugins = {
-    absubmit = enableAbsubmit;
-    acousticbrainz = enableAcousticbrainz;
-    aura = enableAura;
-    badfiles = enableBadfiles;
-    beatport = enableBeatport;
-    bpsync = enableBpsync;
-    chroma = enableAcoustid;
-    convert = enableConvert;
-    deezer = enableDeezer;
-    discogs = enableDiscogs;
-    embyupdate = enableEmbyupdate;
-    fetchart = enableFetchart;
-    keyfinder = enableKeyfinder;
-    kodiupdate = enableKodiupdate;
-    lastgenre = enableLastfm;
-    lastimport = enableLastfm;
-    loadext = enableLoadext;
-    lyrics = enableLyrics;
-    mpdstats = enableMpd;
-    mpdupdate = enableMpd;
-    playlist = enablePlaylist;
-    replaygain = enableReplaygain;
-    sonosupdate = enableSonosUpdate;
-    subsonicplaylist = enableSubsonicplaylist;
-    subsonicupdate = enableSubsonicupdate;
-    thumbnails = enableThumbnails;
-    web = enableWeb;
+/*
+** To customize the enabled beets plugins, use the pluginOverrides input to the
+** derivation.
+** Examples:
+**
+** Disabling a builtin plugin:
+** beets.override { pluginOverrides = { beatport.enable = false; }; }
+**
+** Enabling an external plugin:
+** beets.override { pluginOverrides = {
+**   alternatives = { enable = true; propagatedBuildInputs = [ beetsPackages.alternatives ]; };
+** }; }
+*/
+lib.makeExtensible (self: {
+  beets = self.beets-stable;
+
+  beets-stable = callPackage ./common.nix rec {
+    version = "1.6.0";
+    src = fetchFromGitHub {
+      owner = "beetbox";
+      repo = "beets";
+      rev = "v${version}";
+      hash = "sha256-fT+rCJJQR7bdfAcmeFRaknmh4ZOP4RCx8MXpq7/D8tM=";
+    };
   };
 
-  pluginsWithoutDeps = [
-    "albumtypes" "bareasc" "bench" "bpd" "bpm" "bucket" "duplicates" "edit" "embedart"
-    "export" "filefilter" "fish" "freedesktop" "fromfilename" "ftintitle" "fuzzy"
-    "hook" "ihate" "importadded" "importfeeds" "info" "inline" "ipfs" "gmusic"
-    "mbcollection" "mbsubmit" "mbsync" "metasync" "missing" "parentwork" "permissions" "play"
-    "plexupdate" "random" "rewrite" "scrub" "smartplaylist" "spotify" "the"
-    "types" "unimported" "zero"
-  ];
-
-  enabledOptionalPlugins = lib.attrNames (lib.filterAttrs (_: lib.id) optionalPlugins);
-
-  allPlugins = pluginsWithoutDeps ++ lib.attrNames optionalPlugins;
-  allEnabledPlugins = pluginsWithoutDeps ++ enabledOptionalPlugins;
-
-  testShell = "${bashInteractive}/bin/bash --norc";
-  completion = "${bash-completion}/share/bash-completion/bash_completion";
-
-in pythonPackages.buildPythonApplication rec {
-  pname = "beets";
-  version = "1.6.0";
-
-  src = fetchFromGitHub {
-    owner = "beetbox";
-    repo = "beets";
-    rev = "v${version}";
-    sha256 = "sha256-fT+rCJJQR7bdfAcmeFRaknmh4ZOP4RCx8MXpq7/D8tM=";
+  beets-minimal = self.beets.override { disableAllPlugins = true; };
+
+  beets-unstable = callPackage ./common.nix {
+    version = "unstable-2022-05-08";
+    src = fetchFromGitHub {
+      owner = "beetbox";
+      repo = "beets";
+      rev = "e06cf7969bfdfa4773049699320471be45d56054";
+      hash = "sha256-yWwxYSzSSmx2UfCn0EBH23hQGZKSRn/c8ryvxLUeHdM=";
+    };
+    pluginOverrides = {
+      # unstable has a new plugin, so we register it here.
+      limit = { builtin = true; };
+    };
   };
 
-  propagatedBuildInputs = [
-    pythonPackages.six
-    pythonPackages.enum34
-    pythonPackages.jellyfish
-    pythonPackages.munkres
-    pythonPackages.musicbrainzngs
-    pythonPackages.mutagen
-    pythonPackages.pyyaml
-    pythonPackages.unidecode
-    pythonPackages.gst-python
-    pythonPackages.pygobject3
-    pythonPackages.reflink
-    pythonPackages.confuse
-    pythonPackages.mediafile
-    gobject-introspection
-  ] ++ lib.optional enableAbsubmit         essentia-extractor
-    ++ lib.optional enableAcoustid         pythonPackages.pyacoustid
-    ++ lib.optional enableBeatport         pythonPackages.requests_oauthlib
-    ++ lib.optional enableConvert          ffmpeg
-    ++ lib.optional enableDiscogs          pythonPackages.discogs-client
-    ++ lib.optional (enableFetchart
-                  || enableDeezer
-                  || enableEmbyupdate
-                  || enableKodiupdate
-                  || enableLoadext
-                  || enablePlaylist
-                  || enableSubsonicplaylist
-                  || enableSubsonicupdate
-                  || enableAcousticbrainz) pythonPackages.requests
-    ++ lib.optional enableKeyfinder        keyfinder-cli
-    ++ lib.optional enableLastfm           pythonPackages.pylast
-    ++ lib.optional enableLyrics           pythonPackages.beautifulsoup4
-    ++ lib.optional enableMpd              pythonPackages.mpd2
-    ++ lib.optional enableSonosUpdate      pythonPackages.soco
-    ++ lib.optional enableThumbnails       pythonPackages.pyxdg
-    ++ lib.optional (enableAura
-                  || enableWeb)            pythonPackages.flask
-    ++ lib.optional enableAlternatives     beetsExternalPlugins.alternatives
-    ++ lib.optional enableCopyArtifacts    beetsExternalPlugins.copyartifacts
-    ++ lib.optional enableExtraFiles       beetsExternalPlugins.extrafiles
-  ;
-
-  buildInputs = [
-  ] ++ (with gst_all_1; [
-    gst-plugins-base
-    gst-plugins-good
-    gst-plugins-ugly
-  ]);
-
-  checkInputs = with pythonPackages; [
-    beautifulsoup4
-    mock
-    nose
-    rarfile
-    responses
-    # Although considered as plugin dependencies, they are needed for the
-    # tests, for disabling them via an override makes the build fail. see:
-    # https://github.com/beetbox/beets/blob/v1.6.0/setup.py
-    pylast
-    mpd2
-    discogs-client
-    pyxdg
-  ];
-
-  patches = [
-    # Bash completion fix for Nix
-    ./bash-completion-always-print.patch
-  ]
-    # Fix path to imagemagick, used for the artresizer.py file. This reference
-    # to imagemagick might be expensive for some people, so the patch can be
-    # disabled if imagemagick is set to null
-    ++ lib.optional (imagemagick != null) (substituteAll {
-      src = ./imagemagick-nix-path.patch;
-      inherit imagemagick;
-    })
-    # We need to force ffmpeg as the default, since we do not package
-    # bs1770gain, and set the absolute path there, to avoid impurities.
-    ++ lib.optional enableReplaygain (substituteAll {
-      src = ./replaygain-default-ffmpeg.patch;
-      ffmpeg = lib.getBin ffmpeg;
-    })
-    # Put absolute Nix paths in place
-    ++ lib.optional enableConvert (substituteAll {
-      src = ./convert-plugin-ffmpeg-path.patch;
-      ffmpeg = lib.getBin ffmpeg;
-    })
-    ++ lib.optional enableBadfiles (substituteAll {
-      src = ./badfiles-plugin-nix-paths.patch;
-      inherit mp3val flac;
-    })
-  ;
-
-  # Disable failing tests
-  postPatch = ''
-    echo echo completion tests passed > test/rsrc/test_completion.sh
-
-    # https://github.com/beetbox/beets/issues/1187
-    sed -i -e 's/len(mf.images)/0/' test/test_zero.py
-  '';
-
-  postInstall = ''
-    mkdir -p $out/share/zsh/site-functions
-    cp extra/_beet $out/share/zsh/site-functions/
-  '';
-
-  doCheck = true;
-
-  preCheck = ''
-    find beetsplug -mindepth 1 \
-      \! -path 'beetsplug/__init__.py' -a \
-      \( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
-      | sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
-      | sort -u > plugins_available
-
-     ${diffPlugins allPlugins "plugins_available"}
-  '';
-
-  checkPhase = ''
-    runHook preCheck
-
-    LANG=en_US.UTF-8 \
-    LOCALE_ARCHIVE=${assert stdenv.isLinux; glibcLocales}/lib/locale/locale-archive \
-    BEETS_TEST_SHELL="${testShell}" \
-    BASH_COMPLETION_SCRIPT="${completion}" \
-    HOME="$(mktemp -d)" nosetests -v
-
-    runHook postCheck
-  '';
-
-  doInstallCheck = true;
-
-  installCheckPhase = ''
-    runHook preInstallCheck
-
-    tmphome="$(mktemp -d)"
-
-    EDITOR="${writeScript "beetconfig.sh" ''
-      #!${runtimeShell}
-      cat > "$1" <<CFG
-      plugins: ${lib.concatStringsSep " " allEnabledPlugins}
-      CFG
-    ''}" HOME="$tmphome" "$out/bin/beet" config -e
-    EDITOR=true HOME="$tmphome" "$out/bin/beet" config -e
-
-    runHook postInstallCheck
-  '';
-
-  makeWrapperArgs = [
-    "--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
-    "--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
-  ];
-
-  passthru = {
-    # FIXME: remove in favor of pkgs.beetsExternalPlugins
-    externalPlugins = beetsExternalPlugins;
-  };
-
-  meta = with lib; {
-    description = "Music tagger and library organizer";
-    homepage = "https://beets.io";
-    license = licenses.mit;
-    maintainers = with maintainers; [ aszlig doronbehar lovesegfault pjones ];
-    platforms = platforms.linux;
-  };
-}
+  alternatives = callPackage ./plugins/alternatives.nix { beets = self.beets-minimal; };
+  copyartifacts = callPackage ./plugins/copyartifacts.nix { beets = self.beets-minimal; };
+  extrafiles = callPackage ./plugins/extrafiles.nix { beets = self.beets-minimal; };
+})
diff --git a/nixpkgs/pkgs/tools/audio/beets/imagemagick-nix-path.patch b/nixpkgs/pkgs/tools/audio/beets/imagemagick-nix-path.patch
deleted file mode 100644
index 9a77703ede7c..000000000000
--- a/nixpkgs/pkgs/tools/audio/beets/imagemagick-nix-path.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff --git i/beets/util/artresizer.py w/beets/util/artresizer.py
-index 8683e228..2f38b4d6 100644
---- i/beets/util/artresizer.py
-+++ w/beets/util/artresizer.py
-@@ -334,13 +334,8 @@ class ArtResizer(metaclass=Shareable):
-         # not, fall back to the older, separate convert and identify
-         # commands.
-         if self.method[0] == IMAGEMAGICK:
--            self.im_legacy = self.method[2]
--            if self.im_legacy:
--                self.im_convert_cmd = ['convert']
--                self.im_identify_cmd = ['identify']
--            else:
--                self.im_convert_cmd = ['magick']
--                self.im_identify_cmd = ['magick', 'identify']
-+            self.im_convert_cmd = ['@imagemagick@/bin/magick']
-+            self.im_identify_cmd = ['@imagemagick@/bin/magick', 'identify']
- 
-     def resize(
-         self, maxwidth, path_in, path_out=None, quality=0, max_filesize=0
diff --git a/nixpkgs/pkgs/tools/audio/beets/bash-completion-always-print.patch b/nixpkgs/pkgs/tools/audio/beets/patches/bash-completion-always-print.patch
index 8a31fe22f728..8a31fe22f728 100644
--- a/nixpkgs/pkgs/tools/audio/beets/bash-completion-always-print.patch
+++ b/nixpkgs/pkgs/tools/audio/beets/patches/bash-completion-always-print.patch
diff --git a/nixpkgs/pkgs/tools/audio/beets/plugins/alternatives.nix b/nixpkgs/pkgs/tools/audio/beets/plugins/alternatives.nix
index 146e9f506641..635854d4576a 100644
--- a/nixpkgs/pkgs/tools/audio/beets/plugins/alternatives.nix
+++ b/nixpkgs/pkgs/tools/audio/beets/plugins/alternatives.nix
@@ -1,6 +1,6 @@
-{ lib, fetchFromGitHub, beets, pythonPackages }:
+{ lib, fetchFromGitHub, beets, python3Packages }:
 
-pythonPackages.buildPythonApplication rec {
+python3Packages.buildPythonApplication rec {
   pname = "beets-alternatives";
   version = "unstable-2021-02-01";
 
@@ -18,7 +18,7 @@ pythonPackages.buildPythonApplication rec {
 
   nativeBuildInputs = [ beets ];
 
-  checkInputs = with pythonPackages; [
+  checkInputs = with python3Packages; [
     pytestCheckHook
     mock
   ];
diff --git a/nixpkgs/pkgs/tools/audio/beets/plugins/copyartifacts.nix b/nixpkgs/pkgs/tools/audio/beets/plugins/copyartifacts.nix
index 2f1ecdfc3695..623ca2fcf172 100644
--- a/nixpkgs/pkgs/tools/audio/beets/plugins/copyartifacts.nix
+++ b/nixpkgs/pkgs/tools/audio/beets/plugins/copyartifacts.nix
@@ -1,6 +1,6 @@
-{ lib, fetchFromGitHub, beets, pythonPackages, glibcLocales }:
+{ lib, fetchFromGitHub, beets, python3Packages }:
 
-pythonPackages.buildPythonApplication {
+python3Packages.buildPythonApplication {
   pname = "beets-copyartifacts";
   version = "unstable-2020-02-15";
 
@@ -15,20 +15,20 @@ pythonPackages.buildPythonApplication {
     sed -i -e '/install_requires/,/\]/{/beets/d}' setup.py
     sed -i -e '/namespace_packages/d' setup.py
     printf 'from pkgutil import extend_path\n__path__ = extend_path(__path__, __name__)\n' >beetsplug/__init__.py
-
-    # Skip test which is already failing upstream.
-    sed -i -e '1i import unittest' \
-           -e 's/\(^ *\)# failing/\1@unittest.skip/' \
-           tests/test_reimport.py
   '';
 
-  nativeBuildInputs = [ beets pythonPackages.nose glibcLocales ];
+  pytestFlagsArray = [ "-r fEs" ];
 
-  checkPhase = "LANG=en_US.UTF-8 nosetests";
+  checkInputs = with python3Packages; [
+    pytestCheckHook
+    beets
+    six
+  ];
 
   meta = {
     description = "Beets plugin to move non-music files during the import process";
     homepage = "https://github.com/sbarakat/beets-copyartifacts";
     license = lib.licenses.mit;
+    inherit (beets.meta) platforms;
   };
 }
diff --git a/nixpkgs/pkgs/tools/audio/beets/plugins/extrafiles.nix b/nixpkgs/pkgs/tools/audio/beets/plugins/extrafiles.nix
index 0d3ccc0d7a71..7cd4c76d5045 100644
--- a/nixpkgs/pkgs/tools/audio/beets/plugins/extrafiles.nix
+++ b/nixpkgs/pkgs/tools/audio/beets/plugins/extrafiles.nix
@@ -1,6 +1,6 @@
-{ lib, fetchFromGitHub, beets, pythonPackages }:
+{ lib, fetchFromGitHub, beets, python3Packages }:
 
-pythonPackages.buildPythonApplication rec {
+python3Packages.buildPythonApplication {
   pname = "beets-extrafiles";
   version = "unstable-2020-12-13";
 
@@ -17,17 +17,21 @@ pythonPackages.buildPythonApplication rec {
     sed -i -e 's/mediafile~=0.6.0/mediafile>=0.6.0/' setup.py
   '';
 
-  nativeBuildInputs = [ beets ];
+  propagatedBuildInputs = with python3Packages; [ mediafile ];
 
-  propagatedBuildInputs = with pythonPackages; [ mediafile ];
+  checkInputs = [
+    python3Packages.pytestCheckHook
+    beets
+  ];
 
   preCheck = ''
-    HOME=$TEMPDIR
+    HOME="$(mktemp -d)"
   '';
 
   meta = {
     homepage = "https://github.com/Holzhaus/beets-extrafiles";
     description = "A plugin for beets that copies additional files and directories during the import process";
     license = lib.licenses.mit;
+    inherit (beets.meta) platforms;
   };
 }
diff --git a/nixpkgs/pkgs/tools/audio/beets/replaygain-default-ffmpeg.patch b/nixpkgs/pkgs/tools/audio/beets/replaygain-default-ffmpeg.patch
deleted file mode 100644
index e441997cae58..000000000000
--- a/nixpkgs/pkgs/tools/audio/beets/replaygain-default-ffmpeg.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git i/beetsplug/replaygain.py w/beetsplug/replaygain.py
-index b6297d93..5c1cbbc0 100644
---- i/beetsplug/replaygain.py
-+++ w/beetsplug/replaygain.py
-@@ -139,7 +139,7 @@ class FfmpegBackend(Backend):
- 
-     def __init__(self, config, log):
-         super().__init__(config, log)
--        self._ffmpeg_path = "ffmpeg"
-+        self._ffmpeg_path = "@ffmpeg@/bin/ffmpeg"
- 
-         # check that ffmpeg is installed
-         try:
-@@ -975,11 +975,10 @@ class ReplayGainPlugin(BeetsPlugin):
-     def __init__(self):
-         super().__init__()
- 
--        # default backend is 'command' for backward-compatibility.
-         self.config.add({
-             'overwrite': False,
-             'auto': True,
--            'backend': 'command',
-+            'backend': 'ffmpeg',
-             'threads': cpu_count(),
-             'parallel_on_import': False,
-             'per_disc': False,
diff --git a/nixpkgs/pkgs/tools/audio/botamusique/default.nix b/nixpkgs/pkgs/tools/audio/botamusique/default.nix
index a1c78768f6ab..249e9629a6f1 100644
--- a/nixpkgs/pkgs/tools/audio/botamusique/default.nix
+++ b/nixpkgs/pkgs/tools/audio/botamusique/default.nix
@@ -15,7 +15,7 @@
 , nodePackages
 }:
 let
-  nodejs = pkgs.nodejs-12_x;
+  nodejs = pkgs.nodejs-14_x;
   nodeEnv = import ../../../development/node-packages/node-env.nix {
     inherit (pkgs) stdenv lib python2 runCommand writeTextFile writeShellScript;
     inherit pkgs nodejs;
diff --git a/nixpkgs/pkgs/tools/audio/darkice/default.nix b/nixpkgs/pkgs/tools/audio/darkice/default.nix
index bc3bcbe4eff2..73c71ee6f1a1 100644
--- a/nixpkgs/pkgs/tools/audio/darkice/default.nix
+++ b/nixpkgs/pkgs/tools/audio/darkice/default.nix
@@ -32,6 +32,6 @@ stdenv.mkDerivation rec {
     homepage = "http://darkice.org/";
     description = "Live audio streamer";
     license = lib.licenses.gpl3;
-    maintainers = with lib.maintainers; [ ikervagyok fpletz ];
+    maintainers = with lib.maintainers; [ ikervagyok ];
   };
 }
diff --git a/nixpkgs/pkgs/tools/audio/dsp/default.nix b/nixpkgs/pkgs/tools/audio/dsp/default.nix
new file mode 100644
index 000000000000..01b1ed107be9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/dsp/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, fftw
+, zita-convolver
+, fftwFloat
+, libsndfile
+, ffmpeg
+, alsa-lib
+, libao
+, libmad
+, ladspaH
+, libtool
+, libpulseaudio
+}:
+
+stdenv.mkDerivation rec {
+  pname = "dsp";
+  version = "1.9";
+
+  src = fetchFromGitHub {
+    owner = "bmc0";
+    repo = "dsp";
+    rev = "v${version}";
+    sha256 = "sha256-S1pzVQ/ceNsx0vGmzdDWw2TjPVLiRgzR4edFblWsekY=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    fftw
+    zita-convolver
+    fftwFloat
+    libsndfile
+    ffmpeg
+    alsa-lib
+    libao
+    libmad
+    ladspaH
+    libtool
+    libpulseaudio
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/bmc0/dsp";
+    description = "An audio processing program with an interactive mode";
+    license = licenses.isc;
+    maintainers = with maintainers; [ aaronjheng ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/fmtoy/default.nix b/nixpkgs/pkgs/tools/audio/fmtoy/default.nix
new file mode 100644
index 000000000000..dd3f04021327
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/fmtoy/default.nix
@@ -0,0 +1,72 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, unstableGitUpdater
+, dos2unix
+, pkg-config
+, zlib
+, alsa-lib
+, libjack2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fmtoy";
+  version = "unstable-2021-12-24";
+
+  src = fetchFromGitHub {
+    owner = "vampirefrog";
+    repo = "fmtoy";
+    rev = "0de6703b3373eb5bf19fd3deaae889286f330c21";
+    sha256 = "0sr6klkmjd2hd2kyb9y0x986d6lsy8bziizfc6cmhkqcq92fh45c";
+  };
+
+  postPatch = ''
+    dos2unix Makefile
+    # Don't hardcode compilers
+    sed -i -e '/CC=/d' -e '/CXX=/d' Makefile
+  '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
+    # Remove Linux-only program & its dependencies
+    sed -i -e '/PROGS/ s/fmtoy_jack//' Makefile
+    substituteInPlace Makefile \
+      --replace '$(shell pkg-config alsa jack --cflags)' ""
+  '';
+
+  nativeBuildInputs = [
+    dos2unix
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [
+    pkg-config
+  ];
+
+  buildInputs = [
+    zlib
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [
+    alsa-lib
+    libjack2
+  ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    for prog in $(grep 'PROGS=' Makefile | cut -d= -f2-); do
+      install -Dm755 $prog $out/bin/$prog
+    done
+
+    runHook postInstall
+  '';
+
+  passthru.updateScript = unstableGitUpdater {
+    url = "https://github.com/vampirefrog/fmtoy.git";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/vampirefrog/fmtoy";
+    description = "Tools for FM voices for Yamaha YM chips (OPL, OPM and OPN series)";
+    # Unknown license situation
+    # https://github.com/vampirefrog/fmtoy/issues/1
+    license = licenses.unfree;
+    maintainers = with maintainers; [ OPNA2608 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/glyr/default.nix b/nixpkgs/pkgs/tools/audio/glyr/default.nix
index 60585c3b3541..0f13addfcd92 100644
--- a/nixpkgs/pkgs/tools/audio/glyr/default.nix
+++ b/nixpkgs/pkgs/tools/audio/glyr/default.nix
@@ -16,10 +16,11 @@ stdenv.mkDerivation rec {
   buildInputs = [ sqlite glib curl ];
 
   meta = with lib; {
-    license = licenses.lgpl3;
     description = "A music related metadata searchengine";
     homepage = "https://github.com/sahib/glyr";
+    license = licenses.lgpl3;
     maintainers = [ maintainers.sternenseemann ];
+    mainProgram = "glyrc";
     platforms = platforms.unix;
   };
 }
diff --git a/nixpkgs/pkgs/tools/audio/headset-charge-indicator/default.nix b/nixpkgs/pkgs/tools/audio/headset-charge-indicator/default.nix
new file mode 100644
index 000000000000..2e4f63185190
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/headset-charge-indicator/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv, fetchFromGitHub, headsetcontrol, wrapGAppsHook, python3, gtk3
+, gobject-introspection, libayatana-appindicator-gtk3 }:
+
+stdenv.mkDerivation rec {
+  # The last versioned release is 1.0.0.0 from 2020, since then there were updates but no versioned release.
+  # This is not marked unstable because upstream encourages installation from source.
+  pname = "headset-charge-indicator";
+  version = "2021-08-15";
+
+  src = fetchFromGitHub {
+    owner = "centic9";
+    repo = "headset-charge-indicator";
+    rev = "6e20f81a4d6118c7385b831044c468af83103193";
+    sha256 = "sha256-eaAbqeFY+B3CcKJywC3vaRsWZNQENTbALc7L7uW0W6U=";
+  };
+
+  nativeBuildInputs = [ wrapGAppsHook ];
+
+  buildInputs = [
+    (python3.withPackages (ps: with ps; [ pygobject3 ]))
+    headsetcontrol
+    gtk3
+    gobject-introspection
+    libayatana-appindicator-gtk3
+  ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp $src/headset-charge-indicator.py $out/bin/headset-charge-indicator.py
+    chmod +x $out/bin/headset-charge-indicator.py
+
+    substituteInPlace \
+      $out/bin/headset-charge-indicator.py \
+      --replace "default='headsetcontrol'" "default='${headsetcontrol}/bin/headsetcontrol'"
+
+    cat << EOF > ${pname}.desktop
+    [Desktop Entry]
+    Name=Wireless headset app-indicator
+    Categories=Application;System
+    Exec=$out/bin/headset-charge-indicator.py
+    Terminal=false
+    Type=Application
+    X-GNOME-AutoRestart=true
+    X-GNOME-Autostart-enabled=true
+    EOF
+
+    mkdir -p $out/share/applications
+    mkdir -p $out/etc/xdg/autostart
+    cp ${pname}.desktop $out/share/applications/${pname}.desktop
+    cp ${pname}.desktop $out/etc/xdg/autostart/${pname}.desktop
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/centic9/headset-charge-indicator";
+    description =
+      "A app-indicator for GNOME desktops for controlling some features of various wireless headsets";
+    longDescription =
+      "A simple app-indicator for GNOME desktops to display the battery charge of some wireless headsets which also allows to control some functions like LEDs, sidetone and others.";
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ zebreus ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/headsetcontrol/default.nix b/nixpkgs/pkgs/tools/audio/headsetcontrol/default.nix
index 3a66791932d5..294b2cc7b931 100644
--- a/nixpkgs/pkgs/tools/audio/headsetcontrol/default.nix
+++ b/nixpkgs/pkgs/tools/audio/headsetcontrol/default.nix
@@ -7,13 +7,13 @@
 
 stdenv.mkDerivation rec {
   pname = "headsetcontrol";
-  version = "2.6";
+  version = "2.6.1";
 
   src = fetchFromGitHub {
     owner = "Sapd";
     repo = "HeadsetControl";
     rev = version;
-    sha256 = "0a7zimzi71416pmn6z0l1dn1c2x8p702hkd0k6da9rsznff85a88";
+    sha256 = "sha256-SVOcRzR52RYZsk/OWAr1/s+Nm6x48OxG0TF7yQ+Kb94=";
   };
 
   nativeBuildInputs = [
diff --git a/nixpkgs/pkgs/tools/audio/liquidsoap/full.nix b/nixpkgs/pkgs/tools/audio/liquidsoap/full.nix
index 1c52e6796b7b..b390c943cd2a 100644
--- a/nixpkgs/pkgs/tools/audio/liquidsoap/full.nix
+++ b/nixpkgs/pkgs/tools/audio/liquidsoap/full.nix
@@ -1,74 +1,99 @@
 { lib, stdenv, makeWrapper, fetchurl, which, pkg-config
+, libjpeg
 , ocamlPackages
-, libao, portaudio, alsa-lib, libpulseaudio, libjack2
-, libsamplerate, libmad, taglib, lame, libogg
-, libvorbis, speex, libtheora, libopus, zlib
-, faad2, flac, ladspaH, ffmpeg, frei0r, dssi
+, awscli2, curl, ffmpeg, youtube-dl
+, runtimePackages ? [ awscli2 curl ffmpeg youtube-dl ]
 }:
 
 let
   pname = "liquidsoap";
-  version = "1.4.2";
-
-  ocaml-ffmpeg = fetchurl {
-    url = "https://github.com/savonet/ocaml-ffmpeg/releases/download/v0.4.2/ocaml-ffmpeg-0.4.2.tar.gz";
-    sha256 = "1lx5s1avds9fsh77828ifn71r2g89rxakhs8pp995a675phm9viw";
-  };
-
-  packageFilters = map (p: "-e '/ocaml-${p}/d'" )
-    [ "gstreamer" "shine" "aacplus" "schroedinger"
-      "voaacenc" "soundtouch" "gavl" "lo"
-    ];
+  version = "2.0.6";
 in
 stdenv.mkDerivation {
-  name = "${pname}-full-${version}";
+  inherit pname version;
 
   src = fetchurl {
-    url = "https://github.com/savonet/${pname}/releases/download/v${version}/${pname}-${version}-full.tar.gz";
-    sha256 = "0wkwnzj1a0vizv7sr1blwk5gzm2qi0n02ndijnq1i50cwrgxs1a4";
+    url = "https://github.com/savonet/${pname}/releases/download/v${version}/${pname}-${version}.tar.bz2";
+    sha256 = "sha256-1wD9BApbDA/ovzZoniay+jciP/V2C8EoGQehd5N8PPQ=";
   };
 
-  # Use ocaml-srt and ocaml-fdkaac from nixpkgs
-  # Use ocaml-ffmpeg at 0.4.2 for compatibility with ffmpeg 4.3
-  prePatch = ''
-    rm -rf ocaml-srt*/ ocaml-fdkaac*/ ocaml-ffmpeg*/
-    tar xzf ${ocaml-ffmpeg}
-  '';
-
-  preConfigure = /* we prefer system-wide libs */ ''
-    sed -i "s|gsed|sed|" Makefile
-    make bootstrap
-    # autoreconf -vi # use system libraries
-
-    sed ${toString packageFilters} PACKAGES.default > PACKAGES
-  '';
-
   postFixup = ''
-    wrapProgram $out/bin/liquidsoap --set LIQ_LADSPA_PATH /run/current-system/sw/lib/ladspa
+    wrapProgram $out/bin/liquidsoap \
+      --set LIQ_LADSPA_PATH /run/current-system/sw/lib/ladspa \
+      --prefix PATH : ${lib.makeBinPath runtimePackages}
   '';
 
-  configureFlags = [ "--localstatedir=/var" ];
-
   nativeBuildInputs = [ makeWrapper pkg-config ];
-  buildInputs =
-    [ which ocamlPackages.ocaml ocamlPackages.findlib
-      libao portaudio alsa-lib libpulseaudio libjack2
-      libsamplerate libmad taglib lame libogg
-      libvorbis speex libtheora libopus zlib
-      faad2 flac ladspaH ffmpeg frei0r dssi
-      ocamlPackages.xmlm ocamlPackages.ocaml_pcre
+  buildInputs = [
+      libjpeg
+      which
+      ocamlPackages.ocaml ocamlPackages.findlib
+
+      # Mandatory dependencies
+      ocamlPackages.dtools
+      ocamlPackages.duppy
+      ocamlPackages.mm
+      ocamlPackages.ocaml_pcre
+      ocamlPackages.menhir ocamlPackages.menhirLib
+      ocamlPackages.sedlex
+
+      # Recommended dependencies
       ocamlPackages.camomile
+      ocamlPackages.samplerate
+
+      # Optional dependencies
+      ocamlPackages.camlimages
+      ocamlPackages.gd4o
+      ocamlPackages.alsa
+      ocamlPackages.ao
+      ocamlPackages.bjack
+      ocamlPackages.cry
+      ocamlPackages.dssi
+      ocamlPackages.faad
       ocamlPackages.fdkaac
-      ocamlPackages.srt ocamlPackages.sedlex_2 ocamlPackages.menhir ocamlPackages.menhirLib
-    ];
+      ocamlPackages.srt
+      ocamlPackages.ffmpeg
+      ocamlPackages.flac
+      ocamlPackages.frei0r
+      ocamlPackages.gstreamer
+      ocamlPackages.inotify
+      ocamlPackages.ladspa
+      ocamlPackages.lame
+      ocamlPackages.lastfm
+      ocamlPackages.lo
+      ocamlPackages.mad
+      ocamlPackages.magic
+      ocamlPackages.ogg
+      ocamlPackages.opus
+      ocamlPackages.portaudio
+      ocamlPackages.pulseaudio
+      ocamlPackages.shine
+      ocamlPackages.soundtouch
+      ocamlPackages.speex
+      ocamlPackages.srt
+      ocamlPackages.ssl
+      ocamlPackages.taglib
+      ocamlPackages.theora
+      ocamlPackages.vorbis
+      ocamlPackages.xmlplaylist
+      ocamlPackages.posix-time2
+      ocamlPackages.tsdl
+      ocamlPackages.tsdl-image
+      ocamlPackages.tsdl-ttf
 
-  hardeningDisable = [ "format" "fortify" ];
+      # Undocumented dependencies
+      ocamlPackages.ocurl
+      ocamlPackages.lilv
+      ocamlPackages.graphics
+      ocamlPackages.yojson
+      ocamlPackages.cohttp-lwt-unix
+    ];
 
   meta = with lib; {
     description = "Swiss-army knife for multimedia streaming";
     homepage = "https://www.liquidsoap.info/";
-    maintainers = with maintainers; [ ehmry ];
-    license = licenses.gpl2;
+    maintainers = with maintainers; [ dandellion ehmry ];
+    license = licenses.gpl2Plus;
     platforms = ocamlPackages.ocaml.meta.platforms or [];
   };
 }
diff --git a/nixpkgs/pkgs/tools/audio/mictray/default.nix b/nixpkgs/pkgs/tools/audio/mictray/default.nix
new file mode 100644
index 000000000000..e757bac96682
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/mictray/default.nix
@@ -0,0 +1,53 @@
+{ fetchFromGitHub
+, gtk3
+, lib
+, libgee
+, libnotify
+, meson
+, ninja
+, pkg-config
+, pulseaudio
+, stdenv
+, vala
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mictray";
+  version = "0.2.5";
+
+  src = fetchFromGitHub {
+    owner = "Junker";
+    repo = "mictray";
+    rev = "1f879aeda03fbe87ae5a761f46c042e09912e1c0";
+    sha256 = "0achj6r545c1sigls79c8qdzryz3sgldcyzd3pwak1ymim9i9c74";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libgee
+    libnotify
+    pulseaudio
+  ];
+
+  doCheck = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/Junker/mictray";
+    description = "System tray application for microphone";
+    longDescription = ''
+      MicTray is a Lightweight system tray application which lets you control the microphone state and volume.
+    '';
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.anpryl ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/mpd-discord-rpc/default.nix b/nixpkgs/pkgs/tools/audio/mpd-discord-rpc/default.nix
index 9d8a55d77060..7f363d28dcfb 100644
--- a/nixpkgs/pkgs/tools/audio/mpd-discord-rpc/default.nix
+++ b/nixpkgs/pkgs/tools/audio/mpd-discord-rpc/default.nix
@@ -1,20 +1,28 @@
-{ lib
+{ stdenv
+, lib
 , rustPlatform
 , fetchFromGitHub
+, pkg-config
+, openssl
+, Security
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "mpd-discord-rpc";
-  version = "1.4.1";
+  version = "1.5.2";
 
   src = fetchFromGitHub {
     owner = "JakeStanger";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-CdgR9G598LmxA9lhY6yppP3ZZUhTqgMcWccEhSuCcJQ=";
+    sha256 = "sha256-/QWIoP6KcrI8cYTh3x2lQz7nPSvzb1zRWg8TFoYY9vE=";
   };
 
-  cargoSha256 = "sha256-WhlVWQCUGP+K9md0yp6ZD6mGYMso1fUYKDuXXrC2FeI=";
+  cargoSha256 = "sha256-46PS1+ud7GYuMOJMp93Hf7+nlngvgL67zedaF44TcYY=";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ openssl ] ++ lib.optional stdenv.isDarwin Security;
 
   meta = with lib; {
     description = "Rust application which displays your currently playing song / album / artist from MPD in Discord using Rich Presence";
diff --git a/nixpkgs/pkgs/tools/audio/mpdcron/default.nix b/nixpkgs/pkgs/tools/audio/mpdcron/default.nix
index afb1c9a3dcda..94ba5a56d032 100644
--- a/nixpkgs/pkgs/tools/audio/mpdcron/default.nix
+++ b/nixpkgs/pkgs/tools/audio/mpdcron/default.nix
@@ -31,9 +31,8 @@ in stdenv.mkDerivation {
     sha256 = "0vdksf6lcgmizqr5mqp0bbci259k0dj7gpmhx32md41jlmw5skaw";
   };
 
+  nativeBuildInputs = [ autoconf automake ];
   buildInputs = [
-    autoconf
-    automake
     libtool
     pkg-config
     glib
diff --git a/nixpkgs/pkgs/tools/audio/mpdris2/default.nix b/nixpkgs/pkgs/tools/audio/mpdris2/default.nix
index 4cd3921fb550..a367da9828ed 100644
--- a/nixpkgs/pkgs/tools/audio/mpdris2/default.nix
+++ b/nixpkgs/pkgs/tools/audio/mpdris2/default.nix
@@ -11,7 +11,7 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "mpDris2";
-  version = "0.8";
+  version = "0.9.1";
   format = "other";
   strictDeps = false; # https://github.com/NixOS/nixpkgs/issues/56943
 
@@ -19,7 +19,7 @@ python3.pkgs.buildPythonApplication rec {
     owner = "eonpatapon";
     repo = pname;
     rev = version;
-    sha256 = "048b8acsd1b8kcxzd9fsh5p9g2an9c4rznicfcpyrsjz5syv894h";
+    sha256 = "sha256-1Y6K3z8afUXeKhZzeiaEF3yqU0Ef7qdAj9vAkRlD2p8=";
   };
 
   preConfigure = ''
@@ -49,7 +49,7 @@ python3.pkgs.buildPythonApplication rec {
     description = "MPRIS 2 support for mpd";
     homepage = "https://github.com/eonpatapon/mpDris2/";
     license = licenses.gpl3;
-    maintainers = with maintainers; [];
+    maintainers = with maintainers; [ ];
     platforms = platforms.unix;
   };
 }
diff --git a/nixpkgs/pkgs/tools/audio/mpdsync/default.nix b/nixpkgs/pkgs/tools/audio/mpdsync/default.nix
deleted file mode 100644
index c89404fbba1c..000000000000
--- a/nixpkgs/pkgs/tools/audio/mpdsync/default.nix
+++ /dev/null
@@ -1,25 +0,0 @@
-{ stdenv, python2, fetchFromGitHub }:
-with python2.pkgs;
-stdenv.mkDerivation {
-  pname = "mpdsync";
-  version = "unstable-2017-06-15";
-
-  src = fetchFromGitHub {
-    owner = "alphapapa";
-    repo = "mpdsync";
-    rev = "da90058f44dd9578cc5f2fb96a1fb2b26da40d07";
-    sha256 = "1mfg3ipqj5dvyyqbgp6ia6sc1ja5gmm2c9mfrwx0jw2dl182if6q";
-  };
-
-  pythonPath = [ mpd2 ];
-
-  nativeBuildInputs = [
-    wrapPython
-  ];
-
-  dontBuild = true;
-
-  installPhase = "install -D mpdsync.py $out/bin/mpdsync";
-  postFixup = "wrapPythonPrograms";
-
-}
diff --git a/nixpkgs/pkgs/tools/audio/mpris-scrobbler/default.nix b/nixpkgs/pkgs/tools/audio/mpris-scrobbler/default.nix
index 93960a5278fd..16070c91dd90 100644
--- a/nixpkgs/pkgs/tools/audio/mpris-scrobbler/default.nix
+++ b/nixpkgs/pkgs/tools/audio/mpris-scrobbler/default.nix
@@ -15,13 +15,13 @@
 
 stdenv.mkDerivation rec {
   pname = "mpris-scrobbler";
-  version = "0.4.0.1";
+  version = "0.4.95";
 
   src = fetchFromGitHub {
     owner  = "mariusor";
     repo   = "mpris-scrobbler";
     rev    = "v${version}";
-    sha256 = "0jzmgcb9a19hl8y7iwy8l3cc2vgzi0scw7r5q72kszfyxn0yk2gs";
+    sha256 = "sha256-Cqf0egS4XSDiKLdizNHPdS0Zt3jQxw9e78S7n23CuKI=";
   };
 
   postPatch = ''
diff --git a/nixpkgs/pkgs/tools/audio/nanotts/default.nix b/nixpkgs/pkgs/tools/audio/nanotts/default.nix
new file mode 100644
index 000000000000..85f786d20810
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/nanotts/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, popt, alsa-lib }:
+
+stdenv.mkDerivation {
+  pname = "nano-tts";
+  version = "unstable-2021-02-22";
+
+  src = fetchFromGitHub {
+    repo = "nanotts";
+    owner = "gmn";
+    rev = "d8b91f3d9d524c30f6fe8098ea7a0a638c889cf9";
+    sha256 = "sha256-bFu3U50zc90iQeWkqOsCipkueJUZI3cW5342jjYSnGI=";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ autoconf automake libtool ];
+  buildInputs = [ popt alsa-lib ];
+
+  patchPhase = ''
+    substituteInPlace "src/main.cpp" --replace "/usr/share/pico/lang" "$out/share/lang"
+    echo "" > update_build_version.sh
+  '';
+
+  installPhase = ''
+    install -Dm755 -t $out/bin nanotts
+    install -Dm644 -t $out/share/lang $src/lang/*
+  '';
+
+  meta = {
+    description = "Speech synthesizer commandline utility that improves pico2wave, included with SVOX PicoTTS";
+    homepage = "https://github.com/gmn/nanotts";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.strikerlulu ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/pa-applet/default.nix b/nixpkgs/pkgs/tools/audio/pa-applet/default.nix
index 4f67c86864d8..3d881717e792 100644
--- a/nixpkgs/pkgs/tools/audio/pa-applet/default.nix
+++ b/nixpkgs/pkgs/tools/audio/pa-applet/default.nix
@@ -11,9 +11,9 @@ stdenv.mkDerivation {
     sha256 = "sha256-ihvZFXHgr5YeqMKmVY/GB86segUkQ9BYqJYfE3PTgog=";
   };
 
-  nativeBuildInputs = [ pkg-config ];
+  nativeBuildInputs = [ pkg-config autoconf automake ];
   buildInputs = [
-    gtk3 libpulseaudio glibc automake autoconf libnotify libX11 xf86inputevdev
+    gtk3 libpulseaudio glibc libnotify libX11 xf86inputevdev
   ];
 
   preConfigure = ''
diff --git a/nixpkgs/pkgs/tools/audio/spotdl/default.nix b/nixpkgs/pkgs/tools/audio/spotdl/default.nix
index c9270ce58357..32dc47f53188 100644
--- a/nixpkgs/pkgs/tools/audio/spotdl/default.nix
+++ b/nixpkgs/pkgs/tools/audio/spotdl/default.nix
@@ -6,13 +6,13 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "spotdl";
-  version = "3.9.3";
+  version = "3.9.6";
 
   src = fetchFromGitHub {
     owner = "spotDL";
     repo = "spotify-downloader";
-    rev = "v${version}";
-    sha256 = "sha256-sx6UtblpsetKPwhlXB3Kj3OMIOyW9QluzB+YbtQGdYQ=";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JoeNVMuEslz7A7G4ZvikimZrG75YrH5Mx3Oamtfy4cM=";
   };
 
   propagatedBuildInputs = with python3.pkgs; [
@@ -22,10 +22,11 @@ python3.pkgs.buildPythonApplication rec {
     rapidfuzz
     mutagen
     ytmusicapi
+    yt-dlp
     beautifulsoup4
     requests
     unidecode
-    yt-dlp
+    setuptools
   ];
 
   checkInputs = with python3.pkgs; [
diff --git a/nixpkgs/pkgs/tools/audio/stt/default.nix b/nixpkgs/pkgs/tools/audio/stt/default.nix
index c8fff7ddbb4a..91e18f409a21 100644
--- a/nixpkgs/pkgs/tools/audio/stt/default.nix
+++ b/nixpkgs/pkgs/tools/audio/stt/default.nix
@@ -27,6 +27,7 @@ stdenv.mkDerivation rec {
   meta = with lib; {
     homepage = "https://github.com/coqui-ai/STT";
     description = "Deep learning toolkit for Speech-to-Text, battle-tested in research and production";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
     license = licenses.mpl20;
     platforms = [ "x86_64-linux" ];
     maintainers = with maintainers; [ rvolosatovs ];
diff --git a/nixpkgs/pkgs/tools/audio/tts/default.nix b/nixpkgs/pkgs/tools/audio/tts/default.nix
index a15a29f9d574..159d68feac0f 100644
--- a/nixpkgs/pkgs/tools/audio/tts/default.nix
+++ b/nixpkgs/pkgs/tools/audio/tts/default.nix
@@ -31,18 +31,19 @@ let
 in
 python.pkgs.buildPythonApplication rec {
   pname = "tts";
-  version = "0.6.1";
+  version = "0.7.1";
   format = "setuptools";
 
   src = fetchFromGitHub {
     owner = "coqui-ai";
     repo = "TTS";
     rev = "v${version}";
-    sha256 = "sha256-YzMR/Tl1UvjdSqV/h4lYR6DuarEqEIM7RReqYznFU4Q=";
+    sha256 = "sha256-ch+711soRfZj1egyaF0+6NrUJtf7JqfZuxQ4eDf1zas=";
   };
 
   postPatch = let
     relaxedConstraints = [
+      "cython"
       "gruut"
       "librosa"
       "mecab-python3"
@@ -50,6 +51,7 @@ python.pkgs.buildPythonApplication rec {
       "numpy"
       "umap-learn"
       "unidic-lite"
+      "pyworld"
     ];
   in ''
     sed -r -i \
@@ -129,9 +131,14 @@ python.pkgs.buildPythonApplication rec {
     "test_text_to_ids_phonemes_with_eos_bos_and_blank"
     # Takes too long
     "test_parametrized_wavernn_dataset"
+
+    # requires network
+    "test_voice_conversion"
   ];
 
   disabledTestPaths = [
+    # Requires network acccess to download models
+    "tests/aux_tests/test_remove_silence_vad_script.py"
     # phonemes mismatch between espeak-ng and gruuts phonemizer
     "tests/text_tests/test_phonemizer.py"
     # no training, it takes too long
@@ -146,7 +153,6 @@ python.pkgs.buildPythonApplication rec {
     "tests/tts_tests/test_tacotron2_d-vectors_train.py"
     "tests/tts_tests/test_tacotron2_speaker_emb_train.py"
     "tests/tts_tests/test_tacotron2_train.py"
-    "tests/tts_tests/test_tacotron2_train_fsspec_path.py"
     "tests/tts_tests/test_tacotron_train.py"
     "tests/tts_tests/test_vits_d-vectors_train.py"
     "tests/tts_tests/test_vits_multilingual_speaker_emb_train.py"
diff --git a/nixpkgs/pkgs/tools/audio/vgmtools/default.nix b/nixpkgs/pkgs/tools/audio/vgmtools/default.nix
new file mode 100644
index 000000000000..ce6add702e74
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/vgmtools/default.nix
@@ -0,0 +1,44 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, unstableGitUpdater
+, cmake
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vgmtools";
+  version = "unstable-2022-05-23";
+
+  src = fetchFromGitHub {
+    owner = "vgmrips";
+    repo = "vgmtools";
+    rev = "e0df1511ddf7b1207b448487616ff18a9049c278";
+    sha256 = "2nM3E/XeZ1OeOj3fPqvuJgQcPOtBerduGpVfpGLVhHQ=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  # Some targets are not enabled by default
+  makeFlags = [
+    "all" "opt_oki" "optdac" "optvgm32"
+  ];
+
+  passthru.updateScript = unstableGitUpdater {
+    url = "https://github.com/vgmrips/vgmtools.git";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/vgmrips/vgmtools";
+    description = "A collection of tools for the VGM file format";
+    license = licenses.gpl2; # Not clarified whether Only or Plus
+    maintainers = with maintainers; [ OPNA2608 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/audio/volumeicon/default.nix b/nixpkgs/pkgs/tools/audio/volumeicon/default.nix
index 4d726cbd2a9e..00690d016329 100644
--- a/nixpkgs/pkgs/tools/audio/volumeicon/default.nix
+++ b/nixpkgs/pkgs/tools/audio/volumeicon/default.nix
@@ -1,24 +1,36 @@
-{ pkgs, fetchurl, lib, stdenv, gtk3, pkg-config, intltool, alsa-lib }:
+{ fetchFromGitHub, lib, stdenv
+, autoreconfHook, intltool, pkg-config
+, gtk3, alsa-lib
+}:
 
-stdenv.mkDerivation {
+stdenv.mkDerivation rec {
   pname = "volumeicon";
   version = "0.5.1";
 
-  src = fetchurl {
-    url = "http://softwarebakery.com/maato/files/volumeicon/volumeicon-0.5.1.tar.gz";
-    sha256 = "182xl2w8syv6ky2h2bc9imc6ap8pzh0p7rp63hh8nw0xm38c3f14";
+  src = fetchFromGitHub {
+    owner = "Maato";
+    repo = "volumeicon";
+    rev = version;
+    hash = "sha256-zYKC7rOoLf08rV4B43TrGNBcXfSBFxWZCe9bQD9JzaA";
   };
 
-  nativeBuildInputs = [ pkg-config ];
-  buildInputs = [ gtk3 intltool alsa-lib ];
+  nativeBuildInputs = [
+    autoreconfHook
+    intltool
+    pkg-config
+  ];
+
+  buildInputs = [
+    gtk3
+    alsa-lib
+  ];
 
   meta = with lib; {
     description = "A lightweight volume control that sits in your systray";
-    homepage = "http://softwarebakery.com/maato/volumeicon.html";
-    platforms = pkgs.lib.platforms.linux;
+    homepage = "http://nullwise.com/volumeicon.html";
+    platforms = platforms.linux;
     maintainers = with maintainers; [ bobvanderlinden ];
-    license = pkgs.lib.licenses.gpl3;
+    license = licenses.gpl3;
   };
-
 }
 
diff --git a/nixpkgs/pkgs/tools/audio/yabridge/default.nix b/nixpkgs/pkgs/tools/audio/yabridge/default.nix
index 40c3b594dc98..6287c532382f 100644
--- a/nixpkgs/pkgs/tools/audio/yabridge/default.nix
+++ b/nixpkgs/pkgs/tools/audio/yabridge/default.nix
@@ -1,7 +1,6 @@
 { lib
 , multiStdenv
 , fetchFromGitHub
-, fetchpatch
 , substituteAll
 , pkgsi686Linux
 , libnotify
@@ -9,17 +8,24 @@
 , ninja
 , pkg-config
 , wine
-, boost
 , libxcb
 , nix-update-script
 }:
 
 let
+  # Derived from subprojects/asio.wrap
+  asio = fetchFromGitHub {
+    owner = "chriskohlhoff";
+    repo = "asio";
+    rev = "asio-1-22-1";
+    sha256 = "sha256-UDLhx2yI6Txg0wP5H4oNIhgKIB2eMxUGCyT2x/7GgVg=";
+  };
+
   # Derived from subprojects/bitsery.wrap
   bitsery = fetchFromGitHub {
     owner = "fraillt";
     repo = "bitsery";
-    rev = "c0fc083c9de805e5825d7553507569febf6a6f93";
+    rev = "v5.2.2";
     sha256 = "sha256-VwzVtxt+E/SVcxqIJw8BKPO2q7bu/hkhY+nB7FHrZpY=";
   };
 
@@ -27,15 +33,23 @@ let
   function2 = fetchFromGitHub {
     owner = "Naios";
     repo = "function2";
-    rev = "02ca99831de59c7c3a4b834789260253cace0ced";
+    rev = "4.2.0";
     sha256 = "sha256-wrt+fCcM6YD4ZRZYvqqB+fNakCNmltdPZKlNkPLtgMs=";
   };
 
+  # Derived from subprojects/ghc_filesystem.wrap
+  ghc_filesystem = fetchFromGitHub {
+    owner = "gulrak";
+    repo = "filesystem";
+    rev = "v1.5.12";
+    sha256 = "sha256-j4RE5Ach7C7Kef4+H9AHSXa2L8OVyJljDwBduKcC4eE=";
+  };
+
   # Derived from subprojects/tomlplusplus.wrap
   tomlplusplus = fetchFromGitHub {
     owner = "marzer";
     repo = "tomlplusplus";
-    rev = "8e669aa6990e0ed219c169d491472d749f54c393";
+    rev = "v3.0.1";
     sha256 = "sha256-l8ckbCqjz3GUfwStcl3H2C+un5dZfT2uLtayvdu93D4=";
   };
 
@@ -43,29 +57,29 @@ let
   vst3 = fetchFromGitHub {
     owner = "robbert-vdh";
     repo = "vst3sdk";
-    rev = "v3.7.4_build_25-patched";
+    rev = "v3.7.5_build_44-patched";
     fetchSubmodules = true;
-    sha256 = "sha256-oHRJZItw+he5M+beVZkUrhJir6rgFZ80ORzA73mJT2A=";
+    sha256 = "sha256-6cuEUa+BXa6MnAYIBq873n0NRLadcPfMX+kpf4ysE6M=";
   };
 in multiStdenv.mkDerivation rec {
   pname = "yabridge";
-  version = "3.8.0";
+  version = "4.0.2";
 
   # NOTE: Also update yabridgectl's cargoHash when this is updated
   src = fetchFromGitHub {
     owner = "robbert-vdh";
     repo = pname;
     rev = version;
-    sha256 = "sha256-XacJjHxsp60/l36pFPGonUyOsyFF2lmqplAaisHXZDY=";
+    sha256 = "sha256-rce6gxnB+RpG84Xakw0h4vZ8lyEQ41swWQGuwpomV2I=";
   };
 
   # Unpack subproject sources
   postUnpack = ''(
     cd "$sourceRoot/subprojects"
+    cp -R --no-preserve=mode,ownership ${asio} asio
     cp -R --no-preserve=mode,ownership ${bitsery} bitsery
-    cp packagefiles/bitsery/* bitsery
     cp -R --no-preserve=mode,ownership ${function2} function2
-    cp packagefiles/function2/* function2
+    cp -R --no-preserve=mode,ownership ${ghc_filesystem} ghc_filesystem
     cp -R --no-preserve=mode,ownership ${tomlplusplus} tomlplusplus
     cp -R --no-preserve=mode,ownership ${vst3} vst3
   )'';
@@ -74,22 +88,23 @@ in multiStdenv.mkDerivation rec {
     # Hard code bitbridge & runtime dependencies
     (substituteAll {
       src = ./hardcode-dependencies.patch;
-      boost32 = pkgsi686Linux.boost;
       libxcb32 = pkgsi686Linux.xorg.libxcb;
       inherit libnotify wine;
     })
-    # Remove with next yabridge update
-   (fetchpatch {
-      name = "fix-for-wine-7.1.patch";
-      url = "https://github.com/robbert-vdh/yabridge/commit/de470d345ab206b08f6d4a147b6af1d285a4211f.patch";
-      sha256 = "sha256-xJx1zvxD+DIjbkm7Ovoy4RaAvjx936/j/7AYUPh/kOo=";
-      includes = [ "src/wine-host/xdnd-proxy.cpp" ];
-    })
 
+    # Patch the chainloader to search for libyabridge through NIX_PROFILES
+    ./libyabridge-from-nix-profiles.patch
   ];
 
   postPatch = ''
     patchShebangs .
+    (
+      cd subprojects
+      cp packagefiles/asio/* asio
+      cp packagefiles/bitsery/* bitsery
+      cp packagefiles/function2/* function2
+      cp packagefiles/ghc_filesystem/* ghc_filesystem
+    )
   '';
 
   nativeBuildInputs = [
@@ -100,18 +115,12 @@ in multiStdenv.mkDerivation rec {
   ];
 
   buildInputs = [
-    boost
     libxcb
   ];
 
-  # Meson is no longer able to pick up Boost automatically.
-  # https://github.com/NixOS/nixpkgs/issues/86131
-  BOOST_INCLUDEDIR = "${lib.getDev boost}/include";
-  BOOST_LIBRARYDIR = "${lib.getLib boost}/lib";
-
   mesonFlags = [
     "--cross-file" "cross-wine.conf"
-    "-Dwith-bitbridge=true"
+    "-Dbitbridge=true"
 
     # Requires CMake and is unnecessary
     "-Dtomlplusplus:generate_cmake_config=false"
@@ -120,10 +129,8 @@ in multiStdenv.mkDerivation rec {
   installPhase = ''
     runHook preInstall
     mkdir -p "$out/bin" "$out/lib"
-    cp yabridge-group*.exe{,.so} "$out/bin"
-    cp yabridge-host*.exe{,.so} "$out/bin"
-    cp libyabridge-vst2.so "$out/lib"
-    cp libyabridge-vst3.so "$out/lib"
+    cp yabridge-host{,-32}.exe{,.so} "$out/bin"
+    cp libyabridge{,-chainloader}-{vst2,vst3}.so "$out/lib"
     runHook postInstall
   '';
 
@@ -140,8 +147,8 @@ in multiStdenv.mkDerivation rec {
   };
 
   meta = with lib; {
-    description = "Yet Another VST bridge, run Windows VST2 plugins under Linux";
-    homepage = "https://github.com/robbert-vdh/yabridge";
+    description = "A modern and transparent way to use Windows VST2 and VST3 plugins on Linux";
+    homepage = src.meta.homepage;
     license = licenses.gpl3Plus;
     maintainers = with maintainers; [ kira-bruneau ];
     platforms = [ "x86_64-linux" ];
diff --git a/nixpkgs/pkgs/tools/audio/yabridge/hardcode-dependencies.patch b/nixpkgs/pkgs/tools/audio/yabridge/hardcode-dependencies.patch
index 9f6bc0c9a9d5..e54ba1e9386d 100644
--- a/nixpkgs/pkgs/tools/audio/yabridge/hardcode-dependencies.patch
+++ b/nixpkgs/pkgs/tools/audio/yabridge/hardcode-dependencies.patch
@@ -1,16 +1,8 @@
 diff --git a/meson.build b/meson.build
-index 95ecb728..cb30f3af 100644
+index bfab6361..9085db0f 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -201,6 +201,7 @@ if with_32bit_libraries or with_bitbridge
-       'boost_filesystem',
-       static : with_static_boost,
-       dirs : [
-+        '@boost32@/lib',
-         # Used by Arch based distros
-         '/usr/local/lib32',
-         '/usr/lib32',
-@@ -224,7 +225,7 @@ if is_64bit_system
+@@ -187,7 +187,7 @@ if is_64bit_system
    xcb_64bit_dep = dependency('xcb')
  endif
  if with_32bit_libraries or with_bitbridge
@@ -19,25 +11,29 @@ index 95ecb728..cb30f3af 100644
  endif
  
  # These are all headers-only libraries, and thus won't require separate 32-bit
+diff --git a/src/common/notifications.cpp b/src/common/notifications.cpp
+index da27a1bf..18482e06 100644
+--- a/src/common/notifications.cpp
++++ b/src/common/notifications.cpp
+@@ -49,7 +49,7 @@ bool send_notification(const std::string& title,
+         }
+     }
+ 
+-    Process process("notify-send");
++    Process process("@libnotify@/bin/notify-send");
+     process.arg("--urgency=normal");
+     process.arg("--app-name=yabridge");
+     process.arg(title);
 diff --git a/src/plugin/utils.cpp b/src/plugin/utils.cpp
-index 1a457f03..20ca1e63 100644
+index acd431bc..8566281c 100644
 --- a/src/plugin/utils.cpp
 +++ b/src/plugin/utils.cpp
-@@ -107,7 +107,7 @@ std::string PluginInfo::wine_version() const {
-         access(wineloader_path.c_str(), X_OK) == 0) {
-         wine_path = wineloader_path;
-     } else {
--        wine_path = bp::search_path("wine").string();
-+        wine_path = "@wine@/bin/wine";
-     }
- 
-     bp::ipstream output;
-@@ -436,7 +436,7 @@ Configuration load_config_for(const fs::path& yabridge_path) {
- bool send_notification(const std::string& title,
-                        const std::string body,
-                        bool append_origin) {
--    const fs::path notify_send_path = bp::search_path("notify-send");
-+    const fs::path notify_send_path = "@libnotify@/bin/notify-send";
-     if (notify_send_path.empty()) {
-         return false;
-     }
+@@ -93,7 +93,7 @@ std::string PluginInfo::wine_version() const {
+     // The '*.exe' scripts generated by winegcc allow you to override the binary
+     // used to run Wine, so will will handle this in the same way for our Wine
+     // version detection. We'll be using `execvpe`
+-    std::string wine_path = "wine";
++    std::string wine_path = "@wine@/bin/wine";
+     // NOLINTNEXTLINE(concurrency-mt-unsafe)
+     if (const char* wineloader_path = getenv("WINELOADER");
+         wineloader_path && access(wineloader_path, X_OK) == 0) {
diff --git a/nixpkgs/pkgs/tools/audio/yabridge/libyabridge-from-nix-profiles.patch b/nixpkgs/pkgs/tools/audio/yabridge/libyabridge-from-nix-profiles.patch
new file mode 100644
index 000000000000..4d714d38fa20
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/yabridge/libyabridge-from-nix-profiles.patch
@@ -0,0 +1,71 @@
+diff --git a/src/chainloader/utils.cpp b/src/chainloader/utils.cpp
+index ccd65d33..c7136b37 100644
+--- a/src/chainloader/utils.cpp
++++ b/src/chainloader/utils.cpp
+@@ -29,8 +29,10 @@
+ namespace fs = ghc::filesystem;
+ 
+ void* find_plugin_library(const std::string& name) {
++    Logger logger = Logger::create_exception_logger();
++
+     // Just using a goto for this would probably be cleaner, but yeah...
+-    const auto impl = [&name]() -> void* {
++    const auto impl = [&name, &logger]() -> void* {
+         // If `name` exists right next to the Wine plugin host binary, then
+         // we'll try loading that. Otherwise we'll fall back to regular
+         // `dlopen()` for distro packaged versions of yabridge
+@@ -52,27 +54,28 @@ void* find_plugin_library(const std::string& name) {
+             }
+         }
+ 
+-        if (void* handle = dlopen(name.c_str(), RTLD_LAZY | RTLD_LOCAL)) {
+-            return handle;
++        auto nix_profiles = getenv("NIX_PROFILES");
++        if (!nix_profiles || nix_profiles[0] == '\0') {
++            logger.log("");
++            logger.log("ERROR: 'NIX_PROFILES' environment variable is not set");
++            logger.log("");
++            return nullptr;
+         }
+ 
+-        // One last Hail Mary, in case ldconfig was not set up correctly. This
+-        // might be relevant for some of the `/usr/local/*` locations (although
+-        // you really, really shouldn't install yabridge there, please, thank
+-        // you). Yabridgectl searches through these same directories.
+-        for (const auto& lib_dir : {
+-                 "/usr/lib",
+-                 "/usr/lib/x86_64-linux-gnu",
+-                 "/usr/lib64",
+-                 "/usr/local/lib",
+-                 "/usr/local/lib/x86_64-linux-gnu",
+-                 "/usr/local/lib64",
+-             }) {
+-            const fs::path candidate = fs::path(lib_dir) / name;
+-            if (void* handle =
+-                    dlopen(candidate.c_str(), RTLD_LAZY | RTLD_LOCAL)) {
++        // NIX_PROFILES is iterated in reverse from the most specific (the
++        // user profile) to the least specific (the system profile).
++        const std::string_view nix_profiles_view = nix_profiles;
++        auto segment_end = nix_profiles_view.size();
++        while (segment_end != std::string::npos) {
++            const auto next_segment_end = nix_profiles_view.rfind(' ', segment_end - 1);
++            const auto segment_begin = next_segment_end + 1;
++            const auto profile = nix_profiles_view.substr(segment_begin, segment_end - segment_begin);
++            const auto candidate = fs::path(profile) / "lib" / name;
++            if (auto handle = dlopen(candidate.c_str(), RTLD_LAZY | RTLD_LOCAL)) {
+                 return handle;
+             }
++
++            segment_end = next_segment_end;
+         }
+ 
+         return nullptr;
+@@ -82,8 +85,6 @@ void* find_plugin_library(const std::string& name) {
+     if (!handle) {
+         const fs::path this_plugin_path = get_this_file_location();
+ 
+-        Logger logger = Logger::create_exception_logger();
+-
+         logger.log("");
+         logger.log("Could not find '" + name + "'");
+         logger.log("");
diff --git a/nixpkgs/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch b/nixpkgs/pkgs/tools/audio/yabridgectl/chainloader-from-nix-profiles.patch
index 905068f75f8c..b687a6c01ae2 100644
--- a/nixpkgs/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch
+++ b/nixpkgs/pkgs/tools/audio/yabridgectl/chainloader-from-nix-profiles.patch
@@ -1,23 +1,23 @@
 diff --git a/tools/yabridgectl/src/config.rs b/tools/yabridgectl/src/config.rs
-index bc5f6a81..0fcd38d3 100644
+index 523a083b..399302e0 100644
 --- a/tools/yabridgectl/src/config.rs
 +++ b/tools/yabridgectl/src/config.rs
-@@ -23,6 +23,7 @@ use std::collections::{BTreeMap, BTreeSet, HashSet};
+@@ -22,6 +22,7 @@ use serde_derive::{Deserialize, Serialize};
+ use std::collections::{BTreeMap, BTreeSet, HashSet};
  use std::env;
- use std::fmt::Display;
  use std::fs;
 +use std::iter;
  use std::path::{Path, PathBuf};
  use which::which;
  use xdg::BaseDirectories;
-@@ -235,34 +236,27 @@ impl Config {
+@@ -213,34 +214,27 @@ impl Config {
                  }
              }
              None => {
 -                // Search in the system library locations and in `~/.local/share/yabridge` if no
 -                // path was set explicitely. We'll also search through `/usr/local/lib` just in case
 -                // but since we advocate against installing yabridge there we won't list this path
--                // in the error message when `libyabridge-vst2.so` can't be found.
+-                // in the error message when `libyabridge-chainloader-vst2.so` can't be found.
 -                let system_path = Path::new("/usr/lib");
 +                // Search through NIX_PROFILES & data home directory if no path was set explicitly.
 +                // NIX_PROFILES is iterated in reverse from the most specific (the user profile) to
@@ -43,7 +43,7 @@ index bc5f6a81..0fcd38d3 100644
 +
                  let mut candidates = lib_directories
 -                    .iter()
-                     .map(|directory| directory.join(LIBYABRIDGE_VST2_NAME));
+                     .map(|directory| directory.join(VST2_CHAINLOADER_NAME));
 +
                  match candidates.find(|directory| directory.exists()) {
                      Some(candidate) => candidate,
@@ -53,21 +53,21 @@ index bc5f6a81..0fcd38d3 100644
 -                            default search path using 'yabridgectl set --path=<path>'.",
 +                            "Could not find '{}' through 'NIX_PROFILES' or '{}'. You can override the \
 +                             default search path using 'yabridgectl set --path=<path>'.",
-                             LIBYABRIDGE_VST2_NAME,
+                             VST2_CHAINLOADER_NAME,
 -                            system_path.display(),
                              user_path.display()
                          ));
                      }
 diff --git a/tools/yabridgectl/src/main.rs b/tools/yabridgectl/src/main.rs
-index 48cce4fa..209e40e4 100644
+index 302ff8ae..9d9bbeac 100644
 --- a/tools/yabridgectl/src/main.rs
 +++ b/tools/yabridgectl/src/main.rs
-@@ -151,7 +151,7 @@ fn main() -> Result<()> {
-                         .help("Path to the directory containing 'libyabridge-{vst2,vst3}.so'")
+@@ -130,7 +130,7 @@ fn main() -> Result<()> {
+                         .help("Path to the directory containing 'libyabridge-chainloader-{vst2,vst3}.so'")
                          .long_help(
-                             "Path to the directory containing 'libyabridge-{vst2,vst3}.so'. If this \
--                             is not set, then yabridgectl will look in both '/usr/lib' and \
-+                             is not set, then yabridgectl will look through 'NIX_PROFILES' and \
+                             "Path to the directory containing 'libyabridge-chainloader-{vst2,vst3}.so'. \
+-                             If this is not set, then yabridgectl will look in both '/usr/lib' and \
++                             If this is not set, then yabridgectl will look through 'NIX_PROFILES' and \
                               '~/.local/share/yabridge' by default.",
                          )
                          .validator(validate_path)
diff --git a/nixpkgs/pkgs/tools/audio/yabridgectl/default.nix b/nixpkgs/pkgs/tools/audio/yabridgectl/default.nix
index d2e8438e0c9e..ebd5577e7d13 100644
--- a/nixpkgs/pkgs/tools/audio/yabridgectl/default.nix
+++ b/nixpkgs/pkgs/tools/audio/yabridgectl/default.nix
@@ -11,13 +11,14 @@ rustPlatform.buildRustPackage rec {
 
   src = yabridge.src;
   sourceRoot = "source/tools/yabridgectl";
-  cargoSha256 = "sha256-pwy2Q2HUCihr7W81hGvDm9EiZHk9G8knSy0yxPy6hl8=";
+  cargoSha256 = "sha256-09GsrQAI08Qih/TpbEAh4hn7IfvwyFdEoyzsSjcjGXY=";
 
   patches = [
-    # By default, yabridgectl locates libyabridge.so by using
-    # hard coded distro specific lib paths. This patch replaces those
-    # hard coded paths with lib paths from NIX_PROFILES.
-    ./libyabridge-from-nix-profiles.patch
+    # Patch yabridgectl to search for the chainloader through NIX_PROFILES
+    ./chainloader-from-nix-profiles.patch
+
+    # Dependencies are hardcoded in yabridge, so the check is unnecessary and likely incorrect
+    ./remove-dependency-verification.patch
   ];
 
   patchFlags = [ "-p3" ];
@@ -26,12 +27,14 @@ rustPlatform.buildRustPackage rec {
 
   postFixup = ''
     wrapProgram "$out/bin/yabridgectl" \
-      --prefix PATH : ${lib.makeBinPath [ wine ]}
+      --prefix PATH : ${lib.makeBinPath [
+        wine # winedump
+      ]}
   '';
 
   meta = with lib; {
     description = "A small, optional utility to help set up and update yabridge for several directories at once";
-    homepage = "https://github.com/robbert-vdh/yabridge/tree/master/tools/yabridgectl";
+    homepage = "${src.meta.homepage}/tree/${version}/tools/yabridgectl";
     license = licenses.gpl3Plus;
     maintainers = with maintainers; [ kira-bruneau ];
     platforms = yabridge.meta.platforms;
diff --git a/nixpkgs/pkgs/tools/audio/yabridgectl/remove-dependency-verification.patch b/nixpkgs/pkgs/tools/audio/yabridgectl/remove-dependency-verification.patch
new file mode 100644
index 000000000000..2f860fb4f15e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/audio/yabridgectl/remove-dependency-verification.patch
@@ -0,0 +1,18 @@
+diff --git a/tools/yabridgectl/src/actions.rs b/tools/yabridgectl/src/actions.rs
+index 9ecdb140..061a8ff3 100644
+--- a/tools/yabridgectl/src/actions.rs
++++ b/tools/yabridgectl/src/actions.rs
+@@ -712,13 +712,6 @@ pub fn do_sync(config: &mut Config, options: &SyncOptions) -> Result<()> {
+     // be the case if we get to this point though.
+     verify_path_setup(config)?;
+ 
+-    // This check is only performed once per combination of Wine and yabridge versions
+-    verify_wine_setup(config)?;
+-
+-    // Yabridge uses notify-send to relay important information when something's very wrong, so
+-    // we'll check whether this is installed
+-    verify_external_dependencies()?;
+-
+     Ok(())
+ }
+