Topic: Music! mpd on Backfire on WGT634U

I finally managed to set up a working music system!  Actually, I have a system which still works, running Kamikaze r8480, but that setup's more limited than my new one, so...

The target system is:
A small box which connects via wires to my stereo system, and via wifi to my network, which includes a Linux system with my MP3 collection. Thus, this is a *client* of my existing wifi access point.

FIRST, a few assumptions: I'm using Netgear WGT634U because when I bought a few of them, they were relatively inexpensive, and almost alone in offering both WiFi and USB.  Newer routers have both - feel free to send me some hardware to test! :-)  At any rate, they're a known unit, so I'll assume you already have Backfire running on one, with wifi running.  I'm grateful for the builds on http://downloads.openwrt.org/backfire/10.03.1-rc4/brcm47xx/

SECOND assumption: I resisted as long as I could, but I finally gave in and plugged a USB hub into the WGT634U, so that I could have a USB audio device and a thumb drive.  This actually resulted in...

THIRD assumption: Much of this could have been done with an extroot system, but I wanted something simpler. With this setup, I can boot with nothing plugged into USB and get a "normal" router, or I can plug in my thumb drive and get a customized setup.  See how this becomes a flexible system?

Here's where we start getting specific.

On the basic system, install some necessary packages:
kmod-usb-core
kmod-usb2
kmod-nls-base
kmod-fs-ext2
kmod-scsi-core
kmod-usb-storage
block-mount
kmod-fuse
ldconfig

Next, create a USB thumb drive with one partition, and create an ext2 file system on it.  Instructions for doing so are abundant, so I'll skip them here.  (As a beginner, I used to hate it when people said that!) By the way, I would have preferred to have a vfat file system on the USB drive, so I could also use it on my Windows systems.  However, we need symlinks, so...
- On my setup, this drive will be mounted as /dev/sda1; you should create several directories: ./bin ./etc ./lib ./music ./tmp ./usr ./var ./var/mpd
- Add this drive to /etc/config/fstab (I like to edit the config files, but you may prefer to use uci)

# /etc/config/fstab
config mount
        option target   /opt
        option device   /dev/sda1
        option fstype   ext2
        option options  rw
        option enabled  1

Oh, and you'll want to "mkdir /opt" on the router! We're now prepared to reboot, and if all is well, /opt should be mounted and ready.

Add this to /etc/rc.local :

# /etc/rc.local
# If we mounted external storage, let it initialize itself
if [ -f /opt/etc/rc.local ] ; then
        sh /opt/etc/rc.local
fi

We'll get to that /opt/etc/rc.local in a minute - first, let's install some packages on the USB drive.

echo "dest opt /opt" >> /etc/opkg.conf
opkg --dest opt install mpd kmod-usb-audio
opkg --dest opt install curlftpfs
ldconfig

I had to add "audio" to /etc/group (555, arbitrary) to keep some portion of the audio programs happy.  It was a small price to pay.
- At this point, I've used only 13 MB of space on the USB drive - finally, I've found a place where my 256 MB drive looks big!

Our music system will use /opt/etc/mpd.conf for a configuration file, with some specific file locations:

# /opt/etc/mpd.conf
music_directory         "/opt/music"
playlist_directory      "/opt/music"
db_file                 "/opt/var/mpd/mpd.db"
log_file                "/opt/var/mpd/mpd.log"
error_file              "/opt/var/mpd/mpd.error"
pid_file                "/opt/var/mpd/mpd.pid"

There's other info in that file that we'll get to later, but for now, keep in mind that "/opt/var/mpd" is on the USB drive, but "/opt/music" is on an external server.

Now let's create /opt/etc/rc.local - this does a few things in order to turn an ordinary router into a music box, so we'll break it up into parts.

# /opt/etc/rc.local

### PART ONE
# Just in case...
PATH=/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin

### PART TWO
# Make this a client of home_net
uci set wireless.wifi0.channel=11
uci set wireless.@wifi-iface[0].network=wan
uci set wireless.@wifi-iface[0].mode=sta
uci set wireless.@wifi-iface[0].ssid=home_net
uci set wireless.@wifi-iface[0].encryption=none
uci delete wireless.@wifi-iface[0].key
uci commit wireless
# I *think* all we need is "wifi up", but...
wifi down ; sleep 3 ; wifi up

### PART THREE
# Open up a few firewall ports (ssh, web, mpd)
iptables -t nat -A prerouting_wan -p tcp --dport 22 -j ACCEPT
iptables        -A input_wan      -p tcp --dport 22 -j ACCEPT
iptables -t nat -A prerouting_wan -p tcp --dport 80 -j ACCEPT
iptables        -A input_wan      -p tcp --dport 80 -j ACCEPT
iptables -t nat -A prerouting_wan -p tcp --dport 6600 -j ACCEPT
iptables        -A input_wan      -p tcp --dport 6600 -j ACCEPT

### PART FOUR
# It looks like it takes about 20sec to set up the home_net route
HNET_OK=""
x=0; while [ $x -lt 10 ]; do
  rdate -s mp3serv && HNET_OK="True" && break
  sleep 5
  : $((++x))
done

### PART FIVE
# curlftpfs looks in $HOME/.netrc for user:pass
#- so make sure it's set to the right value!
[ $HNET_OK ] && HOME=/root curlftpfs -o nonempty ftp://mp3serv/ /opt/music
# - Thus we want two possible dB files (w/wo mp3serv),
#   but both stored locally!
( cd /opt/var/mpd
  [ $HNET_OK ] \
    && cat mpd.db.mp3serv > mpd.db \
    || cat mpd.db.local > mpd.db
)
mpd /opt/etc/mpd.conf

Part One:
Some of the programs we're running here are in /opt (particularly "mpd"), so set the PATH accordingly.

Part Two:
Use "uci" to set up this system as a client (mode="sta") of the home network. If you're more cautious than me, your network is encrypted, so you'll need to adjust these settings. (When I set up this system as a standalone
router, I added encryption and a key - for cleanliness, I'm removing that key, but that might not be necessary.)

Part Three:
Because the "wan" connection goes to our home network and not The Internet, we can safely open a few holes in the firewall: SSH, HTTP, and MPD.

Part Four:
The "wifi up" command causes us to use DHCP to get an address from the home router.  This is a double-purpose section - we'll poll the Linux box with the MP3 files (mp3serv) until that setup has finished, then we'll use it to set the date.

Part Five:
This system uses "curlftpfs" to get files from the MP3 server. I've used both NFS and Samba in other situations, but those were both more than I needed here - more CPU cycles, and more memory - so we'll make this simple. Again, because I have a simple and trusted network, I'm not encrypting traffic on the curlftpfs connection - you might want to be more secure.
- I think read-write access is only needed in order to store playlists - if you don't need to create playlists, it might be better to mount this as a read-only system.
- Setting up /root/.netrc : http://curlftpfs.sourceforge.net/

Part Five-point-One:
When I ran mpd on this new Backfire system and attempted to create the db_file, it just about killed the system!  So, I installed mpd on the MP3 server, created a db_file, and copied that to the Backfire system (/opt/var/mpd/mpd.db).  If the preceding sentence results in hours of effort and agony, you have my apologies.

mpd configuration:
It took some tweaking to get the ALSA libraries to stop complaining when mpd started - it would run, but only after several error messages.  One error was cured by adding "audio" to /etc/group (mentioned above); another required specifying some of the "default" values!

# /opt/etc/mod.conf (continued from above)
# Isn't this silly? We need to specify the mixer defaults! (mpd 0.15.0)
audio_output {
        type            "alsa"
        name            "local alsa"
        mixer_device    "default"
        mixer_control   "PCM"
}

Going Onward:
The basic system, without the USBdrive, can remain basic, and "fancy" packages can be installed on /opt - but there are occasional stumbling blocks. For example, any programs using "ncurses" will need this:

ln -s /opt/usr/share/terminfo /usr/share/terminfo

Another Issue:
My USB-audio device (the standard, and cheap, C-Media dongle) only works if it's plugged in at boot time.  If I boot without it and plug it in later, it's not detected - is hotplug broken?

For MPD Debugging Help:
http://openlinksys.info/forum/viewthread.php?forum_id=63&thread_id=10642
- in Polish?! Anyway, many mpd debug hints

Netgear WGT634U // TP-Link TL-WDR3600

Re: Music! mpd on Backfire on WGT634U

Cool and nice. But, you should have posted this in the HOWTO Documentation forum.

Mazi

Re: Music! mpd on Backfire on WGT634U

Shall I move it?

Re: Music! mpd on Backfire on WGT634U

Jow, perhaps it should be moved to HOWTO/Documentation forum since it is a HOWTO. Leave a link here in case OP will be looking for it.

Mazi

Re: Music! mpd on Backfire on WGT634U

Yes, go ahead and move it - sorry, I probably should have known better.

Netgear WGT634U // TP-Link TL-WDR3600

Re: Music! mpd on Backfire on WGT634U

Here an entry:  http://wiki.openwrt.org/doc/howto/usbaudio

Some Templates:  http://wiki.openwrt.org/meta/templates