As you know from a few weeks back, I got myself one of these little single-board computers (SBC) - the Hardkernel ODROID-C2 - and posted a PREVIEW on it. As described in that article, I had flashed a copy of Volumio 2 "Release Candidate" (0.861RC1) to my SDHC card and have been streaming music to my TEAC UD-501 DAC in the music room for the last while.
Originally, I was going to publish both the contents in this post as well as measurements but it quickly became obvious that this was going to be too unwieldy (plus the day job got very busy)! As such, let me talk about the basics of the setup here today along with a few changes you might want to try if you're streaming from one of these Linux-based network machines. Then later, we'll get to the measurements...
Note that although I'll obviously be specifically addressing the ODROID-C2 I have here, the software is portable and at present, the good folks at Volumio have software images for many low-power computers including: Raspberry Pi, Beaglebone Black, Cubox, ODROID-C1+, etc... Just check their site to see if your machine is supported with a ready-to-use OS/app image. I've been informed that RuneAudio will also have ODROID-C2 support ahead (maybe as early as this weekend), so keep an eye on that one as well!
A reader made a cute post with a cartoon of the difficulty of running Linux last time. Yes, in principle I agree... Linux is clearly not as easy to use as Windows and Mac OS X; and even after the years of refinement in the GUI with so many variations these days, I doubt that for most people, Linux on the desktop is something they'd be seriously considering beyond hobby purposes. On a side note, I remember reading an article about Linux back in 2000 that suggested that the rate of adoption of Linux was accelerating and this OS would overtake Windows in the desktop within something like a decade! Of course back then we were starting to see Linux invade network servers and the like... No surprise that some would extrapolate into the desktop single-user computing space. Although it never happened for the desktop environment, isn't it interesting to see the Linux kernel invade the mobile/tablet space as Android and the embedded devices market like NAS storage and low-power music servers? I wouldn't be surprised if proportionally, a good number of us have just as many devices running Linux in our day-to-day life as there are Windows / Mac OS devices. As such, I think it's good knowing the basics of UNIX/Linux as a computing skill these days if one were ever stuck without a geek to call on among friends and family.
Okay, on to music streaming and the ODROID-C2. Here's basically how I have it set up...
Windows Server 2012 R2 machine running JRiver 21 ---> gigabit ethernet LAN ---> ODROID-C2 UPnP/DLNA running Volumio ---> TEAC UD-501 DAC ---> Rest of the sound system...
On the Windows Server side I have JRiver 21 running as a media server for all my music files. It sees the ODROID-Volumio device as a DLNA renderer once the ODROID is up and running on the gigabit network (named "odroid-Volumio" here):
Since JRiver 20, there has been the ability to apply digital processing to the DLNA output for the audio rendering device. In fact, this was my main motivation to upgrade to version 20 back then. With the DSP functionality, one would be able to get the faster server computer to do stuff like run upsampling, apply convolution room correction filters, and output conversion like packaging DSD as DoP then stream it over to whatever renderer you're using without the need for much further processing on the client/DAC end. Of course, ultimately it doesn't hurt to have a reasonably fast low-power machine like the ODROID-C2 in the event that you wanted to run upsampling or other DSP in the future (maybe BruteFir could be incorporated some day?)...
As you can see, I have configured my DLNA server with a few settings to get it the way I want. Under the "... Add or configure DLNA servers ..." tab, I've set the output format to be "PCM 24 Bit", and upsample everything to 192kHz. In the "Advanced" tab, I've turned on "Bitstream DSD" since I will be streaming music out to my TEAC UD-501 which is capable of up to DSD128 via DoP.
One level down into the "Advanced --> ... DSP Studio ..." tab of the DLNA Servers configuration, I've activated the convolution filter with the appropriate setting for room correction as discussed previously using the AudioVero Acourate software.
I've experimented with a few of these DSP effects on the list and it's a bit hit-and-miss which ones work over DLNA. For example, the "Output Format" DSP doesn't work. If you want to upsample, the "Sample rate" setting that I changed above to 192kHz is where you do it. "Room Correction" DSP will work if you want to reverse polarity but will not implement a volume level change.
Although I might be getting ahead of myself a little with some measurements, I just want to prove that the room correction convolution does work (it's audible but I still wanted objective proof :-) - here's the frequency response with it on as played back with the ODROID-Volumio through the TEAC UD-501...
As for ODROID-Volumio settings, you can start using the web-based configuration to get things working once the computer boots up (note that the first time you boot Volumio with the SD card, give it a few minutes to install, format partitions, etc. could take 15-30 minutes depending on flash card speed and size). On your web browser, either go to "volumio.local" or find the IP address (192.168.1.121 in my case) of the Volumio computer; you'll see something like this :
That's the "Playback" screen showing what's being streamed currently. Notice that the left panel is telling me I have a 32/192 stream coming in (interesting, since my JRiver was set to 24-bits). Volume control 100% on the right. Press on the gear icon top right and click "Playback Options" to change some settings:
Rather self-explanatory... Output device is my TEAC UD-501. Audio buffer 8MB - more than enough on the gigabit network with a fast server at 192kHz. In fact with a fast network, you probably want even lower latency before playing back so that 10% can be set even lower if you want manually which we'll talk about in a second.
You can also click on that same top right gear icon and change "System" options:
You can change the DLNA player name. There's the version number as well as a info on system updates and resets.
Volumio Bug: Cosmetic issue with the "Player Name" field. It seems the first letter cannot be uppercase! I was hoping to do "ODROID-Volumio".
Although I'm using the server computer running JRiver to process audio for the streaming device, you can actually also point Volumio to mount a network or local drive and access the library:
Above is the setting for my Samba/CIFS share directory containing my DSD albums on the Windows Server 2012 R2 computer. Point it at the NAS IP, select the path in the drive, and plug in the Username/Password as needed. The "ro" option is to keep the drive read-only so nothing is changed. Assuming it's mounted properly, Volumio will scan through it and audio files found can be selected from the bottom left "Browse" tab. One caution about DSD is that Volumio/mpd does not recognize DST-compressed DSD64 natively and will ignore those files. However, JRiver will decode DST and will bitstream them as DoP to the DLNA device with the option selected above.
The Volumio GUI (and RuneAudio) is actually controlling the underlying Music Player Daemon (MPD) playback system where there are more settings to play with. To access that and edit the configuration files manually, we'll need to run a SSH session to access the Linux command line of the ODROID (or Raspberry Pi, etc...). In Windows grab PuTTY and run it pointed at the machine's IP:
From here, you'll see your Volumio computer command line (remember that the default ID and PASS are both "volumio" by default).
And now, let's edit the mpd.conf file to add a couple of things using the nano text editor which is installed by default...cd /etc
nano mpd.confThe most interesting parts are in the "Audio Output" block. The default will likely look slightly different for your setup but here's what I changed mine to:
As you see, I've annotated the changes... To allow my UD-501 to stream DSD/DoP (DSD64 and DSD128 works fine from JRiver), add the "use_mmap" (use memory mapping, needed for some DACs) and "dsd_usb" settings. Some DACs (like those using XMOS chipset) can play back DSD natively and will require activation of the dsd_native setting (see here for some details).
Notice I commented out the format line (with '#'), but if I wanted the ODROID to force upsampling to 384kHz, I could (384000Hz:32-bits:stereo). Note that doing this would prevent DSD streaming because the software is not able to convert DSD to PCM and this PCM setting takes precedence over DSD.
Related to the upsampling function, we can tell MPD what samplerate converter algorithm to use. I see that both SoX and Secret Rabbit Code (libsamplerate) settings are included in this build (see here for some details)...
SoX settings: soxr very high, soxr high, soxr medium, soxr low, soxr quick
libsamplerate settings: Best Sinc Interpolator, Medium Sinc Interpolator,
Fastest Sinc Interpolator, ZOH Interpolator, Linear Interpolator
(ZOH = Zero Order Hold - like a non-oversampling DAC, Linear = think Windows 10 DirectSound)
Finally, you can do funky stuff with the buffering. I have it set to 32MB buffer size with playback starting when 5% full in this example. Remember that the ODROID-C2 has 2GB RAM so plenty of memory space. Also, with gigabit ethernet speeds, at full speed the data transfer proceeds at 100MB/s so the slowest step in this whole process is likely the processing speed of the Windows Server performing complex DSP in 192kHz. If streaming wirelessly or through a less reliable network, you might want the buffer to fill a bit more like 20% before playing just to have the extra headroom; the price is a slightly longer playback latency. (For comparison, remember that the Squeezebox devices before the Touch only had ~25Mbits of buffering or ~3MB and the Transporter could handle 24/96 audio quite well with this buffer size on its 100Mbps ethernet.)
Once you've made the changes to the configuration file, CTRL-O to write the changes, and CTRL-X to exit nano. Now reset MPD to activate changes (without a full reboot):
service mpd restartRemember that these manual changes will be rewritten if you use the Volumio web-based GUI to change "Playback Options" so you might want to back-up the mpd.conf file with changes you like.
With the above settings, I can stream DSD (here's DoP DSD128 or 5.6MHz as displayed):
JRiver (21.0.50) BUG? It seems there's something odd with DSD64+DST compressed .dff files. The decompression seems fine and JRiver 21 will stream them as DoP to Volumio, but the music truncates after about 1-2 minutes and it proceeds to the next track. I'm suspicious that this is a JRiver bug because non-DST-compressed .dff files play fine all the way to the end through Volumio. I wonder if other JRiver + DLNA DoP streaming users could double check on this... Since there's no current compression system other than DST for DSD64 in use that I'm aware of, and only the .dff file format can accommodate this but cannot be tagged, I generally just play PCM files so this bug/issue doesn't affect me too much though should be fixed!
If I uncomment the 32/384 upsampling setting (in the "audio_output" block above), I'll be taking in the 192kHz audio from JRiver and the ODROID will further upsample that to 384kHz to feed to the DAC:
|Clearly, Mariah Carey deserves extreme upsampling :-).|
The ODROID's 2GHz quad-core 64-bit processors are easily able to handle the 192 --> 384kHz upsampling using "soxr very high" setting which is the most processor-intensive option:
As you can see, mpd is using up ~12% processor load. I've seen it go up to around 14% when upsampling from 44 --> 384kHz using this SoX setting.
Here's another interesting processor load figure:
~4% load from a quad-Cortex A53 2GHz ARM CPU is all it takes to convert a DSD128 .dsf file from a gigabit ethernet mounted NAS drive, repackage into DoP and played on the USB 2.0 DAC (3% mpd + 0.7% cifs). This is with a Volumio-mounted DSD directory off my server so it's not going through JRiver at all. I've heard talk by some audiophiles fretting over whether DoP changes the sound quality of DSD playback! Evidently it's no big deal from a processing power perspective (I would not have expected it otherwise).
It has been about a month since I have had the ODROID up and running. It's on 24/7, the beta/RC1 version of Volumio 2 has been very stable so far. Other than the issue with DST compressed DSD64 files truncating on playback (JRiver problem?), and the small cosmetic player name issue, I haven't run into any other concerns. I use eos as the JRiver controller app with my Nexus 7 Android tablet and just as well can use the free Gizmo app.
I hope this post gets you interested in the potential of free Linux software paired with these very inexpensive single-board computers. And a taste of the customization potential and options available with just a little time and effort. Indeed, at some point, my Squeezebox devices will fail and I would have no concerns at all running something like this as replacement. Already I'm quite impressed by the stability and it sounds fantastic. As promised, I will be running some measurements as well with this little streaming computer connected to my DAC via USB, so stay tuned for that in the next couple weeks!
Let's end off with a discussion in general on music streamers. You've seen them around. Like many audiophile products, over time, as companies start moving into "high-end" gear, prices often escalate easily to the 4-figures for what in my opinion are just small ARM-based computers like the ODROID-C2. Looking around at the specs, typically the streaming devices have even less processing power, memory, and video capabilities than this little hobbyist computer. What is often advertised are claims that linear power supplies, low jitter "femtoclocks", special shielded enclosures are beneficial for audio quality... Sure, while these features might sound great and may be congruent with audiophile "lore", it's generally unclear under what circumstances and to what degree any of it would be audible at all. Remember, we're looking for accurate digital data transmission with minimal timing anomaly in the playback. Essentially any reasonable computer with a functioning cable is capable of accurate data transmission. And timing anomaly that could result in jitter is dealt with by asynchronous interface (USB/ethernet/Firewire) DACs, not typically a function of the computer/streaming hardware unless you're still using the older S/PDIF interfaces these days. As for noise originating from the computer/streaming hardware, I'd like to see evidence of this "problem" with modern equipment. Any streamer that creates enough electrical noise to cause distortion in a reputable DAC or any DAC that is so susceptible as to "sound" noisy with a reputable computer/streaming device should be avoided!
Beyond the hardware side, also remember that many of these commercial streaming devices (I believe various Auralic and Aurender models) are using some variant of Music Player Daemon (mpd); the same underlying Linux infrastructure as Volumio and RuneAudio among others. Unless there are special features one wants/needs from the hardware (eg. a specific digital output like an AES/EBU interface), or other non-utilitarian features, I would certainly highly recommend looking around at these SBC's like the Raspberry Pi or ODROID, and audio add-ons if needed (like the HiFiBerry DIGI+, DAC+, or HiFi Shield). Simply assemble your own. The remarkable thing is that this would only likely set you back ~$100 when all is said and done!
Folks, these are truly exciting times for the computer high-fidelity hobbyist. Take advantage of technological progress pushing down prices of all kinds of amazing hardware and the power of already quite mature and feature-filled "free" software (donations of course always appreciated).
Until next time... Hope you're all enjoying the music!
Addendum: I see that Blogger took down my April 1st post on "USB Audio Gremlins" and the FUD they're perpetuating referring to my take on the iFi sponsored post on AudioStream yet again despite changes I made to not directly quote much from the ridiculous article... Fine. You can still find it cached for the time being.
Addendum 2: I see that Archphile also has an image up for the ODROID-C2 for those wanting a try.