Skip to content

Commit bc0551c

Browse files
authored
Merge pull request #69 from Sendspin/fix/release-0-3-0
Release 0 3 0
2 parents c4c5f82 + e5f580f commit bc0551c

3 files changed

Lines changed: 55 additions & 5 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.16)
22

33
project(sendspin-cpp-cli
4-
VERSION 0.2.0
4+
VERSION 0.3.0
55
DESCRIPTION "Headless CLI/daemon Sendspin audio player"
66
HOMEPAGE_URL "https://github.com/Sendspin/sendspin-cpp"
77
LANGUAGES CXX

docs/ROADMAP.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,7 +2639,7 @@ The harness it was run with is not in the tree: it lives with the pass's own not
26392639
sink suite that exercises `AudioSink` implementations themselves is item 12's job, not a
26402640
throwaway driver's.
26412641

2642-
### 28. A second device outage in one stream never recovers — *shipped (hardware pass still owed)*
2642+
### 28. A second device outage in one stream never recovers — *shipped (ALSA hardware pass still owed)*
26432643

26442644
Found by item 27's CoreAudio hardware pass — two unplugs in one run, the first back in 190 ms,
26452645
the second never — but it belongs to item 14 and sits in the shared `SinkRecovery`, so every
@@ -2677,7 +2677,13 @@ recoveries per stream would turn a flaky cable back into the silence this item r
26772677

26782678
The regression tests (`ASecondOutageInTheSameStreamRecovers`,
26792679
`EveryOutageAfterARecoveryStillGivesUp`, `TheDiscardedGapSurvivesTheRefillIntoTheNextOutage`)
2680-
fail against the old helper and pass against the new one. **Still owed:** two unplug/replug
2681-
cycles in one stream on real hardware — ALSA first, since it has the most users, then CoreAudio
2682-
with item 27's harness.
2680+
fail against the old helper and pass against the new one.
2681+
2682+
**CoreAudio is validated on hardware.** Two unplug/replug cycles in one stream on a USB DAC,
2683+
through item 27's harness: the sink reopened 260 ms after the first replug and 180 ms after the
2684+
second — the second being the one that recovered never before this fix, and faster than the
2685+
first because the refill hands it an unspent in-place reopen. Both outage gaps were reported
2686+
rather than swallowed (drift −5554 ms mid-outage, −96 ms five seconds after the replug), and the
2687+
run settled on the same fixed ~90 ms end-of-stream tail a clean run shows. **Still owed:** the
2688+
same two cycles on ALSA, which has the most users.
26832689

docs/release-notes/0.3.0.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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

Comments
 (0)