Breaking changes
- macOS plays through a native CoreAudio backend, not PortAudio. The macOS binary is now
built without PortAudio and reportsnull, stdout, coreaudio, so a device named as
-o portaudio:<device>on a Mac is-o coreaudio:<device>instead; run-lfor the names
this host reports. The same change fixes a launch failure: the 0.2.0 macOS binary aborted at
startup on any Mac without Homebrew's PortAudio, and this one needs nothing installed —
CoreAudio, AudioToolbox and Bonjour are all part of macOS. PortAudio is untouched on Linux,
and a macOS build can still ask for it with-DSENDSPIN_CLI_WITH_PORTAUDIO=ON. (#66)
New features
-sdials a typed-in address again, alongsidemdns:discovery. 0.2.0 removed the
address form; that removal is reversed by choice, because pointing a player straight at a
known server is worth more than matching the spec's connection model exactly.-sonce more
takes a bare host (server default port 8927),host:port, a fullws:///wss://URL, or a
bracketed IPv6 literal, typed or asserver =in a config file, and a bad address fails at
parse time rather than after the daemon starts.-s mdns:[<name>]still discovers, unchanged,
andmdns:is reserved only before the first colon — sohifi:8927is a host and a bare
-s mdnsis a host namedmdns. Any-sstill suppresses the mDNS advertisement, and a
parse error never quotes a credential the address carried. (#68)
Fixed issues
- A second device outage in one stream recovers. A rescan that succeeded retired the
recovery budget instead of restoring it, so after one unplug and replug the next outage got
no attempts at all: the sink discarded audio until the following track, with no log line to
say why. The budget is now per outage rather than per stream — a recovery refills the in-place
reopen and the whole rescan ladder — while a device that never comes back still gives up on
the same schedule as before. This sat in the sharedSinkRecovery, so ALSA, PulseAudio,
PipeWire and PortAudio all had it and all get the fix. (#67)
Under the hood
- The CoreAudio sink was validated against real hardware, not only against its tests: tone
accounting and DAC-offset checks at each supported format, a volume-ramp check, a
default-output move, and unplug/replug cycles on a USB DAC. Two findings came back onto the
branch before it merged — a doubled safety offset in the DAC timestamp, and a reopen that
waited out the backoff ladder instead of acting on the device-list change — and one, the
second-outage bug above, turned out to belong to every device-backed sink. (#66, #67) - The macOS release leg builds with no third-party runtime dependency at all, and CI asserts
the backend list it produces.
Full changelog: v0.2.0...v0.3.0
What this build is
sendspin-cli 0.3.0. The version of the sendspin-cpp library it is linked against
is pinned at build time and printed on the second line of sendspin-cli --version,
alongside this one on the first.
Installing, verifying SHA256SUMS and the macOS Gatekeeper situation are in the
wiki — Installation,
or Getting Started on a Raspberry Pi
for the two 32-bit ARM archives. Each archive also carries its own BUILD-INFO.txt,
with the install command already filled in for its platform.
The macOS binary and the .pkg around it are unsigned — ad-hoc signed, which is
the minimum an arm64 Mach-O needs to execute at all, and carries no developer identity
— so Gatekeeper refuses them until you say otherwise. Said here rather than only behind
a link because it is worth knowing before you download; what to do about it is under
the macOS installation guide.
- README — what it is, how to run
it, and how to contribute - Contributors — development,
testing, CI, and release guidance - Roadmap — what shipped and
what is owed, item by item