4 Commits
Author SHA1 Message Date
Jon BenistonandClaude Opus 5 a7330d6d13 MCP: review fixes across the tools, capture, streams, config writer and bridge
Tools: listen and scan reclaim their earlier channels before retuning the device, so a scanner
left running cannot move it in between; scan counts a range before building it; booleans are
read from JSON booleans, numbers and strings alike, so replace "false" is false and freeze 1
freezes; a MIMO device set takes receive and transmit channel types; deletion is serialised
from lookup to completion so two concurrent reclaims cannot take a third channel; tune_gain
refuses a gain or AGC key the device lacks; start_iq_recording checks the name first and cleans
up by UID; describe_settings emits a definition matched by name; remove_last_deviceset reports
a timeout; a device set a failed listen or scan created is removed again.

Capture: a name resolving to the capture directory itself is refused, a drive root works, and
files are listed by prefix rather than wildcard. The audio clock starts before the wait for the
sample rate. Subscriptions are capped per session, device set URIs checked, and absent device
sets skipped by the poll. The Codex writer drops dotted managed keys and refuses a spelling it
cannot rewrite rather than adding a duplicate table.

Bridge: one session at a time when SDRangel comes back, the stream socket is shut down rather
than closed from the other thread, SIGPIPE cannot end the process, and a failed notification
gets no reply.

Also: tool calls and audio captures give up when the server stops, so stopping the feature
cannot deadlock on a call waiting for the main thread; channels are held by UID throughout;
socket timeouts in the bridge; ResourceNotFound for a resources/read of a URI that is not there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 10:09:13 +01:00
Jon BenistonandClaude Opus 5 2ad3ca735a MCP: digital voice listen modes with the standard's deviation, and no stray recordings
listen modes dmr, dpmr, dstar, ysf, nxdn and nxdn24 set the DSD demodulator's FM deviation and
baud rate to what the standard needs, from the plugin readme's table, and dmr switches on both
time slots. Plain dsd sets the defaults explicitly so a retuned demodulator gets them too.

record_iq waited for nothing between patching the FileSink's file name and posting the record
action, and the action reaches the DSP thread ahead of settings routed through the channel, so
the sink recorded briefly to its old, empty name, leaving a .<timestamp>.sdriq in the working
directory. The file name is now confirmed on the channel before recording starts, and a bad
name is refused before a FileSink is added for it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:53:59 +01:00
Jon BenistonandClaude Opus 5 a61159566e MCP: review fixes for feature reclaim, AIS pair reuse, capture paths and bridge subscriptions
A feature listen added is kept while any channel of a type that feeds it exists, whoever
added it, so cleanup cannot take away a feature the user's own decoder is using.

A repeated listen in a paired mode retunes both demodulators rather than reclaiming and
recreating them: reuse is allowed when the intent channels of the type number what the mode
uses, and the partner is kept through the reclaim.

The capture path check resolves the nearest existing ancestor of the target to where the file
system really puts it, so a symbolic link or junction under the capture directory cannot lead
a recording outside it. Qt's canonical path does not see through a junction on Windows, so
the final path is asked of the system there.

The bridge remembers the resources the client subscribed to and subscribes again whenever it
rebuilds a session after SDRangel restarts, so updates carry on arriving.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:12:55 +01:00
Jon Beniston d6ef170800 Add MCP server plugin. 2026-09-11 20:11:10 +01:00