Critical NullReferenceException on Trinnov Altitude after input switch (ref#9WJQ6A)

What best describes your playback issue?

· Music doesn't start when I press "Play"

What type of Zone is affected by this problem?

· *All of my Zones* are affected.

Does the issue affect all file formats?

· The issue affects *multiple/all* file formats.

Does the issue happen with local library music, streaming service music, or both?

· *Both streaming and local* *library* music are affected.

Do you encounter any playback errors with the "System Output" Zone?

· The System Output has the same problem as my other Zone.

Do you have a complex network setup?

· I have a *mesh network* with devices connected to multiples points

Your local network might need some re-arranging to support Roon.

· None of the suggestions have helped me. I'd like to submit a support request.

Do you have an approximate timestamp of when the issue last occurred?

· Errors are clear in the log

What are the make and model of the affected audio device(s) and the connection type?

· Trinnov Altitude 32 4.4.3. plus Linux Roon Server

Describe the issue

Trinnov Altitude (Roon Ready) zone permanently broken after input switch — Critical NullReferenceException in RaatEndpointIntegration.DoSelectSource — reproducible on 2.70 (build 1671) and 2.71 EA (build 1675)

Describe your network setup

Direct wired to the router. Mesh is available but not relevant for the server and the trinnov. Both are hardwired.

Hey @B-K,

Thanks for writing in and for sharing your report. They made this straightforward to pin down, and your instinct was right: this isn’t your network. Your mesh setup and hardwired connections aren’t involved.

When the Altitude’s input is switched away from the Roon source and back, the Roon Ready source-control handshake leaves Roon Server holding a stale reference to the endpoint.

The next time it tries to start playback, it hits a NullReferenceException in its source-selection code (RaatEndpointIntegration.DoSelectSource), and from that point every Play/Next/Pause on the zone fails until Roon Server is restarted.

The same crash also ties up the server’s playback thread, which drags your System Output zone down with it, that’s why it looked like all zones were affected rather than just the Trinnov.

This is a confirmed software bug on our side, and we already have a development ticket open for it. I’ve added your logs and reproduction details to that ticket. I can’t commit to a timeline yet, but it’s tracked and in our developers’ hands.

In the meantime:

  • Restarting Roon Server clears the fault and restores playback (until an input switch triggers it again).
  • If it's practical, avoiding switching the Altitude's input away from the Roon source and back will keep the zone stable between restarts.
Once a fix is found, it will be added to the next Early Access release, and will be included in our [url=https://community.roonlabs.com/c/early-access/software-release-notes/129]Software Release Notes here[/url].

Thanks again for the thorough report, it genuinely sped this up. :folded_hands:

Hey @B-K,

Just checking in on this. Were you able to try restarting Roon Server to clear the stale endpoint state, and, if it was practical, keeping the Altitude on the Roon source instead of switching away and back? If you have seen the same NullReferenceException behavior again, let us know what changed and we can take another look.

Please note, if we don’t hear back from you this thread may close automatically soon. If the thread auto-closes and you need further assistance, please submit a reopen support request via the technical support help form below and specify that the issue should be reopened. Thank you.

@noris Hi, thanks for your message. Unfortunately, the problem won’t sort itself out. At first, I had to completely restart the server. That was a faff and took time, as I’m running a headless system. I’ve now written a script that checks the server every 2 minutes and performs a clean-up and a restart as soon as the problem reoccurs after switching channels. Only then does it work again. As soon as I switch channels and then go back to Roon, the whole thing starts all over again. It’s a problem that can be reproduced very consistently. With out the cleanup and restart it stays silent permanently.

Please also note my previously written detailed report…

Thanks for your help.

Cheers


[Moderator edit: report merged below so all the history is together.]


Hi - I’ve been having a really nasty problem for some time now, which I notice very clearly every day when I’m using the system. I’ve already tried to pinpoint the cause of the problem. Here are my findings. I’d appreciate some help.**

Roon Core Machine**

Linux server (Debian 12, kernel 6.12, x86_64), RoonServer installed natively as a systemd service with a dedicated data directory. Currently on 2.71 earlyaccess (build 1675); identical behavior previously on 2.70 production (build 1671).

Networking Gear & Setup Details

All devices wired Gigabit Ethernet on the same subnet. No VLANs, no WiFi involved for Core or endpoint.

Connected Audio Devices

Trinnov Altitude 32, Roon Ready (RAAT over network), firmware 4.4.3 (unchanged for months).

Description of Issue

Reproducible sequence:

  1. Roon plays to the Trinnov zone normally.

  2. I switch the Trinnov’s input away from Roon (optical input, watching TV for a while).

  3. I switch back to the Roon input and start playback.

What happens then, from the Core logs:

The RAAT control channel is healthy: request_source is answered with {"status": "Success"}, the source control goes to “selected”, volume control works. But the endpoint prepare fails:

Warn: [zoneplayer/raat] Failed to prepare Trinnov Altitude32 in 15000ms. Giving up
Warn: [zoneplayer/raat] failed to setup any endpoints..giving up
Warn: [zone Altitude] Track Stopped Due to Error

Notably, the device’s audio connection (raat/tcpaudiosource) is only logged as connected roughly 20 seconds after the setup request — just after Roon’s 15-second timeout expired.

From that moment the zone is permanently unusable. Every transport action (Play, PlayPause, Next) throws:

Critical: scx: System.NullReferenceException: Object reference not set to an instance of an object.
   at Sooloos.Broker.Transport.RaatEndpointIntegration.DoSelectSource(ResultCallback cb_result)
   at Sooloos.Broker.Transport.Endpoint._SelectSource(ResultCallback cb_result)
   at Sooloos.Broker.Transport.Zone._SelectSource(ResultCallback cb_result)
   at Sooloos.Broker.Transport.Zone._PlayPause()

I also captured the Core crashing on the write path mid-playback right before such an episode:

Warn: [raat_ll/client] [Trinnov Altitude32] error writing to connection: System.NullReferenceException
   at Roon.Audio.Raat.Client._BeginWrite()

followed by repeated failed to connect(0) Connection refused against the device, whose RAAT port changes between reconnects (which suggests the device’s Roon Ready service restarts as well).

Everything I tried, in detail

  1. Restarting RoonServer only: does NOT fix it — after a restart, the very first Play on the zone throws the same NullReferenceException again.

  2. Stopping RoonServer, waiting 30 seconds, starting: no change.

  3. Power-cycling the Trinnov only: no change.

  4. Stopping RoonServer, deleting the contents of the Cache folder inside the RoonServer data directory, then starting: this initially appeared to be a reliable fix (playback worked immediately afterwards). On later occurrences, however, the broken state re-formed within about 90 seconds even with a freshly rebuilt cache — so the cache is evidently not the (only) place the broken state lives.

  5. Disabling and re-enabling the zone under Settings → Audio: no change on the occasion tested.

  6. Restarting RoonServer AND power-cycling the Trinnov together: this is currently the reliable recovery path.

  7. As a mitigation I now run a small cron watchdog on the Core machine that greps the current log for the two signatures above (“Failed to prepare” / “DoSelectSource”) and then stops RoonServer, clears the cache and restarts it. This keeps the system usable for the household, but it is obviously just a band-aid.

  8. Updating to Early Access 2.71 (build 1675): the issue is still fully reproducible there (prepare timeout at 11:57:47, NREs at 11:59:05 and 11:59:50 local time on 2026-07-20).

Interpretation / suggestion

The trigger appears to be the device being slow to bring up its audio socket after an input switch (more than 15 seconds — I will report that side to Trinnov as well). But the Core’s reaction looks like a genuine bug: after “Failed to prepare … Giving up”, the RaatEndpointIntegration object seems to be left in a half-initialized state, and every subsequent SelectSource null-derefs instead of retrying or rebuilding the endpoint. Supporting this: the zone occasionally self-heals when the RAAT connection is fully torn down and the endpoint object is recreated. A null-guard plus endpoint rebuild after a failed prepare (or a retry / longer or configurable timeout for the prepare itself) would likely make this recoverable without restarting the Core.

This setup ran for a long time without this issue; I first noticed it some weeks ago and cannot tie it to a specific version change on either side. I’m happy to provide full logs or enable diagnostics — the timestamps above should make the episodes easy to find.

PS: a little correction on my initial report. My script to clean up the issue already mentioned above works without restarting the Trinnov either. I just need to wait until the job is done on my Linux roon server. Due to the fact that the Trinnov is not the root cause I haven’t reached the support from Trinnov.

Hey @B-K,

Thanks for the update, and for the correction, that’s a useful detail.

What you’re describing lines up exactly with the bug we confirmed. Once a failed prepare leaves the endpoint half-initialized, every subsequent SelectSource null-derefs, and nothing short of tearing that state down brings the zone back. Your watchdog is doing precisely that: clearing the cache and restarting Roon Server rebuilds the endpoint from scratch, which is why it recovers without touching the Trinnov. It’s a clever stopgap, and it confirms our read that the broken state lives on the server side, not the device.

You’re also right not to chase Trinnov on this. The slow audio-socket bring-up after an input switch is what trips the 15-second timeout, but the permanent failure afterward is on us. The server should rebuild the endpoint or retry rather than getting stuck, and that’s the part our development ticket covers.

There’s nothing more we need from you for now, and any fix will land in an Early Access build and show up in the Software Release Notes.

Appreciate the detective work on this one.

You can keep track of both Early Access release notes as well as our Production release notes below:

Production:

Early Access:

@benjamin thanks Ben for confirming. Any rough ETA for the fix?

Hey @B-K,

We have submitted the ticket to the development team, and it is in the work queue. As a matter of policy, we are not able to share timelines or comment on any ETA at this point.

We will keep an eye on it from our side, and any fix will be called out in the Software Release Notes when it lands. Thank you in advance for your patience as this work takes place.