Skip to content

Releases: sbetko/catap

catap 0.5.0

Choose a tag to compare

@sbetko sbetko released this 05 May 19:48
  • BREAKING: Replaced streaming callbacks from on_data(data, num_frames) with
    on_buffer(buffer: AudioBuffer).

  • Added callback metadata types: AudioBuffer and AudioStreamFormat.

  • Added stream_format accessors on AudioRecorder and RecordingSession;
    use fields such as stream_format.sample_rate instead 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

Choose a tag to compare

@sbetko sbetko released this 28 Apr 04:42

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

Choose a tag to compare

@sbetko sbetko released this 27 Apr 00:58
  • 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

Choose a tag to compare

@sbetko sbetko released this 26 Apr 03:09
  • Added Python 3.11 support by replacing 3.12-only type-alias syntax and broadening package metadata.

v0.4.0

Choose a tag to compare

@sbetko sbetko released this 24 Apr 21:05
  • Added strict tap stream format validation before capture starts. Unsupported
    Core Audio layouts now raise UnsupportedTapFormatError instead 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-buffer AudioBufferList layouts, 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_buffers values such as True, 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

Choose a tag to compare

@sbetko sbetko released this 24 Apr 01:03
  • 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

Choose a tag to compare

@sbetko sbetko released this 21 Apr 23:32
  • 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/.