Tuesday 5 April 2022

Thoughts on the NymphCast project before its first release

Now that the first release of NymphCast (version 0.1) [1] is coming up soon, it's interesting to reflect on its development over the years, and what I imagine its future will be like.

Originally NC was intended to be just a simple way to stream local audio to a HiFi system or similar in the same room, as an alternative to proprietary solutions like AirPlay and ChromeCast, as well as Linux-only solutions like PulseAudio. This came largely from personal annoyances with the status-quo a few years back: AirPlay was a very Apple-centric thing, while ChromeCast didn't work reliably with anything, while the remaining solutions like PulseAudio brought little joy as well.

Now, a few years later, I have a couple of NymphCast systems set up. Some are just for playing back audio, while others can also do video. There's also a screensaver mode that shows images from a local folder when no content is being played back. The discovery of not only the NC Servers (connected to the speakers and/or display) as well as NC MediaServers (sharing media content on the LAN) is performed automatically using a custom UDP Broadcast-based protocol called NyanSD (Nyanko Service Discovery) that I feel improves on mDNS and DNS-SD if only on functionality and simplicity.


What I also like about the system in this v0.1 state is that it doesn't complicate matters with transcoding (video) content, instead putting the burden of decoding on the playback device alone. This means better quality, smaller content size (during network transfers) and the ability to stream content from even low-powered devices (cue Raspberry Pi-based NASes).

The drive towards efficiency has been a central focus during development, with a number of optimisations such as a lock-free ring buffer [2] for the local data buffer, and a zero-copy refactoring for the underlying remote procedure call library, NymphRPC [3]. Along the way I have learned many interesting details about hardware & operating system aspects, wrestled my way through sometimes vexing debugging challenges, and teamed up with a number of friends and acquaintances in making NC work.


I think perhaps the most difficult question to answer at this point is what NymphCast means to me. As many are eager to point out, NC is hardly the only (free/open source) project that allows for streaming of media content, and there are large HTPC-oriented projects that do everything plus the kitchen sink. In that sense one could say that I have 'wasted my time', but I feel that's rather unfair.

As mentioned, I have learned many things along the way, things which along with the gained experience have made me a better developer today. There are also many reasons why I prefer NC over any of those other projects for my personal use. Not the least of which is that I know every millimetre of it and have made it to fit my own needs first and foremost.

As a continuing way to challenge myself as a developer, its value is also hard to discard. I think the trick for me is to find more synergies with my other interests, such as embedded development, while ensuring that it all stays enjoyable. After all, it's still just a hobby project.


One thing I think will be fun with NymphCast in the future with v0.2 and beyond is that with the tough foundation work done, it is now relatively easy to add 'cool' features. Things like the AngelScript-based 'apps' that can be used to extend the functionality of a basic NC Server system somewhat like a ChromeCast or Apple TV system, only not necessarily restricted to just consuming commercial (streaming) content.

What exactly will happen with the NC project during the next development cycle for v0.2 is hard to say exactly as nothing is set in stone, but I'd be lying if I said that I'm not looking forward to it. Whether it'll ever become more than just a hobby toy is of no real concern to me. At the same time I have found some of the interactions with others about the project rather interesting and inspiring, and I'm flattered that the FreeBSD and Alpine Linux package repositories have up to date builds of NC.


It's been a long journey, with occasional intense stretches of work on NC. I'd be lying if I said it was always easy, but learning to temper my expectations and accepting it as a fun hobby project rather than as something more has made me feel that it was worth it. Today and hopefully in the future as well.


Maya


[1] https://github.com/MayaPosch/NymphCast
[2] https://mayaposch.wordpress.com/2021/11/12/lock-free-ring-buffer-implementation-for-maximum-throughput/
[3] https://mayaposch.wordpress.com/2021/11/11/refactoring-nymphrpc-for-zero-copy-optimisation/

No comments: