Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.16)

project(sendspin-cpp-cli
VERSION 0.1.6
VERSION 0.2.0
DESCRIPTION "Headless CLI/daemon Sendspin audio player"
HOMEPAGE_URL "https://github.com/Sendspin/sendspin-cpp"
LANGUAGES CXX
Expand Down
6 changes: 3 additions & 3 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ daemonization.
- Boots a `SendspinClient` with the `player`, `metadata` and `controller` roles, starts its
WebSocket server, pumps `client.loop()`, and shuts down cleanly on `SIGINT`/`SIGTERM`.
- Speaks both of the protocol's connection modes, and keeps them exclusive as the spec
requires: it advertises `_sendspin._tcp` over mDNS by default, and any `-s` instead
makes it dial out — to an address, or to a server discovered on
`_sendspin-server._tcp` — retrying with a backoff until it answers (item 5).
requires: it advertises `_sendspin._tcp` over mDNS by default, and `-s mdns:` instead
discovers a server on `_sendspin-server._tcp` and dials it — retrying with a backoff
until it answers (item 5). A typed-in address is no longer accepted (item 26).
- Defines the `AudioSink` seam (`src/audio_sink.h`) and plays real audio through it:
auto-detected ALSA (item 2), PortAudio (item 3), PulseAudio (item 18) and PipeWire
(item 19) backends, with the device-less null/stdout sink as the fallback, so the
Expand Down
41 changes: 41 additions & 0 deletions docs/release-notes/0.2.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
### Breaking changes

- **`-s` no longer dials a typed-in address.** A host, `host:port`, or `ws://` URL passed
to `-s` — or set as `server =` in a config file — is now a parse error rather than a dial
target. The spec has exactly two ways to connect: the server discovers this client through
its `_sendspin._tcp` advertisement, or this client discovers a server on
`_sendspin-server._tcp` and connects to the address it advertised. Dialling a hand-entered
endpoint is neither, so it is gone. `-s mdns:[<name>]` — discovery — is the only form left,
and it works exactly as before. An install still pointed at an address fails loudly at
startup instead of quietly changing how it connects; point the server at this player, or
switch to `-s mdns:`. (#56)

### New features

- **`--audio-format` takes an ordered list of preferred formats.** Pass a comma-separated
list, e.g. `--audio-format flac:48000:24:2,pcm:48000:24:2`, and those formats are offered
first in that order with the rest of the device-derived list still behind them — a
preference a server falls back from, not a restriction. The player refuses to start if the
advertised list cannot carry every entry, and an `opus` entry at anything but 48000/16 and
at most two channels is refused outright. (#57)

### Fixed issues

- **A recovered audio device no longer jumps the playback clock.** While a sink had no live
stream, `write()` still reported the audio as consumed but nothing ever reported it as
played, so after recovery the playhead jumped ahead by the whole outage and sync cycled
between Lost and Regained. Fixed for the ALSA sink (#54, #55), then extended to the Pulse,
PortAudio and PipeWire sinks (#58, #59).
- **The systemd unit now allows `AF_NETLINK`,** so the MAC-derived client id is detected
under the shipped hardening. Without it `getifaddrs()` fails and the player greets with an
empty `client_id`, which a server such as Music Assistant refuses. (#53)

### Under the hood

- **Re-pinned `sendspin-cpp` to v0.8.0** and adopted its `start()`/`stop()` lifecycle. (#62)
- **A `clang-format` CI gate and `scripts/format.sh`,** with comment guidelines in
`AGENTS.md`. (#61, #60)
- **The README is restructured** around what it is, how to run it, and how to contribute, and
the ARMv6 build leg moved into its own workflow. (#52, #51)

**Full changelog:** https://github.com/@REPO@/compare/v0.1.6...@TAG@