0

Stream analog source with DAC+ADC to HiFiBerryOS client

Hi,

it took me some time to gather the information, work around a bug and assemble the steps to write them down. Maybe it helps someone out there with your ideas!

"This guide is made with love while listening to good music." ;-)

 

Goal

Stream any analog source to one or more targets.

In my case the idea was born to be able to stream the output of my phono preamp to a headphone amp that is not located near the turntable.

But one might use any analog source that puts out signals at line level.

 

Think about integrating vintage analog gear in a streaming environment or link them to active speakers if they are connected by a device that can deal with the software (Snapcast) used in this guide.

Also one might hook this setup to the pre-outs of a main Amplifier and use its output somewhere else in the house.

A HiFiBerryOS equipped Raspberry Pi is used as an endpoint (client).

 

Considerations

I chose Snapcast because it seems quite lightweight to me and it is supported by HiFiBerry as well as Volumio (with plugin) as source.

Also i found it quite easy to set up and understand. It plays well with alsa and it proved reliable enough the times i used it so far.

There is a slight delay in playback due to precessing and buffering.

The Audio is recorded by a HiFiBerry DAC+ ADC Pro and is then streamed as 48kHz, 16Bit lossless FLAC to clients

 

Hardware used

  • Raspberry Pi 4
  • HiFiBerry DAC+ ADC Pro (the non pro will do as well but was not in stock when i ordered)
  • 2nd Raspberry Pi as client (HiFiBerryOS or Volumio with snapcast Plugin was tested)
  • Cables
  • analog source

 

Software used

  • Raspian Buster 10 light
  • Snapcast (in this case the snapserver part of it)
  • arecord of alsa
  • 1 second long 48kHz 16Bit WAV file (put this WAV file in your home directory an your Pi -> /home/pi/)

 

Links

 

  • Note: i carried out all the following tasks using a ssh connection to my Pi using Terminal on MacOS. Edits in config files are done with nano editor. You might need to use sudo to edit some files. I might have forgotten occasionally to mention when to use sudo in this guide, sorry.

 

  • Note 2: This is the first guide of this length i've written for such an installation and configuration. So please be kind if some parts seem confusing or plain do not work. ;-) The guide is not as detailed as i'd like it to be, but you get the outline on how to set it up. Some basic skills are required. Also i will assume that you are aware how to set up the clients (HiFiBerryOS or Volumio or whatever works as snapcast client.

 

Preparation

Download Raspian Buster light from here:

https://www.raspberrypi.org/downloads/raspbian/

Install to SD-Card using the method of your choice.

Boot and configure the system on the Pi using your knowledge or available guides. Make sure you enable ssh login.

 

When configured, login to your Pi via ssh.

 

It may be necessary to add/change the following line in /boot/config.txt:

dtoverlay=hifiberry-dacplusadcpro

This is to make sure that the correct type of HiFiBerry card is used. I might be the case that it is detected wrong - depending on the

Raspian used and possible bugs related with it. Better be safe than sorry. ;-)

 

Remove the following line in /boot/config.txt

dtparam=audio=on

 

Reboot

 

Main section

Login to your Pi via ssh.

 

Install Snapcast using the following command. Be sure to check on the Snapcast release page which version is recent. Adjust the filename accordingly.

wget https://github.com/badaix/snapcast/releases/download/v0.19.0/snapserver_0.19.0-1_armhf.deb

 

Install snapserver by:

sudo dpkg -i snapserver_0.x.x_armhf.deb

 

This will throw an error that some dependencies are missing. Acknowledge with "y".

 

Install dependencies by:

sudo apt-get -f install

 

The defaults in /etc/snapserver.conf should work out of the box.

But to be sure i made these changes by uncommenting the lines (remove the #):

threads = -1

stream = pipe:///tmp/snapfifo?name=default

sampleformat = 48000:16:2

codec = flac

 

At this point you might want to reboot and check if it will actually works.

Connect a line source to your DAC+ADC (Pro), connect your client by LAN or WiFi and issue the following command on your Pi:

arecord -f dat > /tmp/snapfifo

 

No, wait!

At this time there is a bug in the driver for the DAC+ADC (Pro), that requires to first play something before you can record something.

https://support.hifiberry.com/hc/en-us/community/posts/360009760117--DAC-ADC-Pro-Issues-with-sound-capture-on-Raspbian?page=1#community_comment_360001762658

 

So, first play something:

aplay -d 1 test.wav

and then

arecord -f dat > /tmp/snapfifo

 

If everything went right you should hear the source on your client.

 

As it would be tedious to always log in to your pi and issue the arecord command, let's start the snapserver streaming at boot time.

For this i used systemd.

 

Create the file arecord.service in /lib/systemd/system/

It should contain (as far as i think and tested):

[Unit]

Description=arecord

After=network-online.target snapserver.service

Requires=network-online.target snapserver.service

 

[Service]

ExecStart=/bin/bash -c "/usr/bin/aplay -d 1 /home/pi/test.wav; /usr/bin/arecord -Dhw:0,0 -f dat > /tmp/snapfifo 2>&1"

#Restart=on-failure

 

[Install]

WantedBy=multi-user.target

 

systemd waits for the snapserver.service to be ready and then starts the arecord.service.

 

Note the line #Restart=on-failure - i haven't tested it so far but this should restart the service, if it aborts for some reason. Until now it was stable enough so i left it deactivated.

 

Set the correct permissions to the file by issuing:

sudo chmod 644 /lib/systemd/system/arecord.service

 

Enable the service by:

sudo systemctl --system enable arecord.service

sudo systemctl --system start arecord.service

 

Reboot and check if everything is working as expected. If you want to check if the service is running:

systemctl --system status arecord.service

 

Optional

For peace of mind you might activate the Overlay FS after everything works. This will limit writes to your SD-Card.

Short version how to do it via raspi-config command:

7 Advanced Options > AB Overlay FS > "Yes" > does things > "OK" > "would you like the boot partition to be write protected?" > "Yes" > "OK" > "Finish" > "Would you like to reboot now?" > "Yes"

1 comment

Please sign in to leave a comment.