Bezprzewodowe odtwarzanie dźwięku na Raspberry Pi

Jak bezprzewodowo odtwarzać dźwięk z komputera, tabletu, lub telefonu? Artykuł opisuje możliwość bezprzewodowego odtwarzania dźwięku z urządzeń Windows/Android/Apple z wykorzystaniem Raspberry Pi jako pośrednika.

Źródło dźwięku na Raspberry Pi

Zacznijmy od zwykłego odtwarzania dźwięku na Raspberry Pi. Raspberry Pi posiada wyjście audio 3,5mm. Jakość dźwięku z tego źródła jest jednak niezadowalająca. Dlatego dużo lepszym rozwiązaniem jest podpięcie zewnętrznego przetwornika audio (USB audio DAC). Sam posiadam urządzenie bazujące na układzie PCM2704 (koszt 50-100zł) do kupienia na Allegro, Aliexpress, itd. Przetwornik najlepiej podłączyć za pośrednictwem aktywnego huba USB (z własnym zasilaniem) .

Po podpięciu przetwornika audio należy ustawić go jako domyślne urządzenie wyjściowe dla dźwięku. Wchodzimy do edycji pliku /etc/modprobe.d/alsa-base.conf

sudo nano /etc/modprobe.d/alsa-base.conf

Odnajdujemy linijki zaczynającą się od options snd-usb-audio index i options snd_bcm2835 i zmieniamy je tak aby snd-usb-audio miał priorytet:

options snd-usb-audio index=0
options snd_bcm2835 index=1

alsa-base.conf

Kolejny plik do zmiany to /etc/asound.conf

sudo nano /etc/asound.conf

Podmieniamy jego zawartość na:

pcm.!default {
        type hw
        card 0
        device 0
        channels 2
}

asound.conf

Zapisujemy oba pliki i rebootujemy Raspberry Pi.

sudo reboot

Po ponownym uruchomieniu wchodzimy do alsa-mixer i powinniśmy zobaczyć nasz USB Audio DAC jako domyślne urządzenie do odtwarzania:

alsamixer

Teraz za pomocą aplikacji mpg123 możemy spróbować odtworzyć plik mp3.

mpg123 /mnt/hdd/dowolny.mp3

Przygotowanie odbioru strumienia na Raspberry Pi

Shairport Sync pozwala na bezprzewodowe odtwarzanie dźwięku na Raspberry Pi z dowolnego nadajnika wspierającego AirPlay. Instrukcja do instalacji znajduje się na stronie GitHub projektu. Zestaw poleceń, który zadziałał dla mnie to:

sudo apt-get update
sudo apt-get install build-essential git autoconf automake libtool libdaemon-dev libasound2-dev libpopt-dev libconfig-dev libao-dev libssl-dev git avahi-utils libwww-perl libcrypt-openssl-rsa-perl libio-socket-inet6-perl  libmodule-build-perl avahi-daemon libavahi-client-dev libssl-dev
git clone https://github.com/mikebrady/shairport-sync.git
cd shairport-sync/
autoreconf -i -f
./configure --with-alsa --with-avahi --with-ssl=openssl --with-metadata --with-systemv
make
sudo make install
sudo update-rc.d shairport-sync defaults 90 10

Konfiguracja aplikacji znajduje się w pliku /etc/shairport-sync.conf. Raspberry Pi rebootujemy i zabieramy się za konfigurację nadajnika. W przypadku urządzeń Apple nie trzeba nic konfigurować, powinniśmy już widzieć Raspberry Pi jako odbiornik AirPlay.

Windows jako źródło dźwięku

Do strumienowania dźwięku z Windows użyłem TuneBlade. Aplikacja w pełni darmowa do opisywanego scenariusza. Instalacja i konfiguracja jest banalnie prosta. Często się jednak zdarza, że domyślny sposób przechwytywania dźwięku przez TuneBlade nie działa. W moim przypadku konieczne było zainstalowanie i skonfigurowanie wirtualnego urządzenia dźwiękowego. Procedura jest opisana na stronie pomocy. Twórcy TuneBlade proponują darmowy VB-Audio Virtual Cable. Instalujemy sterowniki i restartujemy komputer. Na liście urządzeń wejścia/wyjścia dźwięku powinniśmy ujrzeć nowe wirtualne urządzenia.

VB Audio urzadzenia

Przechodzimy do ustawień TuneBlade i zmieniamy źródło strumieniowania z ‚Direct loopback’ na ‚Virtual Device Loopback’ wybierając wirtualne urządzenia w dwóch pozycjach ‚Line-In Device’ i ‚Output Device’.

Tuneblade VB-Audio

Tuneblade powinien już widzieć nasz odbiornik ShairPort – klikamy connect na nasz odbiornik i od tej pory dźwięk będzie strumieniowany do RaspberryPi i powinien być słyszany z głośników. Po aktualizacji do Windows 10 TuneBlade przestał widzieć mój odbiornik. Jeżeli TuneBlade nie widzi naszego odbiornika, a mamy system Windows 10 – warto wyłączyć Protokół internetowy w wersji 6 (TCP/IPv6) w opcjach połączenia sieciowego (Panel sterowania\Sieć i Internet\Centrum sieci i udostępniania -> Zmień ustawienia karty sieciowej -> właściwości wybranej karty sieciowej). Informacja zaczerpnięta z Google grupy Tuneblade.

ipv6

TuneBlade posiada mnóstwo opcji, które są dość proste i nie będę ich opisywał. Korzystanie z VB-Audio uniemożliwia równoczesne strumieniowanie i odtwarzanie dźwięku z głośników komputera. TuneBlade zarządza urządzenia dźwiękowymi tak, że po jego włączeniu zapisuje domyślne urządzenia wejścia/wyjścia i przełącza je na te wybrane w Audio Capture, a po zakończeniu strumieniowania przełącza z powrotem na te uprzednio zapamiętane.

TuneBlade

Dźwięk z Android

Możliwe jest również strumieniowanie z urządzeń Android. Znalazłem aplikację AirAudio teoretycznie darmowa, w praktyce konieczny jest jej zakup (w wersji darmowej po pierwszych 5-ciu minutach nasz dźwięk jest zakłócany ‚piknięciami’). Aplikacja wymaga root’a.

Źródła:

[1] http://raspberrypi.stackexchange.com/questions/19705/usb-card-as-my-default-audio-device

[2] https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=35698

[3] http://www.chickensinenvelopes.net/2016/01/raspberry-pi-airplay-receiver/

[4] http://lifehacker.com/5978594/turn-a-raspberry-pi-into-an-airplay-receiver-for-streaming-music-in-your-living-room

[5] http://drewlustro.com/hi-fi-audio-via-airplay-on-raspberry-pi/

Linux: Kilka przydatnych komend dla programistów

Przedstawię kilka komend linuxowych, które przydają się w codziennej pracy programisty. Niekażdy programista zna linuxa na wylot, w większości przypadków wystarczy znajomość podstaw i kilku, specyficznych dla danej działalności komend. Polecenia są dość jednoznaczne, dlatego nie zamieszczam dokładnego opisu komend.

  1. Zrzut/kopia bazy danych
    mysqldump -h localhost -u username -p database > file.sql
    -p oznacza, że konieczne jest podanie hasła dla użytkownika.
  2. Wgranie/import bazy danych
    mysql --host localhost --user username -p database < file.sql
    -p oznacza, że konieczne jest podanie hasła dla użytkownika.
  3. Policzenie liczby plików/folderów w danym katalogu
    ls /my/dir/ -l | wc -l
  4. Wylistowanie plików/katalogów zawierających w nazwie określony ciąg znaków
    ls /my/dir | grep ".jpg"Komendy z punktów 3 i 4 można połączyć
    ls /my/dir -l | grep ".jpg" | wc -lPost będzie uzupełniany w miarę potrzeb.