OpenRiot v8.0.12: Phantom of the Cable

“The theatre had a cable and no signal. The bar had an icon for the cable. The recorder had a microphone and no monitor. Three performers, one empty stage, and a programme that promised all of them were working. We sent the cable home, taught the recorder to work without the microphone, and stopped printing tickets for the phantom.” – The OpenRiot Crew, v8.0.12


Release Overview

Two small lies leave the building.

The Ethernet icon no longer appears when the interface has no carrier. The phantom em0 on a ThinkPad with no physical port stops taking up space in the bar.

Screen recording works again. It writes the real ffmpeg PID, falls back to video-only when the sndio monitor refuses to open, logs the failure instead of swallowing it, and stops on the second key press. The bar icon is gone; Super+Shift+N is the door.

Total changes: one invisible cable, one recording that starts and stops, and one icon removed from the marquee.


The Invisible Cable

GetEth() used to return a disconnected cable glyph whenever an Ethernet interface existed, carrier or not. On a laptop whose em0 is soldered to the board with no connector, that meant a permanent icon for a cable that could never be plugged in.

It now returns nothing unless status: active is present, and [module/network-eth] has label-empty =. The icon appears when the cable is real and disappears when it is a rumour.

This is the phantom limb problem from v5.4, wearing a new coat. The interface exists. The hardware does not. The bar should believe the carrier, not the inventory.


Video Killed the Radio Star

Screen recording failed in the least useful way possible. It launched ffmpeg through a shell, waited 200 milliseconds, asked pgrep whether ffmpeg existed, and wrote a PID file only if the answer was yes. When the answer was no, isRecording() returned false forever. Every click said “Recording is starting” because every click was the first click.

The recorder now starts ffmpeg directly, writes cmd.Process.Pid immediately, and checks whether the process is still alive after 700 milliseconds. If the audio path dies, it restores the sndio flags, drops the microphone, and starts a video-only recording. That fallback is the difference between a recorder and a notification generator.

ffmpeg now logs to ~/.cache/openriot/screenrec.log. The next time it fails, the reason is on disk instead of inside a discarded pipe.

The second press works because the PID file now contains a PID that exists. SIGINT finalizes the MP4. The test recording came out at 601 KB, which is not a lot of cinema but is a complete file with a beginning and an end.


The Empty Microphone

The sndio monitor path is not guaranteed. enableAudioMonitor can succeed and ffmpeg can still fail to open snd/0.mon. That is what happened here.

The recorder treats audio as an optional track. If ffmpeg exits during the startup check, it tries again without audio and tells you “No audio monitor available, screen only.” The video keeps rolling. The notification is honest. The file is playable.

A recording with no audio is still a recording. A recording with no file is a press release.


One Door for the Recorder

The screen recording icon is gone from the right bar.

Super+Shift+N still toggles recording. The polybar module definition remains in the template, unused, for the day the icon earns its place back. Until then the bar does not advertise a button that spent months saying “starting” and never starting.

The Pinball Wizard had flippers. The bar has a keybinding. That is enough.


🧾 Files Changed

File Change
source/screenrec/screenrec.go Real PID capture, liveness
  check, audio fallback, ffmpeg log
source/network/network.go Ethernet icon only on carrier
config/polybar/config.ini.tmpl label-empty for Ethernet,
  screenrec icon removed
install/openriot Rebuilt with the changes

🗣️ Final Words

“The phantom cable took its bow and left. The recorder found its own PID, lost its microphone, kept the picture, and stopped when asked. The bar is quieter. The files are real. Curtain.” – The OpenRiot Crew, v8.0.12