ECE497 Project Music Server
Embedded Linux Class by Mark A. Yoder
This project focused on creating a music server hosted on the BeagleBone. The server contains a number of MP3 files which will be playable from the Beagle via either direct access or network access over ethernet/wireless. Currently (all from your web browser) you can upload and download songs, add to and subtract from the playlist, play your custom playlist over hdmi or headphone jack, adjust the output volume, load new media, etc.
We realize it's an odd choice to have a project that focuses solely on software, rather than a combination of that and hardware (ignoring the audio output). But when approaching the project, we wanted to build something that we would actually use afterwards, and not just relegate to the dust bin of history. I would happily say we succeeded.
What's in the repo
- Server files
- node module files
- Basically all files I created/used
What's NOT in the repo
- Any node module dependencies. If you receive any errors regarding the node modules, you will want to download and install NPM (NodeJS Package Manager) and reinstall whichever module is throwing the errors. This will also grab any dependencies it requires that you do not already have. If, when trying to reinstall, it won't let you download the module, this is most likely due to a conflict between NPM and your distro. You'll need to download the files on another distro, port them over, and use node-gyp (https://github.com/TooTallNate/node-gyp) to compile them locally, and install their dependencies manually. Have fun!
- NPM. It's a separate program that you may or may not need, depending on the above.
- NodeJS version 0.8.xx or higher. Again, you need to install this. May work with 0.6.12, hasn't been tested. I use the Express module, which supposedly required NodeJS 0.8 and higher, but who knows. I personally used the 0.9.9 (unstable) build for Debian. Ubuntu shouldn't have any issues.
- For USB audio, you'll need to edit a config file. Those details are below.
1) Go to https://github.com/Guiltygate/beaglebone-classwork and clone the umbreon folder somewhere on your laptop. NOTE:Does not work on Windows. Does not play nicely with IE. Should work with Firefox, Chrome, maybe Safari.
FOR USB-Audio and browser volume control 1a) If you want to use a USB-audio device, you need to set it to default. I used the guide here http://crunchbang.org/forums/viewtopic.php?id=9852 . Also make sure that you have alsamixer, as the sound controls in-browser use command-line arguments sent to amixer, a module of alsamixer. If you don't have alsamixer, you simply won't be able to adjust the volume from the browser.
2) You will need NodeJS, v.0.8.xx or higher, along with NPM. While I include the different node_modules in the git repo, installing them through NPM also installs their dependencies. If you run into issues with the distro not allowing module installation, use node-gyp here: https://github.com/TooTallNate/node-gyp .
3) Due to the whole 'unable-to-reflash-with-Angstrom' problem, I am unable to guarentee this will work on a standard BBB. However, I only use general linux architecture features, so feasibly as long as you can install Express 3.xx on Angstrom, it should be perfectly fine.
See the README for further detail, but here's the basics.
Run this command
if you wish to automatically mount your current usb drive. Server will start at 192.168.7.2:8080.
If you'd rather just start the server without auto-mounting, run
To play the current playlist (initializes to all .mp3 files in the top directory of your flash drive), hit the big arrow button. To view the current playlist/remove songs from it, hit the '-' button on the right. To view the entire directory of mp3 files and possible add them to the playlist, hit the '+' button on the left.
To swap out flash drives, press the 'Eject' button, physically switch them, and then hit the 'Load Media' button. To stop the current playlist from playing, hit the 'Stop Playlist' button. Warning: Stop button stops the playlist, but not the current track.
To download the current track, hit the 'Download' button at the bottom of the page. To upload, simply drag-and-drop the desired file.
- Previously, hitting the 'play' button while songs are already playing will cause a system crash. HOWEVER, this SHOULD be fixed. I haven't been able to replicate it since fixing it, at least.
- Previously, the load button stopped working for some reason and kept new media from being loaded. It had to do with pulling out the USB before unmounting it, so now users should press the 'eject' button before removing the flash drive, then plugging in the new media and pressing the 'load' button.
- Cannot skip songs backwards. The button is disabled, as I couldn't find a time-effective way of implementing this.
- Stopping and forward skipping 'works', but only if pressed in the first three seconds of a song beginning playback. The entire playlist will still stop (if pressing the 'stop' button), but not the current track.
- GUI font/style is ugly. Which is kind of a bug.
Theory of Operation
Using express framework in NodeJS. Enables user to upload songs for playing, download the currently playing song, view playlist, edit playlist, add songs from the directory, change media by swapping out usb drives, etc.
Everything was planned for maximum user convenience, as I plan on using this in my dorm room once I obtain a wireless router for the bone.
I would like to point out this wouldn't have taken so long if I hadn't had to learn NodeJS, Express, NPM, alsa, CSS, html, and all the little quirks associated with them. On top of my Beagle dying Sunday and refusing to reflash to Angstrom. Spent all day trying to reflash it, had to switch to Debian Wheezy and re-dowload all the software.
Server Features-------Eric------30hrs (minimum)
- Beginning with Express, NodeJS, NPM, als-arch, :: 18hrs (last Friday and Saturday. Sunday was spent praying and trying to fix the Beagle. Monday was spent swapping over to express.)
- Playlist viewing----20min
- Playlist editing----20min
- Radio-Stream--------6 hrs - partially included in the 'Beginning' section
- Basic GUI-----------1hr
- Enhanced GUI--------4hrs
- Song uploads--------6hrs
- Song downloads------1hr
Initial Planning and Discussion----------Both---------2hrs
Editing the Wiki/Writing Installation Guide---------Eric---------5hrs
I wasn't going to put this final bit in here, but I'm also worried my partner may try and blame me for the uneven distribution of work, so I'll give a brief summary below of what happened.
Neither of us knew NodeJS, Express, etc. going into the project. When discussing what our project should be, we both agreed on the music server- but while I made it clear we would both need to know JS and the rest to be effective, and looked up what I needed to know, David did not. I tried to involve him in the project later, as I realized he was slipping away, but that didn't work out. To be specific:
- I suggested he research radio-streaming, and see if we could use pianobar. He didn't do any research that he told me of, and was unsuccessful with pianobar after spending an hour (at most) with it.
- I suggested he come up with other cool ideas we could implement into the project. He never gave me any, although I ended up adding the ability to swap media easily, in-browser sound control, and a number of GUI refinements.
- I asked him to learn NodeJS in order to "proofread" my coding. He did not.
- The one time I directly asked him to do some more research (this was Tuesday of 10th week), he simply said he was tired and headed home for the evening.
David Cooper is a nice guy and a friend, but I feel that he did not contribute his fair share of the work. I will admit that near the beginning of the project, my instructions to him were vague, only being to learn NodeJS and research what was possible with it for media control. I do feel, however, that as a senior ECE student, David does not need me to constantly remind him when and what to work on. A good team should communicate, but one member should not have to constantly hold the other's hand.
I apologize for this lengthy rant, and also for any portion of it that may be unprofessional. As I am biased, I highly suggest talking to David. He will probably suggest that I hogged all the work to myself or something such like it. I would also like to mention that he has no doubt never read the contents of our wiki, or he would have already noticed my various comments as to his contribution of the work.
1) Add wireless router for easy streaming, no ethernet cord hassle.
2) Fully implement the Stop and Skip buttons. Currently, they can't stop the audio stream currently outputting, only the rest of the playlist.
3) Add a 'reboot server' button, in case of server failure. Tying into this, the server needs to be able to start on boot- I lost the config files when my board self-destructed on Monday.
4) Due to not knowing CSS or html, the current GUI is a bit crap. I'd like to build a GUI I can actually be proud of, rather than the slap-a-dash affair I have now.
5) Song playback bar, graphically lets you know time remaining.
6) Button feedback. It's weird to select a song and having no feedback if it worked or not. Annoying.
7) The audio modules I use only process .mp3 files, so adding additional modules to process .ogg and other popular audio files would be something nice to add. I myself only have/use .mp3s, so no guarantee I'll do this.
Wish I could have done more with the hardware, like a lightshow tied to the audio or something. But it took a lot of time to learn the different languages/styles/formats I needed for the project. It was all high-level (mostly), but there's a bunch of little gotcha's that will trip you up if you're not careful. Probably would have helped to have someone double-check my work.
As time-intensive as it was, what with other classes, I had a blast learning so much, and I'm looking forward to continuing to work on this over break and into the future. I also want to look into what other useful applications I could run on the bone with nodejs/express web-servers. Many, many possibilities...
Embedded Linux Class by Mark A. Yoder