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

Command result #1: total 0
Command result #2: total 0
root@PiUSB:~# npm config get prefix
/root/.RoonExtensions

Well, if that directory is empty then you have a broken install.

Can you try once more to reinstall?

Please start by checking if DietPi is up to date, I just updated to version 6.26.3 via the dietpi-update tool. Next run the dietpi-software tool, go to the Uninstall option and uninstall:

  • Node.js
  • Git
  • Roon Extension Manager
  • Docker

After the uninstall is finished type reboot.

After the reboot you start the dietpi-software tool again and select Roon Extension Manager (86) and Docker (162) from the Software Optimised category and then select Install.

Reboot once more, and… :crossed_fingers:

Success! Now have your Extension Manager and CD Player showing in Settings. Thanks.
I am unsure of next steps because, even though the group is reported as the default 24, I don’t know a Drive Path to specify…

Good!

To get the drive path you connect the drive to the Raspberry Pi and then type dmesg. At the end of the output you should see a line like this:

Attached scsi CD-ROM sr1

The path is then /dev/ followed by the identifier shown at the end of the line, in this case /dev/sr1.

The Settings status remains “Reading Table Of Contents…” while the path is identified as sr0 with an error:
sr 0:0:0:0: Attached scsi CD-ROM sr0
Voltage normalised (0x00000000)
[ 547.030959] Under-voltage detected! (0x00050005)
[ 557.430881] Voltage normalised (0x00000000)
[ 563.670883] Under-voltage detected! (0x00050005)

…many times

Looks like your Pi is under-powered, now that it also has to power the drive. Are you using the official 2.5 Amps power supply?

The drive has its own internal power (plugged into AC), and the Pi has an Allo SMPS with 3 Amps.

536.260835] usb 1-1.5: new high-speed USB device number 4 using dwc_otg
[ 536.435327] usb 1-1.5: New USB device found, idVendor=0c0b, idProduct=b001
[ 536.435445] usb 1-1.5: New USB device strings: Mfr=73, Product=77, SerialNumber=101
[ 536.435485] usb 1-1.5: Product: USB 2.0 Storage Adaptor
[ 536.435530] usb 1-1.5: Manufacturer: DMI
[ 536.435606] usb 1-1.5: SerialNumber: 0B020142052B0358
[ 536.436467] usb-storage 1-1.5:2.0: USB Mass Storage device detected
[ 536.446432] scsi host0: usb-storage 1-1.5:2.0
[ 537.585527] scsi 0:0:0:0: CD-ROM PIONEER DVD-RW DVR-105 1.30 PQ: 0 ANSI: 0
[ 537.594871] scsi 0:0:0:0: Attached scsi generic sg0 type 5
[ 537.616164] sr 0:0:0:0: [sr0] scsi3-mmc drive: 32x/32x writer cd/rw xa/form2 cdda tray
[ 537.616173] cdrom: Uniform CD-ROM driver Revision: 3.20
[ 537.616506] sr 0:0:0:0: Attached scsi CD-ROM sr0

What does the extension log tell?

docker logs roon-extension-cd-player

Here’s the last bit of too much text to post here:
<- REQUEST 182 com.roonlabs.settings:1/save_settings {“settings”:{“values”:{“zone”:{“output_id”:“170199ec2b902c0a6eafe7d1f447de1ed3ad”,“name”:“DigiOneSig”},“action”:1,“from”:“1”}},“is_dry_run”:false}
-> COMPLETE 182 Success {“settings”:{“values”:{“zone”:{“output_id”:“170199ec2b902c0a6eafe7d1f447de1ed3ad”,“name”:“DigiOneSig”},“action”:1,“from”:“1”},“layout”:[{“type”:“group”,“title”:“Tune in at: http://192.168.1.112:8000/roon-extension-cd-player",“items”:[{“type”:“zone”,“title”:"Auto-Tune Zone”,“setting”:“zone”},{“type”:“dropdown”,“title”:“Action”,“values”:[{“title”:"(select action)"},{“title”:“Play”,“value”:1},{“title”:“Eject”,“value”:4}],“setting”:“action”},{“type”:“integer”,“min”:1,“title”:“Start at Track”,“setting”:“from”}]}],“has_error”:false}}
-> CONTINUE 26 Changed {“message”:“Reading Table of Contents…”,“is_error”:false}
-> CONTINUE 177 Changed {“settings”:{“values”:{“zone”:{“output_id”:“170199ec2b902c0a6eafe7d1f447de1ed3ad”,“name”:“DigiOneSig”}},“layout”:[{“type”:“group”,“title”:“Tune in at: http://192.168.1.112:8000/roon-extension-cd-player",“items”:[{“type”:“zone”,“title”:"Auto-Tune Zone”,“setting”:“zone”},{“type”:“dropdown”,“title”:“Action”,“values”:[{“title”:"(select action)"},{“title”:“Play”,“value”:1},{“title”:“Eject”,“value”:4}],“setting”:“action”},{“type”:“integer”,“min”:1,“title”:“Start at Track”,“setting”:“from”}]}],“has_error”:false}}
<- REQUEST 183 com.roonlabs.settings:1/unsubscribe_settings {“subscription_key”:“41”}
-> COMPLETE 183 Unsubscribed

Can you please try to play a different cd and then after the “Reading Table of Contents…” message is shown get the log file and post those lines that contain the wodim-stdout: tag?

I’m sorry, but I don’t see those lines. Here’s the last portion:
-> REQUEST 0 com.roonlabs.registry:1/info
<- COMPLETE 0 Success {“core_id”:“f1198f00-d934-4992-bad9-25a2d959eb99”,“display_name”:“Westmere”,“display_version”:“1.6 (build 416) stable”}
-> REQUEST 1 com.roonlabs.registry:1/register {“extension_id”:“com.theappgineer.cd-player”,“display_name”:“CD Player”,“display_version”:“0.2.0”,“publisher”:“The Appgineer",“email”:"theappgineer@google.com”,“required_services”:[“com.roonlabs.transport:2”,“com.roonlabs.browse:1”],“optional_services”:[],“provided_services”:[“com.roonlabs.settings:1”,“com.roonlabs.status:1”,“com.roonlabs.pairing:1”,“com.roonlabs.ping:1”],“website”:“Roon Extension: CD Player v0.2.0”}
2019-10-17T22:07:37.842Z Liquid-stdout: >>> LOG START
2019-10-17T22:07:37.842Z Liquid-stdout: [main:3] Liquidsoap 1.3.3
2019-10-17T22:07:37.842Z Liquid-stdout: [main:3] Using: bytes=[distributed with OCaml 4.02 or above] pcre=7.2.3 dtools=0.4.0 duppy=0.7.2 duppy.syntax=0.7.2 cry=0.6.2 mm=0.3.1 xmlplaylist=0.1.3 lastfm=0.3.0 ogg=0.5.2 vorbis=0.7.1 opus=0.1.2 speex=0.2.1 mad=0.4.4 flac=0.1.3 flac.ogg=0.1.3 dynlink=[distributed with Ocaml] lame=0.3.2 shine=0.2.0 gstreamer=0.2.0 frei0r=0.1.0 theora=0.3.1 gavl=0.1.5 bjack=0.1.4 alsa=0.2.3 ao=0.2.0 samplerate=0.1.2 taglib=0.3.1 magic=0.7.3 camomile=0.8.5 yojson=1.3.2 faad=0.4.0 soundtouch=0.1.7 portaudio=0.2.1 pulseaudio=0.1.2 ladspa=0.1.4 dssi=0.1.1 sdl=0.9.1 camlimages=4.2.0 lo=0.1.0 gd=1.0a5
2019-10-17T22:07:37.842Z Liquid-stdout: [gstreamer.loader:3] Loaded GStreamer 1.14.4 0
2019-10-17T22:07:37.842Z Liquid-stdout: [dynamic.loader:3] Could not find dynamic module for fdkaac encoder.
2019-10-17T22:07:37.842Z Liquid-stdout: [frame:3] Using 44100Hz audio, 25Hz video, 44100Hz master.
2019-10-17T22:07:37.845Z Liquid-stdout: [frame:3] Frame size must be a multiple of 1764 ticks = 1764 audio samples = 1 video samples.
2019-10-17T22:07:37.845Z Liquid-stdout: [frame:3] Targetting ‘frame.duration’: 0.04s = 1764 audio samples = 1764 ticks.
2019-10-17T22:07:37.845Z Liquid-stdout: [frame:3] Frames last 0.04s = 1764 audio samples = 1 video samples = 1764 ticks.
2019-10-17T22:07:37.845Z Liquid-stdout: [threads:3] Created thread “generic queue #1”.
2019-10-17T22:07:37.845Z Liquid-stdout: [threads:3] Created thread “generic queue #2”.
2019-10-17T22:07:37.845Z Liquid-stdout: [threads:3] Created thread “non-blocking queue #1”.
2019-10-17T22:07:37.845Z Liquid-stdout: [threads:3] Created thread “non-blocking queue #2”.
2019-10-17T22:07:37.845Z Liquid-stdout: [input.external_7213:3] Starting process
2019-10-17T22:07:37.849Z Liquid-stdout: [threads:3] Created thread “wallclock_main” (1 total).
2019-10-17T22:07:37.853Z Liquid-stdout: [clock.wallclock_main:3] Streaming loop starts, synchronized with wallclock.
Starting streaming media server: icecast2.
[2019-10-18 01:00:18] WARN CONFIG/_parse_root Warning, not configured, using default value “localhost”. This will cause problems, e.g. with YP directory listings.
[2019-10-18 01:00:18] WARN CONFIG/_parse_root Warning, not configured, using default value “Earth”.
[2019-10-18 01:00:18] WARN CONFIG/_parse_root Warning, contact not configured, using default value “icemaster@localhost”.
WARNING: Can’t change user id unless you are root.
-> REQUEST 0 com.roonlabs.registry:1/info
<- COMPLETE 0 Success {“core_id”:“ee0362fa-fbed-4f80-9991-67e869e496b3”,“display_name”:“Roon Optimized Core Kit”,“display_version”:“1.6 (build 416) stable”}
-> REQUEST 1 com.roonlabs.registry:1/register {“extension_id”:“com.theappgineer.cd-player”,“display_name”:“CD Player”,“display_version”:“0.2.0”,“publisher”:“The Appgineer",“email”:"theappgineer@google.com”,“required_services”:[“com.roonlabs.transport:2”,“com.roonlabs.browse:1”],“optional_services”:[],“provided_services”:[“com.roonlabs.settings:1”,“com.roonlabs.status:1”,“com.roonlabs.pairing:1”,“com.roonlabs.ping:1”],“website”:“Roon Extension: CD Player v0.2.0”}
-> REQUEST 0 com.roonlabs.registry:1/info
<- COMPLETE 0 Success {“core_id”:“f1198f00-d934-4992-bad9-25a2d959eb99”,“display_name”:“Westmere”,“display_version”:“1.6 (build 416) stable”}
-> REQUEST 1 com.roonlabs.registry:1/register {“extension_id”:“com.theappgineer.cd-player”,“display_name”:“CD Player”,“display_version”:“0.2.0”,“publisher”:“The Appgineer",“email”:"theappgineer@google.com”,“required_services”:[“com.roonlabs.transport:2”,“com.roonlabs.browse:1”],“optional_services”:[],“provided_services”:[“com.roonlabs.settings:1”,“com.roonlabs.status:1”,“com.roonlabs.pairing:1”,“com.roonlabs.ping:1”],“website”:“Roon Extension: CD Player v0.2.0”}
2019-10-18T01:00:27.052Z Liquid-stdout: >>> LOG START
2019-10-18T01:00:27.052Z Liquid-stdout: [main:3] Liquidsoap 1.3.3
2019-10-18T01:00:27.052Z Liquid-stdout: [main:3] Using: bytes=[distributed with OCaml 4.02 or above] pcre=7.2.3 dtools=0.4.0 duppy=0.7.2 duppy.syntax=0.7.2 cry=0.6.2 mm=0.3.1 xmlplaylist=0.1.3 lastfm=0.3.0 ogg=0.5.2 vorbis=0.7.1 opus=0.1.2 speex=0.2.1 mad=0.4.4 flac=0.1.3 flac.ogg=0.1.3 dynlink=[distributed with Ocaml] lame=0.3.2 shine=0.2.0 gstreamer=0.2.0 frei0r=0.1.0 theora=0.3.1 gavl=0.1.5 bjack=0.1.4 alsa=0.2.3 ao=0.2.0 samplerate=0.1.2 taglib=0.3.1 magic=0.7.3 camomile=0.8.5 yojson=1.3.2 faad=0.4.0 soundtouch=0.1.7 portaudio=0.2.1 pulseaudio=0.1.2 ladspa=0.1.4 dssi=0.1.1 sdl=0.9.1 camlimages=4.2.0 lo=0.1.0 gd=1.0a5
2019-10-18T01:00:27.052Z Liquid-stdout: [gstreamer.loader:3] Loaded GStreamer 1.14.4 0
2019-10-18T01:00:27.057Z Liquid-stdout: [dynamic.loader:3] Could not find dynamic module for fdkaac encoder.
2019-10-18T01:00:27.057Z Liquid-stdout: [frame:3] Using 44100Hz audio, 25Hz video, 44100Hz master.
2019-10-18T01:00:27.057Z Liquid-stdout: [frame:3] Frame size must be a multiple of 1764 ticks = 1764 audio samples = 1 video samples.
2019-10-18T01:00:27.057Z Liquid-stdout: [frame:3] Targetting ‘frame.duration’: 0.04s = 1764 audio samples = 1764 ticks.
2019-10-18T01:00:27.057Z Liquid-stdout: [frame:3] Frames last 0.04s = 1764 audio samples = 1 video samples = 1764 ticks.
2019-10-18T01:00:27.057Z Liquid-stdout: [threads:3] Created thread “generic queue #1”.
2019-10-18T01:00:27.057Z Liquid-stdout: [threads:3] Created thread “generic queue #2”.
2019-10-18T01:00:27.057Z Liquid-stdout: [threads:3] Created thread “non-blocking queue #1”.
2019-10-18T01:00:27.057Z Liquid-stdout: [threads:3] Created thread “non-blocking queue #2”.
2019-10-18T01:00:27.057Z Liquid-stdout: [input.external_7213:3] Starting process
2019-10-18T01:00:27.067Z Liquid-stdout: [threads:3] Created thread “wallclock_main” (1 total).
2019-10-18T01:00:27.067Z Liquid-stdout: [clock.wallclock_main:3] Streaming loop starts, synchronized with wallclock.
<- CONTINUE 1 Registered {“core_id”:“ee0362fa-fbed-4f80-9991-67e869e496b3”,“display_name”:“Roon Optimized Core Kit”,“display_version”:“1.6 (build 416) stable”,“token”:“c672c217-b207-4211-befb-6e66fb5b4555”,“provided_services”:[“com.roonlabs.transport:2”,“com.roonlabs.browse:1”],“http_port”:9100}
<- REQUEST 30762 com.roonlabs.status:1/subscribe_status {“subscription_key”:“289”}
-> CONTINUE 30762 Subscribed {“message”:null,“is_error”:null}
<- REQUEST 30763 com.roonlabs.pairing:1/subscribe_pairing {“subscription_key”:“290”}
-> CONTINUE 30763 Subscribed {“paired_core_id”:“ee0362fa-fbed-4f80-9991-67e869e496b3”}
<- REQUEST 30765 com.roonlabs.settings:1/subscribe_settings {“subscription_key”:“291”}
-> CONTINUE 30765 Subscribed {“settings”:{“values”:{},“layout”:[{“type”:“group”,“title”:“Tune in at: http://192.168.1.112:8000/roon-extension-cd-player",“items”:[{“type”:“zone”,“title”:"Auto-Tune Zone”,“setting”:“zone”},{“type”:“dropdown”,“title”:“Action”,“values”:[{“title”:"(select action)"},{“title”:“Play”,“value”:1},{“title”:“Eject”,“value”:4}],“setting”:“action”}]}],“has_error”:false}}
<- REQUEST 30769 com.roonlabs.settings:1/save_settings {“settings”:{“values”:{“action”:1}},“is_dry_run”:true}
-> COMPLETE 30769 Success {“settings”:{“values”:{“action”:1,“from”:“1”},“layout”:[{“type”:“group”,“title”:“Tune in at: http://192.168.1.112:8000/roon-extension-cd-player",“items”:[{“type”:“zone”,“title”:"Auto-Tune Zone”,“setting”:“zone”},{“type”:“dropdown”,“title”:“Action”,“values”:[{“title”:"(select action)"},{“title”:“Play”,“value”:1},{“title”:“Eject”,“value”:4}],“setting”:“action”},{“type”:“integer”,“min”:1,“title”:“Start at Track”,“setting”:“from”}]}],“has_error”:false}}
<- REQUEST 30771 com.roonlabs.settings:1/save_settings {“settings”:{“values”:{“action”:1,“from”:“1”}},“is_dry_run”:false}
-> COMPLETE 30771 Success {“settings”:{“values”:{“action”:1,“from”:“1”},“layout”:[{“type”:“group”,“title”:“Tune in at: http://192.168.1.112:8000/roon-extension-cd-player",“items”:[{“type”:“zone”,“title”:"Auto-Tune Zone”,“setting”:“zone”},{“type”:“dropdown”,“title”:“Action”,“values”:[{“title”:"(select action)"},{“title”:“Play”,“value”:1},{“title”:“Eject”,“value”:4}],“setting”:“action”},{“type”:“integer”,“min”:1,“title”:“Start at Track”,“setting”:“from”}]}],“has_error”:false}}
-> CONTINUE 30762 Changed {“message”:“Reading Table of Contents…”,“is_error”:false}
-> CONTINUE 30765 Changed {“settings”:{“values”:{},“layout”:[{“type”:“group”,“title”:“Tune in at: http://192.168.1.112:8000/roon-extension-cd-player",“items”:[{“type”:“zone”,“title”:"Auto-Tune Zone”,“setting”:“zone”},{“type”:“dropdown”,“title”:“Action”,“values”:[{“title”:"(select action)"},{“title”:“Play”,“value”:1},{“title”:“Eject”,“value”:4}],“setting”:“action”},{“type”:“integer”,“min”:1,“title”:“Start at Track”,“setting”:“from”}]}],“has_error”:false}}
<- REQUEST 30772 com.roonlabs.settings:1/unsubscribe_settings {“subscription_key”:“291”}
-> COMPLETE 30772 Unsubscribed

No drive activity. Did you specify the drive path during installation as: /dev/sr0

About to run out of options here :frowning:

Hail Jan!
I started over by etching the latest DietPi image for the RPi, and then followed your excellent instructions. Please forgive me for wasting so much of your time.

I am listening to lossless FLAC from cd right now.

Based on the bumpy ride you had, there must be room for improvement.

For those who will try this after you, I made the first revision of the detailed description. I tried to capture especially those points that were a hurdle for you. Maybe you can have a look and let me know if anything is missing.

Oh, and feel free to follow step 7 of the guide (and 6 of course).

OK, here are a couple of things that might still confuse those of us who aren’t code literate and have to be shown simple pictures:

Maybe you should explicitly say that Extension Manager and Docker can be running on any device on the local network to then appear in Settings>Extensions, just as any endpoint is discovered by core.

When you show a screen like the Icecast2 status, I expect to see it along the way, and get nervous about missing something when I don’t. Which I didn’t.

-Most Roon Tinkerers probably don’t need my level of handholding, but will likely tolerate you stating the obvious for folks like me-

Thank you. I’m very glad that I can now enjoy my room correction filters with tunes that aren’t streaming in or already part of my library. I only wish that I could do the same using devices that output S/PDIF, but that’s moving the goal post from a touchdown we should take some time to celebrate. Congratulations.

1 Like

This looks like a phenomenal plug-in and exactly what I would need for my use case.

I am new to the Roon world and want to use ROCK (or MOCK, really) on a HTPC with an internal optical drive. I’ve been told ROCK can’t play CDs, so would this be the solution? Thanks!

Hi Jan,
Great extension, I am a big fan of it!
Works perfectly with a simple setup as described in your DYI section.

I’m just facing an issue with another kind of setup using a DietPi VM on a Windows 10 box and VirtualBox (other location, other setup).
Is there a way to use the local CD-Rom drive (eg SATA connected) rather than a CD-Rom USB Drive?

Did you try a such configuration through Hyper-V?
I did a test with it and everything works well until the playback shows “This type of audio file isn’t supported” when visiting the Icecast 2 URL.

Do you think it is an issue with the virtual CD mapping feature?

Thanks for your help!
Julien

I could never get Jan’s ripper to work in a VM on my NAS properly. Gave up in the end and the Roon released their own ripper for ROCK. It may be the issue I had with that extension are similar to this one.

I’m having good results with running DietPi under VirtualBox, as I described in the VM instructions. I don’t know if it is possible to access a SATA optical drive within the VM.

I haven’t tried DietPi on Hyper-V as it requires Windows Pro, what I don’t have, and doesn’t run besides VirtualBox.

This CD Player extension got replaced by the CD Entrypoint. You can read about Entrypoints in this thread:

Compared to the CD Player the CD Entrypoint has the following improvements:

  • After first setup of the CD Entrypoint radio-stream in Roon, CD playback can be directly started by playing the stream. If there is a disk in the drive it will spin-up an play.
  • Besides seeking to a specific track also seeking to next and previous track is possible.
  • Streaming latency is reduced.
  • Metadata is acquired from MusicBrainz instead of freedb, as the latter is no longer online.
2 Likes