MPD: Difference between revisions
imported>The pumpkin man mNo edit summary |
→Installation: fix startWhenNeeded option |
||
(6 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
== Installation == | == Installation == | ||
A typical config, running MPD system-wide, will look like this: | |||
<syntaxhighlight lang="nix"> | |||
services.mpd = { | |||
enable = true; | |||
musicDirectory = "/path/to/music"; | |||
extraConfig = '' | |||
# must specify one or more outputs in order to play audio! | |||
# (e.g. ALSA, PulseAudio, PipeWire), see next sections | |||
''; | |||
# Optional: | |||
network.listenAddress = "any"; # if you want to allow non-localhost connections | |||
network.startWhenNeeded = true; # systemd feature: only start MPD service upon connection to its socket | |||
}; | |||
</syntaxhighlight> | |||
Still missing in the above configuration is one or more <code>audio_output</code>s. We will now see how MPD can be configured to work with ALSA, PulseAudio and PipeWire. | |||
== PulseAudio == | |||
In order to use MPD with PulseAudio, enable sound support in the NixOS <code>configuration.nix</code> : | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
# Enable sound. | # Enable sound. | ||
Line 6: | Line 24: | ||
hardware.pulseaudio.enable = true; | hardware.pulseaudio.enable = true; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Then, add a PulseAudio output to MPD: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
services.mpd.extraConfig = '' | services.mpd.extraConfig = '' | ||
audio_output { | audio_output { | ||
type "pulse" | type "pulse" | ||
name " | name "My PulseAudio" # this can be whatever you want | ||
} | } | ||
''; | ''; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Now, according to <cite>https://wiki.archlinux.org/index.php/Music_Player_Daemon/Tips_and_tricks#Local_(with_separate_mpd_user)</cite>, this will not work, because MPD and Pulseaudio are ran by different users | Now, according to <cite>https://wiki.archlinux.org/index.php/Music_Player_Daemon/Tips_and_tricks#Local_(with_separate_mpd_user)</cite>, this will not work, because MPD and Pulseaudio are ran by different users. | ||
=== PulseAudio workaround 1 === | |||
One way to work around this issue is to configure MPD to use PulseAudio's TCP module to send sound to localhost". | |||
To enable the required PulseAudio modules, add | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.pulseaudio.extraConfig = "load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1"; | hardware.pulseaudio.extraConfig = "load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1"; | ||
Line 30: | Line 45: | ||
to <code>configuration.nix</code> | to <code>configuration.nix</code> | ||
And add <code>server "127.0.0.1"</code> to MPD's config to tell it to connect to | And add <code>server "127.0.0.1"</code> to MPD's config to tell it to connect to PulseAudio's local sound server. | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
services.mpd.extraConfig = '' | services.mpd.extraConfig = '' | ||
Line 38: | Line 51: | ||
type "pulse" | type "pulse" | ||
name "Pulseaudio" | name "Pulseaudio" | ||
server "127.0.0.1" # add this line - MPD must connect to the local sound server | |||
} | } | ||
''; | ''; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
After editing the configuration and running <code># nixos-rebuild switch</code>, you can test if everything is working by using a MPD client, such as <code>MPC</code>. | |||
=== PulseAudio workaround 2 === | |||
Another workaround is to configure NixOS to run PulseAudio system-wide. | |||
<syntaxhighlight lang="nix"> | |||
hardware.pulseaudio.systemWide = true; | |||
services.mpd.extraConfig = '' | |||
audio_output { | |||
type "pulse" | |||
name "Pulseaudio" | |||
mixer_type "hardware" # optional | |||
mixer_device "default" # optional | |||
mixer_control "PCM" # optional | |||
mixer_index "0" # optional | |||
} ''; | |||
}; | |||
</syntaxhighlight> | |||
== ALSA == | |||
You can also use alsa, just add audio output to services.mpd.extraConfig: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
services.mpd.extraConfig = '' | services.mpd.extraConfig = '' | ||
audio_output { | audio_output { | ||
type " | type "alsa" | ||
name " | name "My ALSA" | ||
device "hw:0,0" # optional | |||
format "44100:16:2" # optional | |||
mixer_type "hardware" | |||
mixer_device "default" | |||
mixer_control "PCM" | |||
} | } | ||
''; | ''; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== PipeWire == | |||
Make sure PipeWire is enabled. See [[PipeWire]] | |||
To use PipeWire, create an <code>audio_output</code> for it: | |||
<syntaxhighlight lang="nix"> | |||
services.mpd.extraConfig = '' | |||
audio_output { | |||
type "pipewire" | |||
name "My PipeWire Output" | |||
} | |||
''; | |||
</syntaxhighlight> | |||
See https://mpd.readthedocs.io/en/stable/plugins.html#pipewire for more options. | |||
However, similar to PulseAudio, MPD cannot connect to the PipeWire socket because MPD will by default run under a different user than PipeWire. | |||
=== PipeWire workaround === | |||
PipeWire typically runs as a normal user, while MPD will run under a system user. A workaround is to configure MPD to run under the same user as PipeWire: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
services.mpd.user = "userRunningPipeWire"; | |||
systemd.services.mpd.environment = { | |||
# https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/609 | |||
XDG_RUNTIME_DIR = "/run/user/${toString config.users.users.userRunningPipeWire.uid}"; # User-id must match above user. MPD will look inside this directory for the PipeWire socket. | |||
services.mpd = { | |||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Source: https://github.com/NixOS/nixpkgs/issues/102547#issuecomment-1016671189 | |||
== Further reading == | == Further reading == | ||
MPD's output plugin documentation: https://mpd.readthedocs.io/en/stable/plugins.html#output-plugins | |||
Arch Wiki : https://wiki.archlinux.org/index.php/Mpd | |||
[[Category:Audio]] | |||
[[Category:Applications]] |