Roon Extension: CD Player [obsolete, upgrade to Entrypoints]

With the CD Ripper extension in place I was wondering if it would be possible to use the same hardware setup for CD playback. In the past I experimented a bit with local streaming and picked this up again by using the instructions written by @qdtjni as a starting point. The idea is to wrap the local streaming solution in a Docker container to have it distributable via the Extension Manager, as is done for the CD Ripper.

Getting something that plays was a matter of days but getting the details right and having it also running on a Raspberry Pi took a few weeks. Now I reached the point that it is ready for the initial release!

What does it do

The CD Player extension reads raw tracks from the CD and, on the fly, converts them into an Ogg Flac stream, this stream is then sent to a server that broadcasts it on the local network. The local broadcast can be picked up by configuring an Internet Radio station in Roon or by visiting the URL with a web browser. The Roon API is used to get a tight Roon integration. When CD playback is started the internet radio station is automatically selected for the configured “Auto Tune” zone.

Some more details:

  • The Ogg FLAC stream is lossless so the music arrives in its full glory
  • Reading from the CD is done in single speed to reduce background noise in case the setup is placed in the listening room
  • The internet radio status is off-air if there is no CD played
  • Metadata is shown in the extension status message
  • Basic controls are available via the extension Settings (Play, Play from Track, Stop)

Why a CD player if you have Roon? (before you ask)

This extension might not have very typical use cases but the use cases I see are:

  • “Emergency” playback. You have a CD and want to hear a track from it without ripping the CD and grooming the metadata first
  • Other’s collection playback. A friend is visiting and brought a few CDs with him that he wants you to play
  • Incidental playback. You want to play a few tracks from that CD you never considered worth ripping.

From a technical perspective this is also a prove of concept, it might pave the way for other audio input extensions.


The extension can be installed via the Extension Manager (Docker is required) after updating the Extension Repository to version 0.3.4. At installation the path of the optical drive has to be specified and the group ID of the cdrom group. This can be determined with the command (on the device at which the extension runs):

getent group cdrom

The group might also be called optical, this is e.g. the case on Arch Linux.

The number to use is at the end of the output line between the colons. If no group ID is specified a default of 24 will be used.


Is there an interest in a more detailed description on how to build your own Roon CD Player/Ripper? Necessary components will be a Raspberry Pi an SD card and a (USB) optical drive. Let me know.

1 Like

Nice work.

1 Like

Great extension!
often i find myself in the first case. I buy a CD and i’ve only 10 minutes of free time to listen to some tracks on the fly. Or a friend lends me a different version of an album (remastered, remixed …) and i can make a quick comparison.
A little question: it work with a sacd layer? Or automatically read the cd layer (if it’s an hybrid sacd)?

1 Like

It’s CD only, so it will read the CD layer of a hybrid.

CD Player v0.2.0 is now available

This release adds two new actions: Pause and Eject. With these actions all basic controls of a CD player are in.

How to install / update

The recommended way to install or update is via the Roon Extension Manager.

If the manager has auto update enabled then the changes will be pulled in the next time the update is performed. It is also possible to update manually via the Settings dialog, select the CD Player from the Playback category and perform the update action.

Note: This is a Docker based extension, it requires a Docker for Linux installation in order to run.


Hello Jan. Yes, I have the RPi, SD card and USB drive, but not the mental firepower to implement your innovation. I have installed the Extension Manager and Docker on a leftover RPi 3B (which is NOT my core) using the DietPi software install utility, and am now stuck.

Please provide a detailed guide for us slackers. Thanks!

Next step is to verify the installation. Check if you see the Extension Manager in Roon, select the “hamburger menu” and then Settings→Extensions (not available via phone interface). If it is there then you press the Settings button right from the entry, select Playback in the Category dropdown and check if the CD Player is available in the Playback Extensions dropdown (see the image in the Installation section of the first post).

If this is all there then you have a working installation. If not then let me know what is missing / not working. After confirmation of your status we can continue from here. Once I know what the difficulties are I can work on a detailed guide.

How do I see the Settings→Extensions GUI on a separate RPi (running Roon Remote) when I am used to accessing those settings on my NUC with ROCK?

That the extensions are running on a RPi doesn’t make a difference on how to access them. Get to the device that you always use to control Roon (i.e. your Roon Remote) and open the menu from there.

What device do you use to control Roon?

I have several, including Mac, iPads etc, but am only offered an opportunity to configure Roon OS devices on my network which are running Core, not Remote like the RPis.

Extensions are not configured via a Roon OS specific interface.

What does you Roon setup look like?

Looks like you are running your core on ROCK and use an iPad to connect to it for e.g. music selection. Pick your iPad click on the “hamburger menu” in the upper left corner and then select Settings, from there you select Extensions from the list on the left. Is there anything in the extension list?

Make sure the RPi is on the same network as your core and iPad.

Yes, I have core on ROCK, and can control from other devices. But when I look at the “hamburger menu” and then select Settings, and then Extensions, there are none. RPi is on the network and available as an endpoint.

Should I install the Extension Manager on ROCK?

OK, this is the place where it should happen. You cannot install extensions on ROCK.

If the same RPi is available as an endpoint then the networking should be fine and we have to dive deeper into the DietPi setup. You told that you used the DietPi installer to install the Extension Manager. Can you get to the DietPi command line and give the following command?

systemctl status roon-extension-manager

Please let me know what the output is.

output: root@PiUSB:~# systemctl status roon-extension-manager
● roon-extension-manager.service - Roon Extension Manager
Loaded: loaded (/etc/systemd/system/roon-extension-manager.service; disabled; vendor preset: enabled)
Active: failed (Result: start-limit-hit) since Sat 2019-10-12 23:31:36 BST; 21h ago
Process: 1320 ExecStart=/root/.RoonExtensions/bin/ (code=exited, status=0/SUCCESS)
Main PID: 1320 (code=exited, status=0/SUCCESS)
CPU: 524ms

Oct 12 23:31:36 PiUSB systemd[1]: roon-extension-manager.service: Service hold-off time over, scheduling restar
Oct 12 23:31:36 PiUSB systemd[1]: Stopped Roon Extension Manager.
Oct 12 23:31:36 PiUSB systemd[1]: roon-extension-manager.service: Start request repeated too quickly.

Oct 12 23:31:36 PiUSB systemd[1]: Failed to start Roon Extension Manager.
Oct 12 23:31:36 PiUSB systemd[1]: roon-extension-manager.service: Unit entered failed state.
Oct 12 23:31:36 PiUSB systemd[1]: roon-extension-manager.service: Failed with result ‘start-limit-hit’.

I removed, and then reinstalled. Same result.

We are getting closer.

Using the DietPi command line again, can you give the following three commands and report the output of the last one?

systemctl stop roon-extension-manager
cd ~/.RoonExtensions/bin

./ 2: cd: can’t cd to node_modules/roon-extension-manager
throw err;

Error: Cannot find module ‘/root/.RoonExtensions/bin’
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:794:15)
at Function.Module._load (internal/modules/cjs/loader.js:687:27)
at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
at internal/main/run_main_module.js:17:11 {
requireStack: []

Sorry wrong commands, please try this:

cd ~/.RoonExtensions/lib

…/bin/ 2: cd: can’t cd to node_modules/roon-extension-manager
throw err;

Error: Cannot find module ‘/root/.RoonExtensions/lib’
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:794:15)
at Function.Module._load (internal/modules/cjs/loader.js:687:27)
at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
at internal/main/run_main_module.js:17:11 {
requireStack: []