timestretch 0.16.0

timestretch audio time and pitch processing with host-driven streaming
Documentation
name: CI
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
env:
  CARGO_TERM_COLOR: always
jobs:
  library:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        rust: [pinned]
        include:
          - os: ubuntu-latest
            rust: '1.85.0'
    steps:
      - uses: actions/checkout@v4
      - if: matrix.rust == 'pinned'
        run: rustup toolchain install
      - if: matrix.rust != 'pinned'
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
      - if: matrix.rust != 'pinned'
        shell: bash
        run: echo "RUSTUP_TOOLCHAIN=${{ matrix.rust }}" >> "$GITHUB_ENV"
      - uses: Swatinem/rust-cache@v2
      - run: cargo run --example generate_test_audio
      - run: cargo test --release -p timestretch --all-features --all-targets
      - run: cargo test --release -p timestretch-core --features qa,accelerate
      - run: cargo test --release -p timestretch-analysis
      - run: cargo test -p timestretch --no-default-features --lib --test session_contracts
      - run: cargo check -p timestretch --no-default-features --features io
      - run: cargo check -p timestretch --no-default-features --features analysis
      - run: cargo test -p timestretch --all-features --doc
  consumers:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4
      - run: rustup toolchain install
      - if: runner.os == 'Linux'
        run: sudo apt-get update && sudo apt-get install -y libasound2-dev libudev-dev libxkbcommon-dev libwayland-dev libx11-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev
      - uses: Swatinem/rust-cache@v2
      - run: cargo test --release -p timestretch-desktop -p ab-tui
      - run: cargo clippy --workspace --all-features --all-targets -- -D warnings
      - run: cargo run --release -p timestretch-qa -- quality --strict
      - run: cargo run --release -p timestretch-qa -- callback-audit
      - uses: actions/setup-python@v5
        with:
          python-version: '3.13'
      - run: python -B tools/qualify.py --quick --output target/contributor-smoke
      # Wall-clock/device headroom is qualified on declared hardware with
      # tools/qualify.py; noisy hosted CI cannot certify it.
  public-corpus:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: rustup toolchain install
      - uses: Swatinem/rust-cache@v2
      - uses: actions/cache@v4
        with:
          path: benchmarks/audio/public-corpus
          key: public-corpus-${{ hashFiles('scripts/fetch_public_corpus.sh') }}
          restore-keys: public-corpus-
      - run: bash scripts/fetch_public_corpus.sh
      - run: cargo test --features qa --release --test bpm_accuracy -- --nocapture
        env:
          TIMESTRETCH_BPM_MIN_ACC1: '90'
          TIMESTRETCH_BPM_MIN_ACC2: '90'
      - run: sudo apt-get update && sudo apt-get install -y rubberband-cli
      - run: cargo test --features qa --release --test rubberband_reference_gate -- --nocapture
        env:
          TIMESTRETCH_REQUIRE_RUBBERBAND: '1'
      - uses: actions/upload-artifact@v4
        with:
          name: bpm-accuracy-${{ github.run_id }}
          path: target/bpm_accuracy_report.json
          if-no-files-found: error
  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: rustup toolchain install
      - uses: Swatinem/rust-cache@v2
      - uses: actions/setup-python@v5
        with:
          python-version: '3.13'
      - run: python -B -m unittest discover -s tools -p test_benchmark_backends.py
      - run: cargo fmt --all --check
      - run: cargo doc -p timestretch -p timestretch-core -p timestretch-analysis --all-features --no-deps
        env:
          RUSTDOCFLAGS: -D warnings