Features
- A KrakenSDR is five Device nodes wired to one Array, not a device kind of its own (191d51b)
- A recorder keeps an optional pre-roll, and the time machine node retires (191d51b)
- A recording and a signal generator are picked by a Device node like any radio (191d51b)
- Examples: twelve working workspaces you can import and change (d71cbca)
- Note: markdown you leave on the canvas (e84e03d)
- Remote access through app.sdrmm.com is gone; use your own tunnel (b4dd06d)
- Rotator: Winegard Trav'ler mounts point over their motor console (e1e5a06)
- SAME alerts: NOAA Weather Radio and EAS headers, with the counties they cover (04a3c80)
- The server listens on 127.0.0.1 by default and refuses a wider bind without a token (191d51b)
- The signal generator and the virtual radios share one synthetic backend (191d51b)
Fixes
- A baseline writer refuses to run unless it is asked for by name (41b122b)
- A channel keeps the first radio ID and tells no contact apart from the first (191d51b)
- A closed DSC squelch no longer grows the decoder buffers without bound (191d51b)
- A codeplug address that runs past the 32 bit space is refused instead of wrapping (191d51b)
- A codeplug with two entries of one name keeps its references on the first (191d51b)
- A collection file is on disk before its lanes look like recordings (191d51b)
- A CPM demodulator only accepts the input domain it was built for (191d51b)
- A dead subcarrier, an ISI-free response and a stalled clock no longer panic (191d51b)
- A decoder log CSV export cannot smuggle a spreadsheet formula (191d51b)
- A failed close of a radio session is reported instead of swallowed (191d51b)
- A failed migration read no longer drops the audio chain it was lifting (191d51b)
- A history capture marks the gap it spliced over (191d51b)
- A label outside the constellation is refused instead of modulating point zero (191d51b)
- A LoRa channel name is bounded by its own 32 character limit (191d51b)
- A malformed RS41, wM-Bus or NAVTEX frame is rejected instead of stopping the decoder (f531d30)
- A matrix cell out of range or a solve without a factorization is refused (191d51b)
- A missing array surface slot counts as a dropped surface, not a dropped report (191d51b)
- A NanoVNA zoom drag stays inside the measured band (191d51b)
- A new node lands where it was placed instead of jumping as the viewport animates twice (191d51b)
- A newly learned trunk plan is written down in channel order (191d51b)
- A non-finite sample no longer drives the AGC to full gain (675e45d)
- A notch width reads in hertz (191d51b)
- A paired server cannot flood the phone with an oversized reply (191d51b)
- A partial page write keeps the Radtel flash past the table it was given (191d51b)
- A phone recovers from a sensor sample stamped in the future (191d51b)
- A radio refuses more than 64 channels on one lane (191d51b)
- A radio that advertises no sample rates keeps the rate it was given (191d51b)
- A radio transfer that crashed no longer blocks every later identify, read and write (191d51b)
- A read or write to a radio leaves the server answering other requests (191d51b)
- A recording upload that lies about its size is refused instead of ending the server (74f800c)
- A removed row no longer commits its neighbour's unsaved edit (191d51b)
- A right-click or middle-click on a frequency digit no longer retunes (191d51b)
- A rotator serial port can be picked while a GPS receiver is attached (191d51b)
- A satellite track with an unreachable time is refused instead of hanging (191d51b)
- A saved sweep that fails to load now says so (191d51b)
- A scanner refuses a zero step or an over-wide range when the workspace is saved (191d51b)
- A server without a token answers only its own addresses, localhost and the names it was given (191d51b)
- A session can watch only so many sinks and ports, and a socket takes bounded messages (191d51b)
- A short write to an AnyTone radio no longer zeroes the next contact record (191d51b)
- A spectrum frame that does not fit the transform is dropped instead of killing its worker (191d51b)
- A stalled recording no longer stalls a radio's settings or its shutdown (191d51b)
- A stored Kraken workspace becomes five radios on one array (191d51b)
- A stored workspace naming a backend this build dropped clears that node's radio (191d51b)
- A time machine belongs to its workspace and arms again when you come back (6e5f37f)
- A token the vault refuses starts no session (191d51b)
- A truncated capture or a failed channel fit now surfaces (191d51b)
- A truncated CPDLC route clearance is rejected instead of rendered blank (191d51b)
- A vanished recordings folder no longer empties the recording index (2508fc5)
- A video face counts the pictures it had to drop (191d51b)
- A WAV with an extra chunk reports the right length (191d51b)
- AD936x: sample datagrams are taken from the radio only, and an extreme errno is reported (191d51b)
- ADS-B tracks a hub sized fleet and reports evicted tracks (191d51b)
- Airspy, Airspy HF+ and HackRF open on Linux with a kernel module bound, instead of reporting the radio as in use (c2c5879)
- Airspy: the receiver is switched on after its transfers are queued (191d51b)
- An amp stage reads out in the unit its firmware reports (191d51b)
- An array collection recording keeps every lane on the same sample (191d51b)
- An array lane whose radio restarted is re-leased and reported as down (191d51b)
- An array processor reports a surface it could not publish as a lost surface, not a lost report (191d51b)
- An array reports a correction it could not clear and an aggregator that panicked (191d51b)
- An audio spectrogram keeps its history when the palette changes (191d51b)
- An event filter counts characters, not bytes, and the contains field stops at its limit (191d51b)
- An imported recording lands whole or not at all, and a cut upload surfaces (191d51b)
- An off-screen Scope stops redrawing its trace until it comes back (191d51b)
- An oversized frame is refused at encode instead of writing a truncated length (191d51b)
- An oversized ionosonde feed is refused while it is still arriving (191d51b)
- An uploaded recording with backwards captures is refused instead of panicking (191d51b)
- Android release builds fail without a keystore instead of writing an unsigned APK (191d51b)
- APRS rejects coordinates past the pole and the meridian (191d51b)
- APRS speed and altitude read in km/h and metres (dcd1bcd)
- Array sample alignment no longer stalls while a processor retires (191d51b)
- Blocks lost to a lagging stream reach the dropped count in diagnostics (191d51b)
- Bluetooth: a truncated service UUID list is counted instead of dropped (191d51b)
- CR-8: a tuning the radio cannot reach is refused, and its serial is read within bounds (191d51b)
- D-STAR plays the voice of the frame that carries the superframe sync (191d51b)
- D-STAR reports the slow data message and its full twenty characters (191d51b)
- DAB: 80 kbit/s services at protection level 1 decode instead of staying silent (ad814ec)
- DAB+: audio lost to reception errors leaves a gap of its own length instead of draining the buffer (b9f15d3)
- DAB decodes unequal error protected sub-channels that carry padding bits (191d51b)
- DAB reports a sub-channel whose size disagrees with its protection profile instead of playing silence (191d51b)
- Decoder labels name the evidence: off air, reference fixture, or our own modulator (191d51b)
- Degenerate DSP inputs are refused instead of panicking (191d51b)
- Dependencies move to current, closing three zip advisories in the Windows updater (5d32ce3)
- Desktop: a download's save dialog no longer freezes the app on Linux (29873c5)
- Desktop installers are checked against the stamped version before release (191d51b)
- Devices: a radio that refuses one re-arm is dialled again within the restart budget instead of ending the stream (89cbde5)
- Devices: a radio two workspaces reach for at once is opened once, not dialled twice (4606dab)
- Digital voice decoders report the frames they throw away (191d51b)
- DMR discards an embedded or short link control that never terminates (191d51b)
- Drone Remote ID: beacons that fail to parse are counted, and the encoder keeps the unknown track and accuracy codes honest (191d51b)
- DVB applies a multi-section program or map table only once every section has arrived (191d51b)
- DVB ignores a table announced for later until it becomes current (191d51b)
- Each decoder is named once in the wire table that builds its settings and limits (191d51b)
- ERMES: an inverted signal decodes, and dropped pager frames are counted (191d51b)
- ESP-SDR: a lost start reply still stops the board, and one bad datagram is skipped (191d51b)
- Every device backend has one name, shared by the engine, the doctor and the browser (191d51b)
- Every modem throughput gate refuses a baseline recorded on another host instead of passing (191d51b)
- Every serial port list hides dial-in nodes, pseudo ports and bridge duplicates (191d51b)
- FLEX: out of range capcodes and unchecked block information words no longer make pages (191d51b)
- French Remote ID: horizontal speed reads the full unsigned range (191d51b)
- FunCube Dongle: transfers the kernel still owns keep their buffers until the device closes (191d51b)
- GNSS rejects a C/A cross-correlation peak instead of locking the wrong PRN (191d51b)
- GSM: the message log and cell readouts show the newest frames, not the first ones heard (720f42c)
- HFDL reads the neighbour frequency bitmap byte aligned and attributes an uplink to its own aircraft (191d51b)
- Inmarsat Aero burst demodulators are built once instead of once per burst (191d51b)
- Inmarsat STD-C flags a gap in an EGC sequence and reports rectangular extents in degrees (191d51b)
- ISM: a lone trailing half-bit and an overlong pulse no longer stretch a decoded row (191d51b)
- ISM: an Oregon THGR122N frame whose temperature is not plausible BCD is dropped instead of reported (191d51b)
- KiwiSDR: a held socket that will not arm says why instead of opening a second channel (191d51b)
- Kraken: bank settings pause the stream the way a single dongle does (191d51b)
- M17 extended addresses no longer print as a callsign (191d51b)
- MIAM, ADS-C and ARINC 622 reject out of range values instead of wrapping them (191d51b)
- NAVTEX reports characters lost in every copy (191d51b)
- NFM keeps CTCSS and DCS out of the audio in every tone mode (191d51b)
- NFM receive de-emphasises at 750 us and the transmitter pre-emphasises to match (191d51b)
- NXDN keeps the last frame of an over and survives a jittered sync (191d51b)
- NXDN names the RF direct channel correctly (191d51b)
- OFDM: a preamble found at the very start of a stream decodes instead of panicking (d8489f3)
- P25 counts network identifier errors over the protected bits (191d51b)
- POCSAG: a page poisoned by an uncorrectable codeword is counted (191d51b)
- Port types say what they carry: baseband, video, control, position and array (191d51b)
- Rack grips take the keyboard and name themselves to a screen reader (191d51b)
- Radar and spatial canvases stay sharp at browser zoom (604a646)
- Radios: a capture that could not arm leaves the radio stopped (191d51b)
- Radiosondes: the M10 and M20 GPS week stays in the current epoch without a code change (191d51b)
- Reconnecting to the server no longer re-runs a tool over serial (191d51b)
- Removing an array switches its noise source off instead of leaving it injecting (191d51b)
- Retuning a DMR receiver forgets the last site's masked checksums and trunking tier (191d51b)
- RTL-SDR: 28.8 MHz engages the upconverter, and a tuner reset that failed is reported (191d51b)
- RTL-SDR: a serial write and an open stay on the dongle the scan found (191d51b)
- RTL-SDR: a stalled demod register write is read back and written again, so frequency and gain changes work on Windows (ff1dec3)
- rtl_tcp: a dial is retried while the server is between clients, instead of failing on one timeout (5594af5)
- rtl_tcp: let go of the old connection before dialling the next one, so a server that serves one client at a time greets the reconnect (b0040ca)
- rtl_tcp streams on the connection it was greeted on and waits out a server still letting go of its last client (8633698)
- Saved signal generator nodes move to the virtual backend on load (191d51b)
- SDRplay: a receiver selected behind a stuck lock is released again (191d51b)
- SDRplay: a stream the API will not stop keeps the memory its callbacks use (191d51b)
- Signal generator: a signal it cannot synthesise fails instead of streaming silence (191d51b)
- SoapySDR: a 0.9 runtime is loaded, next to 0.8 (0f32b4a)
- SoapySDR: a driver fault on a setting or a timestamp surfaces instead of being guessed at (191d51b)
- SoapySDR: a probe helper whose output is held no longer wedges the capture thread (191d51b)
- SoapySDR: the module farm is private to this process, and a stall probes only the radios in view (191d51b)
- SpyServer streams on the connection it handshook on instead of dialling a second time (055ffcd)
- SSTV Robot 72 sends its second chroma porch at the published 1500 Hz (191d51b)
- The 4FSK curve matches the decoder that measures it, and a curve tolerance follows its error counts (41b122b)
- The database takes a second process writing to it, and deletes clear the rows that pointed at what went (191d51b)
- The decision-directed carrier detector slices each symbol once (191d51b)
- The limits say how many channels and monitors one radio can host (191d51b)
- The map panel survives switching the sink feed off and on again (191d51b)
- The scanner refuses a sweep wider than the engine's target cap (191d51b)
- The signal identifier finds a sync word at the very start of a capture window (191d51b)
- The signal identifier reports a flat band's centre in hertz so its zoom lands on the band (191d51b)
- The signal identifier says why a confirmation decoder or frame search could not run (191d51b)
- The UI reads the audio rate, audio seeds, survey grid, decoder defaults and wM-Bus key shapes from the server (191d51b)
- TLS and async internals updated for the rustls, webpki and tokio advisories (a3d5fd3)
- Undo and redo no longer leave a gain stage twice in the saved settings (191d51b)
- VDL2 ATN reassembly needs every segment covered and caps its pending buffers (191d51b)
- VHF ACARS decodes the application layer, reassembles multi-block messages and counts rejected blocks (191d51b)
- Virtual radios are offered only where the server serves them (191d51b)
- VOR radials stay accurate at the shortest report interval and an out of range navaid interval is refused (191d51b)
- w-MBus: variable length records read their BCD and binary encodings and refuse reserved ones (191d51b)
- Weather satellites template: Meteor-M LRPT on 137.900 MHz, the NOAA APT satellites are off the air (e7b6ced)
- Wire verdicts refuse a graph larger than a workspace may hold (191d51b)
- YSF voice FR mode decodes to speech instead of noise (191d51b)
Container image: docker pull ghcr.io/newspicel/sdrmm:2.4.0
Full Changelog: v2.3.0...v2.4.0