My Linux box contains 3 sound cards. One is built into the motherboard, and two are in expansion slots. One is dedicated to the computer speakers on my desk. The other two are plugged into short-range FM transmitters so that I can play MP3s on my computer and hear them on a radio in another room.
To manage the playing of the MP3s, I have created a server process to which I can send commands over a named pipe. Those commands include the typical ones you'd expect -- Skip to the next track, skip to the previous track, pause, resume, stop, etc. You can send it a list of files, and it will play through them repeatedly. I run one server process per sound card.
To interact with the music server, I have created 3 interfaces. The most capable interface is a web interface. I have created a set of PHP pages to allow a user to pick an MP3 file or a play list and play that list of MP3s. The interface provides all the basic controls and also a status screen for the current track, which allows you to see things like the name of the track, how many seconds have already played, how many are left to play, etc.
The next interface is a fairly primitive keyboard interface. I have written a simple program that replaces getty in my /etc/inittab for one of the console windows. This interface provides basic functionality (FF, rew, stop, play a specific saved play list) without requiring any visual feedback. I sometimes use this interface when I'm not actively using my computer for other things, and I don't have the monitor on, and don't want to turn it on.
The next interface is even more primitive, but allows me to start and stop a playlist from pretty much anywhere in the house. I have an X-10 kit, which includes a computer interface module and an RF remote control. I have written a program to monitor the computer interface, looking for particular X-10 commands. When I use the on and off buttons on the X-10 remote, the program starts or stops the play list associated with the house and device codes sent. This interface, as written, provides no FF or REW capability, although it could be changed to do so.
One of the reasons I have written all this up is that I'm wondering if this system would be of interest to anyone else. As it is written right now, it is fairly specific to my needs, but it could be redone with a little bit of work to make it more configurable and generic so that others could use it. If you would have interest in trying out this system, send me an email at email@example.com. I will not be prepared to distributing the code right away, but if I see some interest in it, it will motivate me to make the necessary changes so that I will feel comfortable releasing it.