Sunday, August 25, 2013

MPD and NCMPC setup

I decided on mpd (Music Player Daemon) and ncmpc (NCurses Music Player Client) to play my music.  The following commands install the necessary packages then use insserv to remove mpd from being started automatically by root since I want to configure and run mpd as user.  The cat command output shows that mpd was part of the system startup before the innserv command. After the insserv command the lack of output from that same cat command demonstrates mpd was removed from the startup file. The ps command checks for any instances of mpd, and the final command stops it if needed.
ROOTPROMPT$ apt-get install mpd ncmpc
ROOTPROMPT$ cat /etc/init.d/.depend.start | grep mpd
TARGETS = motd killprocs rpcbind nfs-common rsyslog sudo mpd atd exim4 rsync cron ssh dbus acpid bootlogs single rmnologin rc.local
rmnologin: sudo atd rsyslog rpcbind nfs-common exim4 motd bootlogs rsync cron ssh dbus acpid mpd
rc.local: atd rsyslog rpcbind nfs-common exim4 motd bootlogs rsync cron sudo ssh dbus acpid mpd
ROOTPROMPT$ insserv -r mpd
ROOTPROMPT$ cat /etc/init.d/.depend.start | grep mpd
ROOTPROMPT$ ps aux | grep mpd
root      5029  0.0  0.0 322696  7456 ?        Ssl  23:39   0:00 mpd
root      5033  0.0  0.0   7828   872 pts/1    S+   23:39   0:00 grep mpd
ROOTPROMPT$ /etc/init.d/mpd stop
If your system does not use dependency based boot sequence you will have to configure the mpd service using the update-rc.d command.

update: With systemd I had to run the following to prevent mpd startup on boot
ROOTPROMPT$ systemctl disable mpd
ROOTPROMPT$ systemctl disable mpd.service
ROOTPROMPT$ systemctl disable mpd.socket 
Found help on crunchbang mpd how to

Copy the example mpdconf file to your home directory.
$> gunzip usr/share/doc/mpd/examples/mpd.conf.gz > ~/.mpdconf
Edit this file to change the music_directory, playlist_directory, db_file, log_file, error_file, pid_file, and state_file. Also uncomment the mixer_type line for software volume control.  Below are the relevant exerpts from my config file showing the previous entry (commented out), the comment with my name to remind me I changed it, and my new entry. For easy viewing I've cut the comments, but I recommend reading them as you edit.
#music_directory  "/var/lib/mpd/music"
#ibyrd
music_directory     "/home/byrdi01/music"
...
#playlist_directory  "/var/lib/mpd/playlists"
#ibyrd
playlist_directory  "/home/byrdi01/.mpd/playlists"
...
#db_file   "/var/lib/mpd/tag_cache"
#ibyrd
db_file             "/home/byrdi01/.mpd/database"
...
#log_file   "/var/log/mpd/mpd.log"
#ibyrd
log_file            "/home/byrdi01/.mpd/log"
...
#pid_file   "/var/run/mpd/pid"
#ibyrd
pid_file            "/home/byrdi01/.mpd/pid"
...
#state_file   "/var/lib/mpd/state"
#ibyrd
state_file   "/home/byrdi01/.mpd/state"
...
#ibyrd.  uncomment the next line to enable software control of volume.
mixer_type   "software"

My music is in the "/home/byrdi01/music" directory. Change this as appropriate to tell mpd where your music is located. Create the .mpd/ and .mpd/playlists directories.
$> mkdir -p /home/byrdi01/.mpd/playlists
Now whenever you want to play music you need to start mpd and ncmpc
$> mp
$> ncmpc
The ncmpc client will take up the entire xterm. Press 1 in ncmpc to get the list of commands. 'q' quits ncmpc, but mpd continues, so either stop playing music before exiting ncmpc or run
$> mpd --kill
to kill the daemon.
The mpd wiki has a good mpd configuration page, and I used some information from the mpd config on Arch and the mpd config on Ubuntu pages.

Low volume with snd_hda_intel module

My new machine has six audio jacks on the back (shown in the figure) and two  on the front.  
I used alsamixer to unmute and set output to 0dB for the 'Headphone' (front green jack) and the 'Speaker' (rear green jack) channels, but the volume off the green jacks was barely audible at the maximum settings and with speakers set to maximum output.  Plugging the speakers into the the grey side speaker (#1) jack produced sound at reasonable volume. The following command gives the device [bus:slot.func] numbers, then the second command used this number to reveal which kernel modules were used by my card. (This snd_hda_intel howto was very helpful in sorting this out, despite the warning at the top that the information is outdated).
$> lspci | grep Audio
00:14.2 Audio device: Advanced Micro Devices [AMD] FCH Azalia Controller (rev 01)
$> lspci -v -s00:14.2
00:14.2 Audio device: Advanced Micro Devices [AMD] FCH Azalia Controller (rev 01)
        Subsystem: Hewlett-Packard Company Device 2ae0
        Flags: bus master, slow devsel, latency 32, IRQ 16
        Memory at feb40000 (64-bit, non-prefetchable) [size=16K]
        Capabilities: 
        Kernel driver in use: snd_hda_intel
A little Google and a lot of reading suggested the problem was with the snd_hda_intel module, and was fixed as follows (Note these instructions are only useful for cards relying on the snd_hda_intel module): First get the sound card model.
$> cat /proc/asound/card0/codec* | grep Codec
Codec: IDT 92HD73E1X5
My card model is 92HD73E1X5.  I checked HD Audio Models and found this entry was the closest match.
SSTAC92HD73*
 ===========
   ref           Reference board
   no-jd         BIOS setup but without jack-detection
   intel         Intel DG45* mobos
   dell-m6-amic  Dell desktops/laptops with analog mics
   dell-m6-dmic  Dell desktops/laptops with digital mics
   dell-m6       Dell desktops/laptops with both type of mics
   dell-eq       Dell desktops/laptops
   alienware     Alienware M17x
   auto          BIOS setup (default)
My computer is an HP Pavilion P7-1439 Desktop and HPs are not on this list.  I decided to try a few configurations, so as ROOT I added the following as the last line of my /etc/modprobe.d/alsa-base.conf file.
...
options snd-hda-intel model=[MODEL]
I iterated [MODEL] through the options available for the SSTAC92HD73 series. After each [MODEL] change I reloaded alsa
ROOT$> alsa force-reload
then opened alsamixer to unmute and increase volume to 0.0dB for all outputs.  I played music or ran the command
speaker-test -c 2 -t wav
while I moved the speaker plug to each jack, and tested headphone jack detection on the front jack by plugging/unplugging in headphones for each speaker plug location. I found that dell-m6 provided good volume levels from front green jack and rear black jack (with jack detection) for headphones and rear blue 'in' jack for speakers, but no volume from other jacks.  Not listing a model option in the config file produced speaker output from the 'side' (grey), 'rear' (black), and 'csub' (orange) jacks, but the volume from the front headphone jack was extremely low, although it did have jack detection.  Since I have a simple pair of old DELL PC speakers, using the dell-m6 model and plugging the speakers into the blue jack works for me.  However if you have surround sound you'll have to choose between that and audible headphone volume.

   A little investigating revealed this snd_hda_intel low volume bug, and posts 13-16 show a difference in the GPIO IO[0] data pin when the volume is correct and when it is not.  I did the following: Comment out the options snd-hda-intel model=dell-m6 in /etc/modprobe.d/alsa-base.conf so that the model loads as default, then
ROOT$> alsa force-reload
ROOT$> cat /proc/asound/card0/codec#3 > auto.txt 
Then uncomment that same line in /etc/modprobe.d/alsa-base.conf and
ROOT$> alsa force-reload
ROOT$> cat /proc/asound/card0/codec#3 > dellm6.txt 
So I could compare all differences. I've made the outputs for defaultdell-eq, and dell-m6 available.  My GPIO IO[0] data=0 with models that produce low headphone jack volume and GPIO IO[0] data=1 for models that produced normal headphone jack volume.  the nodes are different for the headphone outputs as well, but I'm not sure that's important.  Because I don't have surround sound speakers, I didn't persist further with the hd-verb to manually change the data pin.

  Just to verify my card does produce surround sound, I commented out the options snd-hda-intel model=dell-m6 in /etc/modprobe.d/alsa-base.conf to load the default model then ran
speaker-test -D surround71 -c 6 -t wav
while moving the speaker plug to the 'side' (grey), 'rear' (black), and 'csub' (orange) jacks.  "Front Left" and "Front Right" played from the respective speakers when plugged into the grey jack, "Rear Left" and "Rear Right" played from the respective speakers when plugged into the black jack, and "Front Center" and Rear Center" played from the respective speakers when plugged into the orange jack, so my surround sound works on this card.