Debian, DLNA and DMR devices

Recently, I spent some time wondering how to send the audio output of my laptop to a DLNA DMR (Digital Media Renderer) compliant HiFi device.

DLNA Streaming

The first step was to setup a classic DLNA streaming source with Rygel using a Pulseaudio module available in the pulseaudio-module-rygel-media-server package. This is done by adding the following options to /etc/pulse/default.pa :

#dlna
load-module module-http-protocol-tcp
load-module module-rygel-media-server
load-module module-null-sink sink_name=dlna format=s16be channels=2 rate=44100 sink_properties="device.description='DLNA' device.bus='network' device.icon_name='network-server'"

At this point, Pulseaudio create a new virtual output device named dlna.
Then, Rygel is used to serve this output with the DLNA protocol. In ~/.config/rygel.conf :

[GstLaunch]
enabled=true
launch-items=pulseaudio_out
pulseaudio_out-title=Audio output on @HOSTNAME@
pulseaudio_out-mime=audio/mpeg
pulseaudio_out-launch=pulsesrc device=dlna.monitor

Here, no shameful on-the-fly encoding with lamemp3, first because Rygel already provides built-in transcoding in MP3, and also because a WiFi network is strong enough to handle a PCM stream. This format has the advantage to avoid an additional encoding in an other lossly codec, which is a bad idea for audio quality.
The LPCM transcoding is set this way in the Rygel configuration :

transcoders=lpcm

All other features of Rygel (Tracker, MediaExport and Playbin) are disabled in my case.

At this point, an URL providing the stream is available on the local machine, but there is no way for me to call it directly from the DMR.
This is why the gupnp-dlna-tools package is required. It provides a few tools to manage DLNA devices, and more especially the gupnp-av-cp command. This command manages all the URL calls (for example, it sends the CurrentURI parameter) in order to control the DMR and fetch the laptop output from it.
So after starting rygel and set the default audio output to the DLNA device, just launch gupnp-av-cp to define the source and the destination of the stream : the output must be redirected.

Spotify

By default, wine don’t use Pulseaudio, so Spotify started with wine can’t be streamed via DLNA with this method. The working solutions are the web-based player (but it uses MP3 instead of OGG, and Flash. : two good reasons to avoid it), or the native client for Linux.

This client can be downloaded from the Spotify official repo, but it requires openssl in a version not provided in Jessie.
In order to keep standard versions of the system libraries, I manually downloaded openssl (for x86_64), then I installed Spotify in /opt :

# mkdir /opt/spotify
# dkpg -x <spotify_package.deb> /opt/spotify
# cd /opt/spotify && mv opt/spotify/spotify-client .
# dpkg -x <ssl_package.deb> /opt/spotify
# cd /opt/spotify && mv usr/lib .
# rm -rf /opt/spotify/usr && rm -rf /opt/spotify/opt

It can now be started after setting the LD_LIBRARY_PATH variable manually :

#!/bin/bash
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/spotify/lib /opt/spotify/spotify-client/spotify