Difference between revisions of "Music Player Daemon"

From ArchWiki
Jump to: navigation, search
m (Advanced Setup)
Line 50: Line 50:
 
  $EDITOR /etc/mpd.conf
 
  $EDITOR /etc/mpd.conf
  
 +
===New Setup Instructions===
 +
 +
'''Keeps the setup in /var and uses "mpd" as default user instead of cluttering up ~/'''
 +
music_directory      "/home/user/music" <-- dir to your music collection. Read steps below carefully, permissions need to be set correctly.
 +
playlist_directory    "/var/lib/mpd/playlists"
 +
db_file              "/var/lib/mpd/db"
 +
log_file              "/var/log/mpd/mpd.log"
 +
error_file            "/var/log/mpd/mpd.error"
 +
pid_file              "/var/run/mpd/mpd.pid"
 +
state_file            "/var/lib/mpd/mpdstate"
 +
user                  "mpd"
 +
bind_to_address      "127.0.0.1"
 +
port                  "6600"
 +
 +
* Keep user as "mpd", double check to make sure user "mpd" home directory is set to /var/lib/mpd
 +
`cat /etc/passwd | grep mpd`.
 +
* Also make sure /var/lib/mpd is owned by mpd:mpd.
 +
* now as root create the files you specified in /etc/mpd.conf, if directories do not exist, create those as well.
 +
$ touch /var/lib/mpd/db
 +
$ touch /var/lib/mpd/mpdstate
 +
$ touch /var/run/mpd/mpd.pid
 +
$ touch /var/log/mpd/mpd.log
 +
$ touch /var/log/mpd/mpd.error
 +
* MPD needs to have +x permissions on '''ALL''' parent directories to your music collection(IE. if it's located outisde of "mpd" home directory /var/lib/mpd).
 +
* By default useradd sets permissions on home dir to 1700 drwx------. So if your like me you will need to change permissions of /home/user
 +
* Example... my music collection is located /home/user/music.
 +
$ chmod a+x /home/user
 +
$ chmod -R a+x /home/user/music
 +
* Now change the ownership of the directories and files you created to user "mpd"
 +
$ chown -R mpd:mpd /var/lib/mpd
 +
$ chown -R mpd:mpd /var/run/mpd
 +
$ chown -R mpd:mpd /var/log/mpd
 +
* If your music collection is contained under multiple dir. you can make symbolic link under /var/lib/mpd then set 'music_dir' in mpd.conf to the directory holding the symbolic links. Remeber to set permissions accordingly on the directories being linked.
 +
* Create mpd database as root.
 +
$ mpd --create-db
 +
 +
'''Continue below'''
 +
 +
===Old setup instructions===
 +
 +
'''Keeps setup in the ~/ directory of user. This is preferred way as many struggle with permissions running mpd as user "mpd"'''
 
* In /etc/mpd.conf, look for these options and configure them as listed below:  
 
* In /etc/mpd.conf, look for these options and configure them as listed below:  
  
Line 72: Line 113:
 
* Note: It might be advisable to add the following to /etc/mpd.conf so that, when changing the volume in an mpd client, the system wide volume isn't affected:
 
* Note: It might be advisable to add the following to /etc/mpd.conf so that, when changing the volume in an mpd client, the system wide volume isn't affected:
 
  mixer_type            "software"
 
  mixer_type            "software"
 
 
* Look at the line starting with ''user'' and replace '''mpd''' with your username. Save changes and exit the editor.
 
* Look at the line starting with ''user'' and replace '''mpd''' with your username. Save changes and exit the editor.
 
* Now exit the root mode and log as the normal user (the same you specified in mpd.conf).
 
* Now exit the root mode and log as the normal user (the same you specified in mpd.conf).
Line 89: Line 129:
 
* Create the mpd database  (This can take a while depending on the size of your collection.):  
 
* Create the mpd database  (This can take a while depending on the size of your collection.):  
 
  $ mpd --create-db
 
  $ mpd --create-db
 +
 +
'''IF YOU FOLLOWED NEW INSTRUCTIONS, CONTINUE HERE.'''
  
 
* Change back to root, and start mpd:
 
* Change back to root, and start mpd:

Revision as of 22:43, 27 April 2009

Template:I18n links start Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n links end

What is mpd?

mpd (Music Player Daemon) is an audio player that has a server-client architecture. mpd runs in the background as a daemon, manages playlists and a music database, and uses very few resources. In order to interface with it, you need a separate client. More information can be found on their website

Daemon Install Procedure

Sync and install with pacman:

# pacman -S mpd

Configure mpd

For more information about mpd configuration visit http://mpd.wikia.com/wiki/Configuration

Timeline of mpd's behavior on a typical working setup

  • mpd is started on boot by /etc/rc.conf, by including it in the DAEMONS array. (Or, this can be done manually each session by running /etc/rc.d/mpd start with root privileges).
  • Since mpd is now started as root, it first reads the /etc/mpd.conf file.
  • mpd reads the user variable in the /etc/mpd.conf file, and changes from root to this user.
  • mpd then reads the contents of the /etc/mpd.conf file and configures itself accordingly.

Notice that mpd changes the running user from root to the one named in the /etc/mpd.conf file. This way, uses of "~" in the configuration file point correctly to the home user's directory, and not root's directory. It may be worthwhile to change all uses of "~" to "/home/username" to avoid any confusion over this aspect of mpd's behavior.

Quick Single User Installation

  • As root, check if /etc/mpd.conf exists and delete the file if it does. This is safe.

Mpd comes with an example configuration file, available at /etc/mpd.conf.example. This file holds an abundance of information on mpd configuration, and holds default mixer values you can simply uncomment.

  • As root, copy this example file to /etc/mpd.conf.
cp /etc/mpd.conf.example /etc/mpd.conf

Never put this file in the user's directory like some tutorials suggest. This would complicate things and most of the time doing this is useless (notice you're reading a quick installation howto). If you previously created a .mpdconf file in your home, remove it now. This is important to prevent conflicts. When placing it in /etc, like we do here, mpd will be able to run as a daemon at boot. Otherwise, a script would be needed to run mpd AFTER the user has logged (like kdm or ~/.fluxbox/startup) or it would require a manual move each time. For a single music collection, the method used here is simply better, even while the collection is shared to multiple users. Also, don't be afraid about root privileges: even while mpd runs as a daemon, it never completely runs as root since it automatically drops its root privileges after execution.

To make audio output actually work ensure that you have setup audio card and mixer correctly. See ALSA. Do not forget to unmute the required channels in alsamixer, raise the volume and save changes with alsactl store. See ~/.mpd/error if it still doesn't work.

Make sure your card can do hardware mixing (most of them can, including onboard audio). Or else this could cause problems with multiple sound playback. For example, this can prevent Mplayer from playing back sound while the mpd daemon is running, returning an audio error message stating the device is busy.


We can now move on to edit the file, once again, as root:

$EDITOR /etc/mpd.conf

New Setup Instructions

Keeps the setup in /var and uses "mpd" as default user instead of cluttering up ~/

music_directory       "/home/user/music" <-- dir to your music collection. Read steps below carefully, permissions need to be set correctly.
playlist_directory    "/var/lib/mpd/playlists"
db_file               "/var/lib/mpd/db"
log_file              "/var/log/mpd/mpd.log"
error_file            "/var/log/mpd/mpd.error"
pid_file              "/var/run/mpd/mpd.pid"
state_file            "/var/lib/mpd/mpdstate"
user                  "mpd"
bind_to_address       "127.0.0.1"
port                  "6600"
  • Keep user as "mpd", double check to make sure user "mpd" home directory is set to /var/lib/mpd
`cat /etc/passwd | grep mpd`. 
  • Also make sure /var/lib/mpd is owned by mpd:mpd.
  • now as root create the files you specified in /etc/mpd.conf, if directories do not exist, create those as well.
$ touch /var/lib/mpd/db
$ touch /var/lib/mpd/mpdstate
$ touch /var/run/mpd/mpd.pid
$ touch /var/log/mpd/mpd.log
$ touch /var/log/mpd/mpd.error
  • MPD needs to have +x permissions on ALL parent directories to your music collection(IE. if it's located outisde of "mpd" home directory /var/lib/mpd).
  • By default useradd sets permissions on home dir to 1700 drwx------. So if your like me you will need to change permissions of /home/user
  • Example... my music collection is located /home/user/music.
$ chmod a+x /home/user
$ chmod -R a+x /home/user/music
  • Now change the ownership of the directories and files you created to user "mpd"
$ chown -R mpd:mpd /var/lib/mpd
$ chown -R mpd:mpd /var/run/mpd
$ chown -R mpd:mpd /var/log/mpd
  • If your music collection is contained under multiple dir. you can make symbolic link under /var/lib/mpd then set 'music_dir' in mpd.conf to the directory holding the symbolic links. Remeber to set permissions accordingly on the directories being linked.
  • Create mpd database as root.
$ mpd --create-db

Continue below

Old setup instructions

Keeps setup in the ~/ directory of user. This is preferred way as many struggle with permissions running mpd as user "mpd"

  • In /etc/mpd.conf, look for these options and configure them as listed below:
music_directory       "~/Music"
playlist_directory    "~/Playlists"
db_file               "~/.mpd/db"
log_file              "~/.mpd/log"
error_file            "~/.mpd/error"
pid_file              "~/.mpd/mpd.pid"
state_file            "~/.mpd/mpdstate"
user                  "mpd" (replace this with your username)
bind_to_address       "127.0.0.1"
port                  "6600"
#connection_timeout   "60"
#max_playlist_length  "16384"
#filesystem_charset   "ISO-8859-1"
#id3v1_encoding       "ISO-8859-1"


These are the most common lines. You shouldn't need anything else. You may want to change all paths to absolute paths, in order to avoid any ambiguities in the future in case you forget how mpd behaves (see above). See the file /etc/mpd.conf.example for more specific options.

  • Note: It might be advisable to add the following to /etc/mpd.conf so that, when changing the volume in an mpd client, the system wide volume isn't affected:
mixer_type            "software"
  • Look at the line starting with user and replace mpd with your username. Save changes and exit the editor.
  • Now exit the root mode and log as the normal user (the same you specified in mpd.conf).
  • Create the new directories
$ mkdir ~/Music
$ mkdir ~/Playlists
$ mkdir ~/.mpd
  • Make symbolic links to your music collection:
$ ln -s /media/sda5/music_collection1 ~/Music
$ ln -s /media/sdb7/music_collection2 ~/Music
  • Create the pid file
$ touch ~/.mpd/mpd.pid
  • Create the mpd database (This can take a while depending on the size of your collection.):
$ mpd --create-db

IF YOU FOLLOWED NEW INSTRUCTIONS, CONTINUE HERE.

  • Change back to root, and start mpd:
$ /etc/rc.d/mpd start

Although you can start mpd as root with just "mpd", doing the above gives more information (such as on htop).

  • Edit /etc/rc.conf and add mpd to the list of daemons to start on bootup.
  • To test it out, install a very small client called mpc
# pacman -S mpc        (as root)
$ mpc ls |  mpc  add   (as user)
$ mpc play

Template:Box Note

Advanced Setup

MPD neet not be started with root permissions. The only reason why MPD needs to be started as root (by being called from /etc/rc.conf) is because the default files and folders in the default configuration file points to directories owned by root (the /var directory). A less common, but perhaps more sensible, approach is to make MPD work with files and directories owned by a normal user. Running MPD as a normal user has several advantages: (1) can easily have a single directory ~/.mpd (or any other directory under /home/username) for all MPD configuration files, (2) no read/write permission errors, and (3) more flexible calls to MPD by using ~/.xinitrc instead of including 'mpd' in the /etc/rc.conf DAEMONS array.

The following steps shows how to run MPD as a normal user.

First, copy the contents of the default MPD configuration file in /etc/mpd.conf.example to your home directory. A good place would be "/home/usr/.mpd/config". Second, make sure the relevant variables point to this ~/.mpd directory, as follows:

music_directory "/home/username/.mpd/music" # can be ~/.mpd/music for brevity
playlist_directory "/home/username/.mpd/playlist"
db_file "/home/username/.mpd/mpd.db"
log_file "/home/username/.mpd/mpd.log"
error_file "/home/username/.mpd/mpd.error"
pid_file "/home/username/.mpd/mpd.pid"
state_file "/home/username/.mpd/mpdstate"
user "username"

The only thing that must exist with the above setup is the ~/.mpd directory, along with ~/.mpd/music and ~/.mpd/playlist. This is because any file that does not yet exist (mpd.db, mpd.log, etc.) can be created by MPD automatically, since the target directory/files all reside under the normal user's home directory.

Third, let MPD start on bootup by calling it from your ~/.xinitrc as follows:

mpd /home/username/.mpd/config

Note that you don't have to put a "&" at the end of the line here, since MPD will automatically daemonize itself.

Lastly, delete the entry 'mpd' from your DAEMONS array in /etc/rc.conf, as we are not running it as root anymore.

Multi-MPD Setup

If you want a second MPD daemon (e.g., with icecast output to share music over the network) to use the same music and playlist as the one above, simply copy the above configuration file and make a new file (e.g., /home/username/.mpd/config-icecast), and only change the log_file, error_file, pid_file, and state_file parameters (e.g., mpd-icecast.log, mpd-icecast.error, and so on); using the same directory paths for the music and playlist directories would ensure that this second MPD daemon would use the same music collection as your first one. Then, call this second daemon the same way from your ~/.xinitrc above. (Just be sure to have a different port number, so as to not conflict with your first MPD daemon).

Troubleshooting

Autodetection failed

During the start of mpd, it tries to autodetect your set-up and configure output and volume control accordingly. Though this mostly goes well, it will fail for some systems. It may help to tell mpd specifically what to use as output and mixer control. If you copied /etc/mpd.conf over from /etc/mpd.conf.example as mentionned above, you can simply uncomment:

Example for alsa output type:

audio_output {
	type			"alsa"
	name			"My ALSA Device"
	device			"hw:0,0"	# optional
	format			"44100:16:2"	# optional
}

Example for alsa mixer:

mixer_type			"alsa"
mixer_device			"default"
mixer_control			"PCM"

Note: in case of permission problems when using ESD with mpd run this as root:

# chsh -s /bin/true mpd

Tips

To get rid of timeouts (i.e. when you paused music for long time) in gpmc and other clients uncomment and increase connection_timeout option in mpd.conf.

If files and/or titles are shown in wrong encoding, uncomment and change filesystem_charset and id3v1_encoding options. Note that you cannot set encoding for ID3 v2 tags. To workaround this you may use external tag readers.

If you want to use another computer to control mpd over a network, the bind_to_address option in mpd.conf will need to be set to either your IP address, or any if your IP address changes frequently. Remember to add mpd to the /etc/hosts.allow file to enable external access.

Client Install Procedure

Install a client program for mpd. Popular options are:


Install with:

# pacman -Sy mpc
# pacman -Sy ncmpc
# pacman -Sy ncmpcpp
# pacman -Sy sonata
# pacman -Sy gmpc

Extra stuff

Last.fm scrobbling

To scrobble your songs to Last.fm using MPD there are several alternatives.

mpdscribble

mpdscribble is another daemon, but is only available in the AUR. This is arguably the best alternative, because it's the semi-official MPD scrobbler and uses the new "idle" feature in MPD for more accurate scrobbling. Also, you don't need root access to configure it, because it doesn't need any changes to /etc at all. Visit the official website for more information.

To install mpdscribble, just install it from the AUR and do the following (not as root):

  • mkdir ~/.mpdscribble
  • Create the file ~/.mpdscribble/mpdscribble.conf and add the following:
username = <your last.fm username>
password = <md5 sum of your last.fm password> # Generated using "echo -n password | md5sum"
host = <your mpd host> # defaults to $MPD_HOST or localhost
port = <your mpd port> # defaults to $MPD_PORT or 6600
log = ~/.mpdscribble/mpdscribble.log
cache = ~/.mpdscribble/mpdscribble.cache
verbose = 2
sleep = 1
musicdir = <your music directory>
  • Add mpdscribble to your ~/.xinitrc

Sonata

The easiest way, if you don't care about having to have a program window open all the time, is using Sonata which is a graphical frontend to MPD. It has built-in support for Last.fm scrobbling in its preferences. The downside of this is that Sonata doesn't cache your songs if for some reason you don't happen to have an Internet connection at the time of playing.

lastfmsubmitd

lastfmsubmitd is a daemon which is available in the "community" repository. To install it, first edit /etc/lastfmsubmitd.conf and add both lastfmsubmitd and lastmp to the DAEMONS array in /etc/rc.conf.

Last.fm playback with lastfmproxy

lastfmproxy is a python script that streams a last.fm music stream to another media player. To setup, install from aur yaourt -S lastfmproxy and then edit /usr/share/lastfmproxy/config.py. If you plan to only stream to mpd on the same host, just edit the login info.

NOTE: Since it installs to a read only directory but it requires read/write access for features like saving previously listened to stations, it would be wise to copy /usr/share/lastfmproxy to your home directory.

Start lastfmproxy with lastfmproxy and visit http://localhost:1881/ in your web browser. To add a last.fm station navigate to http://localhost:1881/ followed by the lastfm:// url. Example: http://localhost:1881/lastfm://globaltags/punk. Navigate back to http://localhost:1881/ and download the m3u file by selecting the Start Listening link. Simply add it to your music library path.

Never play on start

If you don't want mpd to always play on your system start, but yet you want to preserve the other state information, add the following lines to your /etc/rc.d/mpd file:

   ...
   stat_busy "Starting Music Player Daemon"
   # always start in paused state
   awk '/^state_file[ \t]+"[^"]+"$/ {
       match($0, "\".+\"")
       sfile = substr($0, RSTART + 1, RLENGTH - 2)
   } /^user[ \t]+"[^"]+"$/ {
       match($0, "\".+\"")
       user = substr($0, RSTART + 1, RLENGTH - 2)
   } END {
       if (sfile == "")
               exit;
       if (user != "")
               sub(/^~/, "/home/" user, sfile)
       system("sed -i \x27s|^\\(state:[ \\t]\\{1,\\}\\)play$|\\1pause|\x27 \x27" sfile "\x27")
   }' /etc/mpd.conf
   /usr/bin/mpd /etc/mpd.conf &> /dev/null
   ...

This will change the player status to "paused", if it was stopped while playing. Next, you want this file to be preserved, so mpd updates won't erase this edit. Add (or edit) this line to your /etc/pacman.conf:

NoUpgrade = etc/rc.d/mpd

MPD & Alsa

Sometimes, when you use other audio output, e.g: some web pages containing Flash applets, mpd cannot reproduce anything anymore (until you restart). The error looks something like: (if you search the file /var/log/mpd/mpd.error)

Error opening alsa device "hw:0,0": Device or resource busy

And here is the solution (dmix saving our life again). Apply these lines in your /etc/mpd.conf:

audio_output {
        type                    "alsa"
        name                    "Sound Card"
        options                 "dev=dmixer"
        device                  "plug:dmix"
}

And then restart with /etc/rc.d/mpd restart

Searching on Internet I found the reason for why that happens in Gentoo's wiki:

  • The sound card does not support hardware mixing (uses dmix plugin)
  • An application does not work with ALSA with it's default settings

High CPU usage with ALSA

When using MPD with ALSA, users may experience MPD taking up lots of CPU (around 20-30%). This is caused by most sound cards supporting 48kHz and most music being 44kHz, thus forcing MPD to resample it. This operation takes lots of CPU cycles and results into high usage.

For most users the problem should be solved by telling MPD not to use resampling by adding auto_resample "no" into audio_output-part of /etc/mpd.conf

Example from mpd.conf:

audio_output {
   type			"alsa"
   name			"My ALSA Device"
   auto_resample		"no"
}

Some users might also want to tell dmix to use 44kHz as well. More info about tuning performance of your MPD can be found from: MPD wiki

Control mpd with lirc

There are already some clients designe for communications between lircd and mpd, however, as far as the practical use, they aren't very useful since their funcstions are limited.

It's recommended to use mpc with irexec. mpc is a command line player which only sends the command to mpd and exits immediately, which is perfect for irexec, the command runner included in lirc. What irexec does is that it runs a specified command once received a remote control button.

First of all, please setup your remotes as referred to the Lirc article.

Edit your favored lirc startup configuration file, default location is ~/.lircrc

Fill the file with the following pattern:

begin
     prog = irexec
     button = <button_name>
     config = <command_to_run>
     repeat = <0 or 1>
end

An useful example:

## irexec
begin
     prog = irexec
     button = play_pause
     config = mpc toggle
     repeat = 0
end

begin
     prog = irexec
     button = stop
     config = mpc stop
     repeat = 0
end
begin
     prog = irexec
     button = previous
     config = mpc prev
     repeat = 0
end
begin
     prog = irexec
     button = next
     config = mpc next
     repeat = 0
end
begin
     prog = irexec
     button = volup
     config = mpc volume +2
     repeat = 1
end
begin
     prog = irexec
     button = voldown
     config = mpc volume -2
     repeat = 1
end
begin
     prog = irexec
     button = pbc
     config = mpc random
     repeat = 0
end
begin
     prog = irexec
     button = pdvd
     config = mpc update
     repeat = 0
end
begin
     prog = irexec
     button = right
     config = mpc seek +00:00:05
     repeat = 0
end
begin
     prog = irexec
     button = left
     config = mpc seek -00:00:05
     repeat = 0
end
begin
     prog = irexec
     button = up
     config = mpc seek +1%
     repeat = 0
end
begin
     prog = irexec
     button = down
     config = mpc seek -1%
     repeat = 0
end

There are more functions for mpc, run man mpc for more info.

External links