Experimental Naim Support

Earlier this year I bought a beautiful Naim Uniti Nova for our living room. In combination with Kanta 2 speakers it sounds fantastic, but I’m less enthusiastic about the accompanying app. Rigelian was the natural candidate to improve on this, so for the last half year I’ve been working on adding support for it in combination with UPnP.

Apps like mconnect work as UPnP control point, effectively sitting between a UPnP media server (the music files) and a UPnP renderer (the player). A control point provides music files to the renderer one by one, so it needs to be running all the time. This is different to the philosophy behind Rigelian, which doesn’t have to be running for music to continue playing.

An alternative approach is to use BubbleUPnP, which you can install in your network, and which can serve as a control point between media server and renderer. BubbleUPnP does this by creating an OpenHome renderer which in turn controls a UPnP renderer. The OpenHome renderer is controlled through a protocol that is originally created by Linn and open sourced as ohNet. It’s built in C++, and I tried to create a swift package from this, similar as I did for libmpdclient. This was a frustrating experience and after about 2 months I gave up. Too bad, because this would be the way to connect any UPnP media server to any UPnP renderer in a way that fits the Rigelian architecture.

So I went back to the drawing board, and started investigating how the Naim iOS app and web app communicate to the player. This seemed like a feasible way forward. Rigelian is based on a generic ConnectorProtocol, which consists of sub-protocols for Status Monitoring, Control and Browsing. The Naim protocol provides all required endpoints to implement the Status Monitoring and Control sub-protocols, while UPnP can mostly support the Browsing sub-protocol. Some specific browsing functions, like for artist and genre, are not well supported by UPnP media servers, a fallback for that was to introduce a cache to enable those functions.

The result of this is released today as an experimental function in Rigelian v2.6.0. It supports discovery of a Naim player, selecting a UPnP source to use in combination with the Naim player, folder browsing, browsing of album, artist and genre, search and all existing ways to add albums or tracks to the play queue.

Not supported are playlists and browsing of cloud services. But Rigelian will pick-up player favourites, which includes albums / tracks / playlists that are marked as favourite on Tidal. So at least those can be played.