|
| 1 | +### Breaking changes |
| 2 | + |
| 3 | +- **macOS plays through a native CoreAudio backend, not PortAudio.** The macOS binary is now |
| 4 | + built without PortAudio and reports `null, stdout, coreaudio`, so a device named as |
| 5 | + `-o portaudio:<device>` on a Mac is `-o coreaudio:<device>` instead; run `-l` for the names |
| 6 | + this host reports. The same change fixes a launch failure: the 0.2.0 macOS binary aborted at |
| 7 | + startup on any Mac without Homebrew's PortAudio, and this one needs nothing installed — |
| 8 | + CoreAudio, AudioToolbox and Bonjour are all part of macOS. PortAudio is untouched on Linux, |
| 9 | + and a macOS build can still ask for it with `-DSENDSPIN_CLI_WITH_PORTAUDIO=ON`. (#66) |
| 10 | + |
| 11 | +### New features |
| 12 | + |
| 13 | +- **`-s` dials a typed-in address again, alongside `mdns:` discovery.** 0.2.0 removed the |
| 14 | + address form; that removal is reversed by choice, because pointing a player straight at a |
| 15 | + known server is worth more than matching the spec's connection model exactly. `-s` once more |
| 16 | + takes a bare host (server default port 8927), `host:port`, a full `ws://`/`wss://` URL, or a |
| 17 | + bracketed IPv6 literal, typed or as `server =` in a config file, and a bad address fails at |
| 18 | + parse time rather than after the daemon starts. `-s mdns:[<name>]` still discovers, unchanged, |
| 19 | + and `mdns:` is reserved only before the first colon — so `hifi:8927` is a host and a bare |
| 20 | + `-s mdns` is a host named `mdns`. Any `-s` still suppresses the mDNS advertisement, and a |
| 21 | + parse error never quotes a credential the address carried. (#68) |
| 22 | + |
| 23 | +### Fixed issues |
| 24 | + |
| 25 | +- **A second device outage in one stream recovers.** A rescan that succeeded retired the |
| 26 | + recovery budget instead of restoring it, so after one unplug and replug the next outage got |
| 27 | + no attempts at all: the sink discarded audio until the following track, with no log line to |
| 28 | + say why. The budget is now per outage rather than per stream — a recovery refills the in-place |
| 29 | + reopen and the whole rescan ladder — while a device that never comes back still gives up on |
| 30 | + the same schedule as before. This sat in the shared `SinkRecovery`, so ALSA, PulseAudio, |
| 31 | + PipeWire and PortAudio all had it and all get the fix. (#67) |
| 32 | + |
| 33 | +### Under the hood |
| 34 | + |
| 35 | +- **The CoreAudio sink was validated against real hardware**, not only against its tests: tone |
| 36 | + accounting and DAC-offset checks at each supported format, a volume-ramp check, a |
| 37 | + default-output move, and unplug/replug cycles on a USB DAC. Two findings came back onto the |
| 38 | + branch before it merged — a doubled safety offset in the DAC timestamp, and a reopen that |
| 39 | + waited out the backoff ladder instead of acting on the device-list change — and one, the |
| 40 | + second-outage bug above, turned out to belong to every device-backed sink. (#66, #67) |
| 41 | +- **The macOS release leg builds with no third-party runtime dependency at all,** and CI asserts |
| 42 | + the backend list it produces. |
| 43 | + |
| 44 | +**Full changelog:** https://github.com/@REPO@/compare/v0.2.0...@TAG@ |
0 commit comments