Let op: Tweakers stopt per 2023 met Tweakblogs. In dit artikel leggen we uit waarom we hiervoor hebben gekozen.

Hacken met 8 jaar oude mediaspeler

Door trab_78 op zaterdag 16 mei 2020 11:50 - Reacties (11)
Categorie: -, Views: 6.559

Inleiding

Ik heb een hekel aan abonnementsdiensten als het om streaming gaat. Zeker voor muziek vind ik het belangrijk dat ik de media bezit. Ik moet er niet aan denken dat ik allerlei muziek ineens niet meer kan luisteren als om één of andere reden het abonnement op een streamingdienst niet meer werkt.

Dus heb ik al jaren mijn muziekverzameling op mijn Synology DiskStation NAS staan. Veel geripte CD's, maar ook recenter spul, wat ik via de iTunes store, of soms een andere online store, heb aangeschaft. Ik gebruik de muziekspeler die bij de DiskStation hoort. De webspeler heet Audio Station, de mobiele app heet DS Audio. Deze speler kan je op twee manieren gebruiken:
  • Je kunt muziek 'lokaal' afspelen. Dus in je browser of op het device waar je de mobiele app draait.
  • Je kunt muziek 'pushen' naar een DLNA of Airplay apparaat.
Ik gebruik beiden. De eerste vooral onderweg. Werkt natuurlijk ook prima in de auto. De tweede optie gebruik ik thuis, en daar gaat deze blog over.

Het probleem

In mijn woonkamer staat een Apple TV 4K, die is aangesloten op mijn Denon versterker, die tevens dienst doet als HDMI switch. De versterker is weer verbonden met de TV. Mijn TV is gemonteerd op een TV-lift in mijn TV-meubel. Als ik geen TV kijk, is de lift naar beneden en is de TV dus verborgen. Daarom is het belangrijk dat ik muziek "headless" kan afspelen: ik wil niet mijn TV omhoog doen alleen om de muziek te selecteren. Tot nu toe werkte dat prima: met de DS Audio app kon ik een stream starten, waarbij de muziek vervolgens rechtstreeks van mijn NAS naar de Apple TV gestreamd wordt. (Ik kan mijn telefoon bij wijze van spreken het raam uit gooien en dan speelt de muziek gewoon door.)

Helaas is de Airplay ondersteuning van Synology niet heel erg goed. Apple zit al heel lang op Airplay 2, maar om een of andere reden is Synology blijven steken op Airplay 1. Dat werkt niet helemaal lekker samen dus. Toen ik overstapte van een ouder model Apple TV naar de Apple TV 4K, liep ik daar al eens tegenaan. Met hulp van Synology support heb ik toen een work around ingesteld: om één of andere reden werkt het wel als je een Airplay wachtwoord instelt.

Maar helaas, nadat dit meer dan een jaar goed gewerkt heeft, gooide een software update van de Apple TV roet in het eten. Sinds een paar maanden vertoont het afspelen van muziek kuren. Het begint goed, maar na een tijdje spelen stopt de muziek ineens. Op te lossen door even te pauzeren en weer te starten. Maar het begon steeds vaker op te treden. Op een gegeven moment elke twee minuten. Dan is er geen lol meer aan om muziek te luisteren. Uiteraard weer contact gehad met Synology support. Ze hebben het probleem doorgespeeld naar hun ontwikkelafdeling. Misschien dat het ooit wel wordt opgelost, maar dat gaat me te lang duren.

Als het goed is, wordt vanaf DSM 7.0 ook Airplay 2 ondersteund door Synology. Mogelijk dat dat dit probleem ook oplost. Maar ook die release zal nog wel even op zich laten wachten.

Een voor de hand liggende gedachte is dat het mogelijk een netwerk-issue is. Dat heb ik uitgesloten omdat de NAS en de Apple TV beiden bedraad zijn aangesloten op een Gigabit Ethernet Switch, en video streaming zonder problemen en vloeiend gaat.

De oplossing

Ik ben dus op zoek gegaan naar een andere, tijdelijke (?), oplossing. Omdat het hopelijk tijdelijk is, wilde ik er zo min mogelijk geld aan uitgeven. Op Vraag & Aanbod vond ik een tweedehands media speler met UPnP/DLNA ondersteuning, een AC Ryan Playon!HD Mini. Ik kon hem voor €5 + verzendkosten in huis halen, dus daar kon ik me geen buil aan vallen. Er was wel een uitdaging bij: de bijbehorende afstandsbediening zat er niet meer bij. Aangezien ik een oude universele afstandsbediening had liggen, leek me dat niet zo'n probleem.
Afstandsbediening
Na een paar dagen had ik hem in huis. Aangesloten en hoppa, beeld! De universele afstandsbediening heeft een modus waarbij hij achter elkaar alle bekende codes probeert. Op het moment dat je apparaat dan reageert, stop je de procedure en staat de AB dus ingesteld op de juiste set van codes. Dat werd een tegenvaller: de AB was alle codes langs geweest, en de speler had niet gereageerd. Blijkbaar gebruikt de speler dus een set codes die niet in de database van de AB voorkomt.

Plan B dan: een USB toetsenbord aansluiten. Dat werkte. Met behulp van de pijltjestoetsen kon ik door de menu's van de speler navigeren. Om één of andere reden was het bladeren door de tabs in het instellingen menu gekoppeld aan de skip forward (>>|) en skip backward (|<<) knoppen. Hij reageerde niet op de mediatoetsen van mijn Apple toetsenbord. Ik kon een Logitech toetsenbord met mediatoetsen lenen van een buurman en daar reageerde hij wel op.
UPnP / DLNA streaming
Nu was ik in staat instellingen te maken en het lukte ook om muziek af te spelen vanaf mijn NAS. Helaas alleen als ik dat initieerde vanaf de Playon!HD. "Pushen" vanaf de NAS wilde niet lukken. Heel even verscheen er een Realtek apparaat in de lijst van DLNA apparaten op de NAS, maar na één mislukte poging daar muziek heen te pushen, verdween hij weer. Dat hij als Realtek apparaat herkend werd, klopt trouwens wel: de Playon!HD Mini is gebaseerd op een Realtek RTD128x chip.

En toen begon het grote googlen. Zou er een manier zijn om de Playon!HD toch als goed werkende UPnP renderer te gebruiken? Het werd een interessante zoektocht.
Intermezzo: DLNA en UPnP - hoe zit dat?
Ik leerde een hoop bij over DLNA en UPnP, ik deel hier een samenvatting. UPnP is een set van standaarden gericht op het makkelijk aansluiten van verschillende apparaten in huis. UPnP apparaten kunnen bijvoorbeeld automagisch port forwarding instellen op een router die ook UPnP ondersteunt. En UPnP definieert dus ook standaarden om media te streamen tussen apparaten. DLNA is een organisatie die op basis van de UPnP standaarden een meer samenhangende standaard heeft gedefinieerd. Deze slides van het UPnP forum leggen uit hoe UPnP de basis is voor DLNA.

Belangrijke begrippen hierbij zijn:
  • Media Server: apparaat waarop media zijn opgeslagen, dat een set van services biedt waarmee deze toegankelijk gemaakt worden.
  • Media Renderer: apparaat dat media kan weergeven (renderen). Biedt services aan om media te streamen en vervolgens af te spelen.
  • Control Point of Controller:
  • apparaat dat gebruikt wordt voor bediening van zowel een Server als een Renderer.
Een apparaat kan ook meerdere van deze rollen combineren in één apparaat. Een typische mediaspeler verenigt bijvoorbeeld meestal een Renderer en een Controller.

In mijn situatie is de NAS dus de Media Server, de Playon!HD Mini is de Media Renderer en de DS Audio app op mijn telefoon is het Control Point. Deze info gaf mij weer wat zoektermen om mijn zoektocht naar een oplossing wat gerichter te doen. Via de List of UPnP AV media servers and clients op Wikipedia kwam ik erachter dat er verschillende open source implementaties van media renderers zijn.
Inloggen via telnet
Zo kwam ik op het idee om te kijken of ik één van die renderers kon installeren op mijn Playon!HD Mini. Na wat zoeken op internet leerde ik dat je gewoon kunt telnetten naar het apparaatje. Je kunt inloggen als root zonder wachtwoord. (Alleen op een intern netwerk gebruiken dus!) Op de Playon!HD Mini draait een vrij oude Linux kernel met daarop een -eveneens oude versie van- BusyBox. (BusyBox is een single executable, die in z'n eentje de veelgebruikte *nix command line tools implementeert.)

Eerst eens kijken of ik een firmware update kon vinden. Helaas is de Europese tak van A.C. Ryan in 2012 failliet gegaan. Op de website van A.C. Ryan is geen spoor meer te vinden van de Playon! serie. In de cache van zoekmachines vind je af en toe nog een link naar informatie op de oude site, maar dat leidt altijd naar een 404 op de huidige A.C. Ryan website.

Toen heb ik nog geprobeerd om 'losse' binaries te vinden die geschikt zijn voor Linux op de Realtek RTD128x. Het is een MIPS processortje, daar zijn Linux distros voor. Maar zo'n distro installeren op dit apparaatje lijkt geen haalbare kaart, omdat zaken als een BIOS en normale I/O ontbreken. Ik heb nog geprobeerd wat losse binaries erheen te kopiëren (met TFTP), maar het lukte me niet ze uit te voeren.
moServices
Al speurend op internet, stuitte ik op moServices. Een custom firmware voor apparaten die gemaakt zijn op basis van de Realtek RTD128x of vergelijkbare SOC's. Het blijkt dat diverse fabrikanten apparaatjes hebben uitgebracht die heel erg lijken op het referentieontwerp van Realtek. Daardoor is gebleken dat de firmwares van al die apparaatjes uitwisselbaar zijn. De (Russische) enthousiastelingen van moServices hebben uiteindelijk een custom firmware samengesteld op basis van de beste en meest recente onderdelen uit verschillende van die firmwares en daar zelf de nodige (open source) software aan toegevoegd. (Merk op dat "meest recent" in dit geval nog steeds relatief oud is, het is een apparaat uit 2012 en ook fabrikanten die niet failliet gingen, zijn uiteindelijk natuurlijk gestopt met ondersteuning en doorontwikkeling.)

De instructies op het forum zijn niet heel erg duidelijk, waarschijnlijk ook omdat ze door russen geschreven zijn. Diverse apparaten op basis van de RTD128x worden bij naam genoemd, maar de A.C.Ryan apparaatjes kom je op het forum niet of nauwelijks tegen. Er was dus een kans dat het niet zou werken en dat ik mijn Playon!HD mini zou bricken. Maar ik had weinig te verliezen, dus besloot het erop te wagen.
Firmware flashen
De website van moServices bestaat alleen maar uit een forum. Het grootste deel daarvan is in het Russisch, maar er zijn een aantal Engelstalige pagina's. (En Google translate helpt met de rest.)

De firmware heb ik gedownload van deze pagina. Er staan twee varianten, ik heb de eerste genomen, dus zonder de toevoeging "with ordinary install". Ik denk dat die "ordinary install" gaat over een soort installatie-wizard die je helpt een skin te kiezen. Aangezien ik uit een andere beschrijving ergens op dat forum had opgemaakt dat dat met de afstandsbediening werkt, leek me dat in mijn geval geen handig keuze.

In de Engelstalige FAQ staat duidelijk vermeld dat je voor het flashen een FAT32 geformatteerde USB drive moet gebruiken, waar je het bestand
install.img
op zet. Even opletten: de downloads zijn zip-files, waar die
.img
file in zit. Op macOS moet je hem via de command line uitpakken, want als je hem uitpakt door te dubbelklikken in de Finder, pakt macOS automagisch ook de
.img
-file uit. Kwestie van een Terminal openen en daar typen:
code:
1
unzip amp_r13_nogui_install.zip


Daarna gewoon de
install.img
file kopiëren naar de USB drive.

Dan het flashen zelf. Op het moServices forum worden drie methodes beschreven. Ik heb gekozen voor de makkelijkste, via de update optie in het menu. Werkte prima.

Nadat de nieuwe firmware geïnstalleerd is, draait er een webserver op poort 80 van het apparaatje. Je kunt dus gewoon browsen naar het IP-adres van het ding. In die interface kan je hem beheren. Je kunt skins downloaden en installeren, modules aan- en uitzetten en nog wat dingen. Niet de meest gelikte interface, maar ook niet heel slecht ofzo. Werkt prima in ieder geval. Omdat ik dus de "kale" installatie had gekozen, moest ik via deze weg een "skin" installeren, zodat er ook een GUI op mijn TV verscheen. Ik koos voor de VRT Gui, omdat die wordt aanbevolen als de meest stabiele.
Afstandsbediening, revisited
Eén van de leuke dingen van deze firmware, is dat er een module bij zit om IR-codes te remappen. Deze module heet IRFake. En omdat ik toch wel graag wilde dat de player zou werken met mijn oude universele afstandsbediening, ben ik daar wat verder in gedoken. De pagina van het IRFake programmaatje zelf op Google Code bestaat helaas niet meer. Maar op het moServices forum vond ik deze thread waar e.e.a. wordt uitgelegd over IRFake. De beschrijving daar is wel wat achterhaald, want je hoeft de module niet via een telnet sessie te installeren, dat kan gewoon via de webinterface.

Wat wel kan via telnet, is IRFake starten in 'capture mode'. Dan kan je dus een toets indrukken op de AB en geeft hij de key code weer op de console. Op die manier heb ik de codes van een aantal relevante toetsen op mijn universele afstandsbediening achterhaald. IRFake starten in capture mode gaat zo:
[code=shell]
irfake4 -c
[code]
IRFake heeft ook een keurige "usage" melding als je hem opstart met
-h
. Er mag maar 1 instantie van het programma draaien. Dus als de IRFake module van moServices actief is, kan je hem niet starten. Eerst de module stoppen dus, en daarna starten in capture mode.

Met de gevonden codes kon ik de
irfake.conf
file aanpassen. Dat gaat gewoon via de webinterface. Maar het kan uiteraard ook in een telnetsessie. Daarna kon ik mijn Playon!HD Mini bedienen met mijn universele afstandsbediening.
UPnP rendering
De laatste horde die ik moest nemen, was het pushen van muziek vanaf mijn NAS aan de praat krijgen. Het eerste wat opviel, wat dat de "Realtek UPnP Renderer" nu consequent zichtbaar was op de NAS en in de DS Audio app. Maar het streamen wilde niet meteen lukken.

Het starten van een stream via de UI van de Playon!HD mini lukte altijd, maar pushen met de DS Audio app lukte alleen bij bepaalde playlists. Het bleek dat playlists met MP3-bestanden zonder problemen afspeelden, terwijl andere formaten problemen gaven. Dat vond ik raar, omdat alle formaten ondersteund zouden moeten worden door de Realtek chip. Dat bleek ook, omdat het afspelen wel lukte als ik het initieerde vanaf de Playon!HD mini. Ik ben wat gaan snuffelen in de instellingen van de UPnP-server van de NAS. Daar staat een optie om bepaalde audioformaten te transcoden voor "verhoogede compatibiliteit met DLNA apparaten". Maar blijkbaar doet dat meer kwaad dan goed, want door die optie helemaal uit te schakelen, werkte het wel.

Conclusie

Eind goed al goed. Ik heb een oud apparaatje kunnen redden van de storthoop en kan weer met plezier audio streamen in mijn woonkamer. Ondertussen weer wat geleerd over DLNA, UPnP en BusyBox. En wederom aangetoond dat je zonder abonnement bij een van de grote streamingdiensten toch overal je favoriete muziek kunt streamen.