Építsünk bárhol használható AirPlay servert magunknak, mert az jó

Ma ilyen sütit gyártunk:

suti-nem-suti

...illetve dehogyis, hát nem olvastad a címet, kis butus? :) A süti majd jön valamikor a közeljövőben, most inkább hackeljünk!

Az ötlet elég régóta motoszkál a fejemben: olyan konykakész megoldást akarok, amiből kilóg egy audio out és egy tápcsatlakozó és az eszköz AirPlay serverként funkcionál, azaz küldhetek drótok nélkül az ő audio portjára zenét. Az ilyen dobozkát be lehet építeni az autóba, vagy akár egy aktív hangfal dobozába és kész a wireless audio stream bárhol. Nézzük, mire jutottam.

Kétféle megoldást fogok megmutatni - mindkettő járt már a fejemben elég régóta. Az érdekes az, hogy mindkét ötletet implementálták már korábban, vannak is róluk többé-kevésbé használható leírások, én mégis összeszedem ide a saját tapasztalataimat, mert szerintem több szempontból is megéri.

"No time Tolouse" hack: Airport Express vérének kiontása teliholdkor

Az első ötletet a lifehacker dokumentálta precízen. Ennek a lényege, hogy egy gyári Apple Airport Expresst kinyitunk, a nagyfeszültségű tápot kiszedjük és a helyére egy 5V-3.3V átalakítóval egy USB aljzatot kötünk, amit megtáplálunk egy mezei szivargyújtós USB tápkábellel. Az Airport Expresst az asztalon felkonfiguráljuk, aztán mehet a kocsiba, vagy akár a nappaliba bárhova (ez utóbbi esetben nyilván nincs sok értelme annak, hogy szétbarmoljuk a pöpec kis Apple hardvert).

Hozzávalók és költségek
  • Airport Express: ~32000 HUF
  • USB drót: ~500 HUF
  • 5V-3.3V átalakító: ~1000 HUF
  • szivargyújtós USB töltő: ~1500 HUF

Nagyjából tehát 35000 pénzből hozzuk ki a dolgot.

Időszükséglet
  • Airport Express konfigurál: ~10 perc
  • Airport Express szétszed, táp kibányász, stepdown konverter beforraszt, USB drót beforraszt: ~45 perc

Közel egy órát pepecselünk tehát evvel a verzióval.

"Szeretünk rollerezni" hack: Raspberry Pi-vel minimalizáljuk a költségeket

A Raspberry Pi alapú játék igazi do it yourself feladat lesz. Nincs konyhakész disztró erre (vagy legalábbis én nem találtam), nekünk kell shellben nindzsáznunk. Azért ez sem rocket science, nyugi.

Hozzávalók és költségek
  • RPi "A" variáns (egy USB port, no ethernet), 8GB-os SD kárytával: ~9600 HUF
  • Micro USB táp (számoljuk csak a kocsiba valót): ~1000 HUF
  • USB billentyűzet és HUB - legyen az, hogy van otthon vagy kölcsönbe: 0 HUF
  • RPi dobozka: ~1000 HUF

Szűk 12000 HUF pénzből összeszedtük tehát a vasat - az nem is rossz, közel a harmada a "kényelmes" confignak!

Időszükséglet

Több forrást is találtam, akik a stock Raspbian OS-ből indulva építenek ilyen configot maguknak. Az egyik egy Instructables leírás volt, míg a másik Stanislav Khromov kicsit up-to-date-ebb tutorialja. Kisebb-nagyobb gubancok mindkettővel akadtak, ezért gondoltam, írok egy harmadikat, hogy lássuk, mivel telik az idő, miután kiperkáltuk a 12000 HUF-ot a vasért.

0. Preface

Feltételezem, hogy a default "pi" userrel lépsz be és annak home folderében csinálsz mindent, amit írok.

1. OS

Ha a RPink mellé rendeltünk gyári SD kártyát, akkor azon nagy eséllyel NOOBS lesz installálva, ami az első bootkor rákérdez, hogy melyik disztrót kérjük és helyettünk süt-főz-mosogat kicsit, majd reboot után előáll a disztónk. Ha magunk csináljuk, akkor vettünk egy 8+ gigás SD kártyát és felpakoltuk rá a Raspbiant. Ezt nem részletezném, tökéletes leírás van minden platformra a Raspberry Pi wikijében.
A Raspbian egyébként egy Debian Linux disztró fork.

2. OS config

Mindenekelőtt csomag adatbázist frissítünk, beállítjuk a locale-t, billentyűzetet, hostname-et:

sudo apt-get update && apt-get upgrade
sudo raspi-config

3. WiFi install

Én egy 2000 HUF-os Logilink donglét használtam. A Raspbian gyárilag tartalmazza a hozzávaló firmware-ralink modult, így ezzel semmi dolgunk, csak magát a network interface-t kell bekonfigurálnunk. Módosítsuk meg a /etc/network/interfaces file-t:

sudo vim /etc/network/interfaces

Ez legyen az új file-ban:

auto lo
iface lo inet loopback
 
iface eth0 inet dhcp
 
auto wlan0
  iface wlan0 inet dhcp
  wpa-ssid "a_wifi_routered_ssidje"
  wpa-psk "a_wifi_routered_passwordje"

Ha ezt elmentettük, bootoljuk újra a RPi-t és nézzük meg, hogy látszik-e a wlan0 network interface:

ifconfig -a

4. Dependency install

Az shairport névre hallgató AirPlay servercsomagunk forrásának fordításához kell majd pár csomag, így felpakoljuk azokat:

sudo apt-get install vim build-essential libssl-dev libcrypt-openssl-rsa-perl libao-dev libio-socket-inet6-perl libwww-perl avahi-utils pkg-config git chkconfig libssl-dev libavahi-client-dev libasound2-dev pcregrep pgrep

5. Csúnyán pattanó hang kikapcsolása a hangkártya indulásakor

Ehhez a kis masinánk komplett firmware-ét cseréljük az aktuálisra:

git clone git://github.com/Hexxeh/rpi-update.git
sudo rpi-update/rpi-update

Ez elmolyol egy darabig, majd közli, ha minden OK és akkor rebootolhatunk egy sudo reboot parancs kiadásával (fehér ember nem veszi el a tápot proper shutdown nélkül ugye...)

6. ALSA config módosítás

Azért, hogy a shairport indulásakor ne Unknown PCM cards.pcm.front hibát kapjunk, bele kell picit túrnunk a hangkártyát meghajtó software configfile-jába:

sudo vim /usr/share/alsa/alsa.conf

Itt keressük meg a pcm.front cards.pcm.front részt és cseréljük ki pcm.front cards.pcm.default értékre.

7. avahi daemon hack

Ez a discovery service - nem a TV csatorna, egy másik. Ha érdekel a mélye, itt a link felül. A lényeg, hogy a default configgal az avahi daemon szeret nekünk avahi-daemon disabled because there is a .local domain hibával visszatérni, ami azért nem nagyon jó. Hogy ezt ne tehesse, a DISABLE_TAG paraméterét egy invalid filenévre változtatjuk:

sudo vim /etc/init.d/avahi-daemon

Keresd meg a DISABLE_TAG szöveget és azt a sort cseréld ki erre:

DISABLE_TAG="/var/run/avahi-daemon/disabled-for-unicast-local-DISABLED"

Ha a config módosítás kész, újraindítjuk a daemont és biztos ami biztos bekapcsoljuk, hogy bootkor induljon a service:

sudo service avahi-daemon restart
sudo chkconfig avahi-daemon on

8. Audio teszt

Mielőtt shairportot forgatunk, ellenőrizzük, hogy megy-e a hangkártya. Mindenekelőtt állítsuk be az amixer binárissal default kimenetnek az analóg out-ot, nehogy azért ne szóljon a cucc, mert a HDMIbe tolja a hangjegyeket a mini jack helyett:

amixer cset numid=3 1

Ha ez megvan, akkor letöltünk egy .wav file-t, aztán az aplay binárissal lejátszatjuk próbának:

wget http://snippets.khromov.se/wp-content/uploads/2013/04/piano2.wav
aplay piano2.wav

A próba audio file-t nekik köszönhetjük.
Ha nem megy, akkor indítsunk egy alsamixer binárist és tekerjük fel a volumét úgy 85%-ig, hátha csak azért nem szól az egész, mert nullán volt a hang.

9. Shairport install

Ehhez klónozzuk a git repóból a forrást, aztán konfiguráljuk, fordítunk, majd installérázunk:

git clone -b 1.0-dev git://github.com/abrasive/shairport.git
cd shairport
sudo ./configure
sudo make
sudo make install

Próbáljuk ki, hogy megy-e! Indítsuk el a shellben, aztán nézzük meg egy AirPlay kliensen, hogy megjelent-e a Vizesnyolcas nevű AirPlay audio target:

./shairport -a 'Vizesnyolcas'

Mielőtt továbbszaladnánk, installáljunk kultúráltan, azaz pakoljuk be a default configfile-t és a logrotate démon vezérlőt is a helyére:

sudo cp shairport/scripts/debian/default/shairport /etc/default/
sudo cp shairport/scripts/debian/logrotate.d/shairport /etc/logrotate.d/

10. Shairport autorun install

Be kell konfigurálnunk, hogy a shairport serverünk bootkor magától induljon. Ehhez kell a rendberakott startup script innen:

git clone https://gist.github.com/khromov/6398615
sudo cp 6398615/gistfile1.txt /etc/init.d/shairport

Aztán kapcsold ki, majd be a script bootkori indítását:

sudo chkconfig shairport off
sudo chkconfig shairport on

11. Watchdog

Ha a shairport serverünk a korábban már beállított avahi multicast DNS service felállása előtt indul el, akkor az nem lesz jó. Azért, hogy ezt biztosan kiküszöböljük, egy ronda, de annál hasznosabb watchdog scriptet írunk, ami semmi mást nem csinál, mint leellenőrzi a process listában, hogy fut-e már a shairport daemonunk és ha nem, akkor elindítja:

sudo vim /root/shairport-watchdog.sh

A watchdog scriptünk így néz ki:

pgrep shairport
if [ $? -ne 0 ]
then
 service shairport start
 echo "shairport started or restarted."
fi

Ezt a scriptet aztán percenként egyszer elindíttatjuk a cronnal. Kinyitjuk editálni a /etc/crontab file-t:

sudo /etc/crontab

...és az alábbi sort biggyesztjük a végére:

* * * * * root /bin/sh /root/shairport-watchdog.sh > /dev/null

12. Jog fix

Végül Stanislav tanácsára még megfixáljuk a /home/pi folderünk összes termeiben a jogokat:

sudo chown -R pi:pi /home/pi/

Ha minden jól ment, a következő sudo reboot után kisvártatva meg kell, hogy jelenjen a shairport AirPlay serverünk az AirPlay audio targetek között az AirPlay klienseken. A serverünknek a RPi hostnevét örökli - ha cifrábbat szeretnénk, akkor a /etc/default/shairport file-ban az AP_NAME=SzabadsagElvtasrak sor definiálásával módosíthatunk rajta.

Megvagyunk. Summa summarum, nekem ez keresgéléssel, tokkal-vonóval nagyjából 2 órámba telt - ha nekivágsz, neked valószínűleg kevesebb ideig tart, mivel most up-to-date a fent leírt doksi és így menni fog azonnal. Azt mindenki döntse el maga, hogy végig akarja-e tolni a Linuxos vonalat, vagy inkább karosszékből konfigurálná csak az Airport Expresst, mert úgy érzi, öreg már az efféle hackelősdihez. Az én pálcám a "jó pap holtig" irányba tört most.

5 thoughts on “Építsünk bárhol használható AirPlay servert magunknak, mert az jó

  1. moerphin

    Már lassan egy éve gondolkodom rajta, hogy össze kéne rakni. Ez most megadta az utolsó lökést. Köszönöm! :)

  2. Pingback: 3D nyomtatás: modellezzünk Fusion 360-nal | eFi.blog

  3. orrmany

    Hm, a posztod elgondolkodtatott: ki kéne próbálni, hogy egy Raspberry+Bluetooth alapú megoldással eltüntetni a vezetékes házimozim hátsó hangfalvezetékeit... Költséghatékonynak nem lesz költséghatékony, de hobbi projektnek esetleg jó lesz.

  4. eFi Post author

    Gábor, azért azt ne felejtsd el, hogy az Airplay olyan, mint a népdalban a hollókői kiscsizma (=lagos), ami egy mozinál baromi idegesítő lehet!

  5. Pingback: Mac workflow: hátha SONOSt hoz a Jézuska | eFi.blog

Leave a Reply

Your email address will not be published. Required fields are marked *