github Sendspin/sendspin-cpp-cli v0.3.0
sendspin-cli 0.3.0

4 hours ago

Breaking changes

  • macOS plays through a native CoreAudio backend, not PortAudio. The macOS binary is now
    built without PortAudio and reports null, stdout, coreaudio, so a device named as
    -o portaudio:<device> on a Mac is -o coreaudio:<device> instead; run -l for 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

  • -s dials a typed-in address again, alongside mdns: 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. -s once more
    takes a bare host (server default port 8927), host:port, a full ws:///wss:// URL, or a
    bracketed IPv6 literal, typed or as server = in a config file, and a bad address fails at
    parse time rather than after the daemon starts. -s mdns:[<name>] still discovers, unchanged,
    and mdns: is reserved only before the first colon — so hifi:8927 is a host and a bare
    -s mdns is a host named mdns. Any -s still 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 shared SinkRecovery, 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
wikiInstallation,
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

Don't miss a new sendspin-cpp-cli release

NewReleases is sending notifications on new releases.