SlimStreamer: Multiroom Streamer That Does Not Resample

Hello DIY Community

Let me introduce my pet project, I have been working for while. SlimStreamer (GitHub - gimesketvirtadieni/slimstreamer) is an audio streaming software for Linux with multiroom functionality. SlimStreamer captures audio playback from ALSA and broadcasts it to connected Squeezebox devices (real or ‘virtual’ like squeezelite) through SlimProto protocol. Moreover, while capturing, original sampling rate is preserved and PCM stream does not get resampled to a predefined frequency. Other solutions (like AirPlay, SnapCast, ...) use predefined sample rate, so original PCM stream is resampled in case sample rate does not match.

In other words, you can use any Linux software that outputs audio to the default ALSA device (MPD, Mopidy, Spotify client, ...) and SlimStreamer will capture it and redirect to connected Squeezebox players (for example squeezelite) in a transparent way.

I am still working on supporting SlimProto (it is still missing). However most tricky part, PCM capture in a bit-perfect way, is working fine, also single-threaded asynchronous TCP server is done.

Few more details:
-> SlimStreamer is written in C++17 (one should read it is very fast and lightweight)
-> It uses two ALSA plugins: SlimPlexor (GitHub - gimesketvirtadieni/slimplexor) and Loopback (Matrix:Module-aloop - AlsaProject)
-> SlimStreamer's source code is in Public Domain (Unlicensed)

Any comments / feedback about whether you find it relevant / interesting / useful are much appreciated
An externally hosted image should be here but it was not working when we last tested it.



An externally hosted image should be here but it was not working when we last tested it.

gimesketvirtadieni
 
Last edited:
This is interesting, especially the possibility to not resample. I have a couple of questions...

What transport (streaming protocol) are you using?

How well synchronized are multiple clients that should receive the same stream?

What happens when the sample rate of the stream-ed audio is not supported by the sink at the end of the line (e.g. the DAC)? How does the program handle that?
 
I use SlimProto (SlimProto TCP protocol - SqueezeboxWiki), the same protocol used by Logitech Media Server (Logitech Media Server - SqueezeboxWiki). In other words, SlimStreamer mimics Logitech Media Server. This protocol came a long way; companies like Slim Devices and Logitech put a lot of expertise into it: SlimProto is the next version of SLIMP3, it supports lots of codecs, it allows using various sample rates, synchronisation, DSD over PCM (have not tested), … However the main reason I have chosen using it – players can be Pi Model A or Zero with decent DAC running a single SW player (squeezelite). The rest of the music functionality is done on server (regular player, MPD, Mopidy, Spotify, ShairPlay, …).

Synchronisation is done by the players (in my case by squeezelite). SlimStreamer just provides ‘master’ timestamps. So far, my experience with in-sync playback by squeezelite was very good (even on WiFi). Although I am still completing support for SlimProto so I used LMS for tests.

What happens when the sample rate of the stream-ed audio is not supported by the sink at the end of the line (e.g. the DAC)? How does the program handle that?

There are several way to get around unsupported sample rate by particular player's DAC. Clients report supported sample rates to the server so it may decide if a client should be used for streaming. However probably the most common way is to use ALSA ‘plug’ plugin before sending to DAC, it will resample if DAC does not support a specific rate.

I can see you developed several LADSPA plugins. I guess you know a lot about ALSA internals as well. Any tip / advice regarding SlimPlexor (it’s my ALSA plugin required to route PCM to a predefined by a sample rate loopback device) is more than welcome ;)
 
Hello DIY Community

Let me share a great news - SlimStreamer is available for alpha testing! Please find instructions how to build it on the front page of the github project. Can't wait for anyone trying it out and providing feedback. Please note, you need to build and setup SlimPlexor and then SlimStreamer to make it work all the way ;)
 
Hello Trunkline

The main limitation of SnapCast is that it captures PCM stream with fixed sampling rate, which means resampling if original sampling rate does not match. Resampling is suboptimal if audio quality matters (which is not so important for regular usage).
There is no way around it as long as you use pipes or similar technic to capture the stream. SlimStreamer uses custom ALSA module which gets access to PCM stream before it gets tailored, so it is bit perfect.
On the other hand SnapCast is years ahead in maturity vs SlimStreamer. I am still working on synchronization so subscribe on github to get notified ;)
 
Multiroom audio

Has anyone looked at the Arylic devices?
I built a class D 2.1 multiroom amp with their up2stream amp2.1 in an old mini-PC housing, and I must say it sounds absolutely fantastic!
10.jpg
I managed to figure out some of the serial commands and handshake between the Linkplay board and a up2stream_amp2.1. The board is built inside an old mini PC housing with a new DIY frontpanel and all parts are home-cut. (some design features are stolen from a high-end brand…:)
11.jpeg [/ATTACH][/ATTACH]
An Arduino is translating the data to text strings. I also added some buttons for on/off and mute. The VU-meter and other hardware is eye-candy…
 

Attachments

  • 12.jpeg
    12.jpeg
    464.3 KB · Views: 92
  • 14.jpeg
    14.jpeg
    101.5 KB · Views: 93