Releases: sbetko/catap
Releases · sbetko/catap
Release list
catap 0.5.0
-
BREAKING: Replaced streaming callbacks from
on_data(data, num_frames)with
on_buffer(buffer: AudioBuffer). -
Added callback metadata types:
AudioBufferandAudioStreamFormat. -
Added
stream_formataccessors onAudioRecorderandRecordingSession;
use fields such asstream_format.sample_rateinstead of scalar format
convenience properties. -
Added a native macOS Core Audio dylib for the recorder IOProc and made it
required for recording. The old pure-Python IOProc fallback has been removed.# Before def on_data(data: bytes, num_frames: int) -> None: ... # After def on_buffer(buffer: AudioBuffer) -> None: data = buffer.data num_frames = buffer.frame_count
v0.4.3
Changes
- Tightened README, CLI help, and package metadata around the process-tap support boundary and unsupported capture scenarios.
Validation
- uv run --group dev ruff check .
- uv run --group dev ty check --error-on-warning src tests
- uv run --group dev pytest
- uv run --group dev python -m build
- uv run --group dev twine check dist/*
v0.4.2
- Added CI coverage for free-threaded CPython 3.13t and 3.14t on macOS.
- Replaced the recorder buffer-pool deque with queue.SimpleQueue to avoid relying on CPython deque atomicity in free-threaded builds.
- Documented local free-threaded test commands and the opt-in real-recording smoke check.
v0.4.1
v0.4.0
- Added strict tap stream format validation before capture starts. Unsupported
Core Audio layouts now raiseUnsupportedTapFormatErrorinstead of risking
plausible but corrupt WAV output. - Reject non-linear PCM, big-endian PCM, non-packed PCM, non-interleaved audio,
unsigned integer PCM, padded frames, invalid rates/channels/bit depths, and
floating-point formats other than packed float32. - Treat malformed callback buffers as capture failures instead of guessing:
multi-bufferAudioBufferListlayouts, missing data pointers, mismatched or
missing channel counts, and partial-frame byte counts are surfaced on stop. - Make WAV output transactional. Recorders now write to a sibling temporary file
and publish it only after clean shutdown, preserving existing output files on
failed startup or failed writes. - Stop active capture sessions before destroying Core Audio resources and clear
started state after stop attempts so cleanup paths are more deterministic. - Reject non-integer
max_pending_buffersvalues such asTrue, floats, and
strings. - Expanded pytest coverage around Core Audio lifecycle cleanup, recorder format
handling, malformed callback buffers, output-file safety, public exports, and
session queue-bound validation.
v0.3.0
- Refactored the recorder into focused internal capture-engine, worker, support,
and session-backend modules. - Preserved recorder cleanup failures across stop and close paths so secondary
teardown errors are not lost. - Surfaced Core Audio callback failures on recorder stop instead of silently
swallowing them. - Added synthetic and live profiling probes for worker throughput, conversion
cost, callback timing, queue depth, and dropped-buffer behavior. - Replaced the old private-internals profiling scripts with the new profiling
harnesses. - Added performance and real-time notes for the recorder callback, queueing
model, CPython deque assumptions, and known tradeoffs. - Tightened README wording and added the current tested macOS hardware/version.
- Consolidated Core Audio binding discovery helpers and expanded related tests.
- Updated locked development dependencies.
Full Changelog: v0.2.0...v0.3.0
v0.2.0
- Initial public release of
catap. - Added device stream discovery so taps can target a specific input/output stream.
- Added discovery of existing process taps and the ability to record from them.
- Added shared-tap support: create, extend, and delete shared taps from the core lab demo.
- Raised clearer errors for stale shared taps and preserved zero-tap device stream metadata.
- Hardened audio recorder concurrency and cleanup lifecycle for free-threaded Python builds.
- Consolidated recorder structs and unified the cleanup cascade.
- Moved helper tone tooling into an internal devtools package and added regression coverage.
- Added worker queue latency profiling and restored synthetic profiler compatibility.
- Expanded the core lab demo with recording playback controls, helper tone device selection, shared-tap workflows, and bench-style chrome.
- Bumped supported Python floor metadata to include 3.14.
- Slimmed the README and split implementation notes into
docs/.