Monitoring and troubleshooting¶
Status in the editor¶
The status area shows the connection state, a peak meter of the sent signal (after gain), and metrics from the last minute.
| State | Meaning |
|---|---|
| LIVE | Connected and sending. The time since connecting is shown. |
| connecting | WHIP request sent, waiting for ICE and DTLS. |
| retrying | The last attempt failed; the reason is shown below. The plugin tries again after 1, 2, 4, 5, 5 … seconds. |
| disabled | Send enabled is off. |
| no endpoint | No valid http(s):// endpoint has been applied. |
Log file¶
All instances write their events, and a metrics line every minute, to one shared log file. Lines are prefixed with the group name. The token is never logged.
| OS | Log file |
|---|---|
| Windows | %LOCALAPPDATA%\WhipSend\logs\whip-send.log |
| macOS | ~/Library/Logs/WhipSend/whip-send.log |
| Linux | ~/.local/state/whip-send/whip-send.log |
At 10 MB the log is rotated to whip-send.log.1.
Reading the metrics line¶
metrics state=live rate=48000 ch=1 block=128 cb_ms(n=22499 min=0.00 avg=2.67 max=8.71 sd=0.51)
drift_ppm=-79.8 queue_max_ms=16.0 overrun_frames=0 silence_frames=0 trimmed_frames=0
encoded=14994 pkts=14960 bytes=2123892 nacks=0 rtt_ms=7.6 loss=0.000 jitter_ms=2.2 lost=0 reconnects=0
(Wrapped here for readability; in the log it is one line.)
| Field | Meaning | What to look for |
|---|---|---|
rate, ch, block |
Host sample rate, channels sent, host block size. | |
cb_ms(...) |
Interval between the host's audio callbacks: count, min, average, max, standard deviation. | avg should equal block ÷ rate. A large sd or max means uneven delivery; Dante Virtual Soundcard problems show up here first. |
drift_ppm |
The host's effective sample rate against the computer's clock, since input last started. | Normally within ±100 ppm, and stable. A value that keeps growing means a clock problem. |
queue_max_ms |
Peak depth of the queue between the audio thread and the sender. | Normally about one block. |
overrun_frames |
Audio dropped because the queue was full. | Should stay 0. |
silence_frames |
20 ms frames of silence sent while the host delivered nothing. | Expected while the transport is stopped or the track isn't processed. |
trimmed_frames |
Old audio discarded because the queue exceeded about 150 ms. | Occasional single events are harmless; a steady rise means the sender can't keep up. |
encoded, pkts, bytes |
Opus frames encoded, and RTP packets and bytes sent. | |
nacks |
Retransmission requests from the server. | |
rtt_ms, loss, jitter_ms, lost |
Round-trip time, and loss and jitter as reported by Galène. | Rising loss means a network problem between sender and server. |
reconnects |
Sessions re-established since the plugin started. |
Attributing a problem:
drift_ppmtrending, orcb_msdeviation growing → clock or audio-device problem (see one audio clock).overrun_framesortrimmed_framesrising → the sending thread is starved; the computer is overloaded.lossorjitter_msrising → network between this computer and Galène.- Everything clean, but listeners hear problems → check the listeners'
chrome://webrtc-internalsand the network after Galène.
Common problems¶
| Symptom | Likely cause |
|---|---|
server returned HTTP 401 |
No token sent, and the group requires one. |
server returned HTTP 404 (check the endpoint URL, group name and token) |
Wrong group name, or a wrong or expired token (Galène answers both with 404). |
server returned HTTP 403 |
The token doesn't have the present permission. |
WHIP request failed: io: Connection refused / timeouts |
Server unreachable: wrong host or port, server down, or HTTP blocked. |
Stuck in connecting, then timed out establishing the connection |
The WHIP request worked, but UDP media can't get through. Check firewalls for outgoing UDP. |
connection lost (nothing received from the server for 5 s) |
The server went away or the network dropped. The plugin reconnects by itself. |
no input for 200 ms, sending silence |
Reaper stopped processing the track (transport stopped, monitoring off). |
| Peak meter shows silence while audio plays | Wrong channel mode (e.g. Mono (right) on a signal that is only on the left), or Send gain set very low. |
| The host crashes when you add the plugin or open its editor | No OpenGL 3.2, typically in a virtual machine. See below. |
| Reaper on macOS ignores typing in the endpoint and token fields | Use the Paste buttons. See Gotchas. |
Host crashes when adding the plugin¶
The editor needs OpenGL 3.2 or later. If the system doesn't offer it, the
editor fails while opening, and that takes the whole host down. On Windows,
Reaper shows Microsoft Visual C++ Runtime Library: Runtime Error! first,
and the Windows event log records an APPCRASH of reaper.exe with
exception code 40000015.
This happens on computers without a working graphics driver, most often virtual machines without 3D acceleration (Device Manager shows e.g. Microsoft Basic Display Adapter, Red Hat QXL or VirtIO GPU). Windows itself then only offers OpenGL 1.1.
Fix on Windows: install Mesa for Windows,
which provides OpenGL 4.5 in software. Download the release-msvc archive
and unpack it. Then either:
- System-wide (simplest, for a VM): run
systemwidedeploy.cmdas administrator and choose the core desktop OpenGL drivers. Running the script again offers to uninstall. - For Reaper only: copy
opengl32.dll,libgallium_wgl.dlland, if present,libglapi.dllfrom the archive'sx64folder into Reaper's folder, e.g.C:\Program Files\REAPER (x64). Delete them to undo.
Restart Reaper afterwards. The editor is then drawn by the CPU, which is fine for its simple interface. Don't install Mesa system-wide on a computer with a real graphics card; fix its graphics driver instead.
Finding the cause of other crashes¶
The plugin framework writes panics to a file if the NIH_LOG environment
variable names one. Start the host with it set, reproduce the crash, and
read the file. In PowerShell:
$env:NIH_LOG = "$env:LOCALAPPDATA\WhipSend\logs\nih.log"
& "C:\Program Files\REAPER (x64)\reaper.exe"
On macOS and Linux, start the host from a terminal with NIH_LOG=/tmp/nih.log.
If whip-send.log has a sender started line, the plugin itself started and
the crash came later, e.g. when the editor opened.