Releases: selkies-project/pcmflux
Release list
8e04d04
docs: Put the README's badges on one line
e5d6f17
fix(ogg): Say another account owns a sink path instead of logging its uid
CodeQL's rust/cleartext-logging flags the owner's uid written to the log
when a sink path belongs to another account. The line still names the
path, which is what an operator inspects, so the uid adds nothing the
path does not lead to.
Reproduced with CodeQL 2.27.1 and the rust-code-scanning suite, extracted
without a build as the CodeQL workflow does: one result at
ogg_sink.rs:130 on main, none after. cargo test --lib passes (29, one
ignored); a bind on a root-owned path returns None, leaves the file as it
was, and logs "ogg sink not bound on : another account owns it".
1e4d265
ci: Pin the Rust toolchain action by commit
ea1c3e0
docs: Note the interpreter range through 3.15 in the agent instructions
77985c9
docs: Open the README with how to install, from a release wheel or from source
2.1.0
pcmflux 2.1.0
A feature release adding an observable lifecycle to capture and playback, up-front settings validation, bytes-like input for the playback path, and a license inventory of the crate graph.
New Features
- Observable lifecycle :
state("idle"/"starting"/"running"/"failed") andlast_erroron bothAudioCaptureandAudioPlayback. A run that fails afterstart_capture()/start()returns — PulseAudio taking longer than the start handshake, or dropping out mid-run and failing to reconnect — is now visible to the caller:statemoves to"running"or to"failed"with the reason inlast_error, so a caller can poll and restart.is_capturing/is_runningare true only in the"running"phase - Up-front settings validation : invalid settings raise
ValueErrorbefore any thread is spawned, rather than failing later on the worker. Adevice_namecontaining an interior NUL is rejected (it becomes a C string), andAudioPlaybackSettings.latency_ms/max_buffer_bytesmust be positive - Bytes-like playback input :
AudioPlayback.write()andwrite_red()accept any contiguous bytes-like object (bytes,memoryview,bytearray, or another buffer-protocol exporter), not justbytes, and raiseBufferErrorfor a non-contiguous buffer
Resilience & Fixes
- The lifecycle state machine (
IDLE → STARTING → RUNNING, thenFAILEDwith alast_erroror back toIDLEon a clean stop) is the single source of truth for a run's status, cleared when a new run is spawned so a stale error never leaks into the next start write()/write_red()remain gated on a live worker, so feeding a dead or failed playback stream raises instead of silently swallowing audio
Build & CI
- License inventory :
LICENSES.mddocuments the crates and the linked native libraries — libpulse (LGPL-2.1-or-later) and libopus (BSD-3-Clause).pcmflux/deny.tomlkeeps the crate graph permissive, run by the newLicensesworkflow; a crate that links native code must be listed before the check passes
61ed920
docs: Write every list of three or more with the serial comma
527b67a
ci(release): Refuse a tag whose commit is not on main
2055863
ci: Publish the release wheels to PyPI through a trusted publisher, by default for a release designated as the latest
a8673ac
ci: Confine deployments, releases, image pushes and tags to main and its tags, and build every other ref self-contained