cpal 0.18.0

Low-level cross-platform audio I/O library.
name: Code Quality

on:
  push:
    branches: [master]
    paths-ignore:
      - "**.md"
      - "docs/**"
      - "LICENSE*"
      - ".gitignore"
  pull_request:
    branches: [master]
    paths-ignore:
      - "**.md"
      - "docs/**"
      - "LICENSE*"
      - ".gitignore"

jobs:
  formatting:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

      - name: Check formatting
        run: cargo fmt --all -- --check

  lints-stable:
    strategy:
      fail-fast: false
      matrix:
        include:
          # Linux - ALSA/JACK backend
          - target: x86_64-unknown-linux-gnu
            name: Linux
            features: --all-features
            os: ubuntu-latest

          # Windows - WASAPI backend
          - target: x86_64-pc-windows-msvc
            name: Windows
            features: --all-features
            os: windows-latest

          # macOS - CoreAudio backend
          - target: aarch64-apple-darwin
            name: macOS
            features: --all-features
            os: ubuntu-latest

          # Android - Oboe backend
          - target: armv7-linux-androideabi
            name: Android
            features: ""
            os: ubuntu-latest

          # iOS - CoreAudio (iOS) backend
          - target: aarch64-apple-ios
            name: iOS
            features: ""
            os: ubuntu-latest

          # WASM - wasm-bindgen feature
          - target: wasm32-unknown-unknown
            name: WASM-bindgen
            features: --features wasm-bindgen
            os: ubuntu-latest

          # WASM - WASI
          - target: wasm32-wasip1
            name: WASI
            features: ""
            os: ubuntu-latest

    name: clippy-${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v5

      - name: Cache Linux audio packages
        if: runner.os == 'Linux'
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libasound2-dev libjack-jackd2-dev libjack-jackd2-0 libdbus-1-dev libpipewire-0.3-dev

      - name: Setup ASIO SDK
        if: runner.os == 'Windows'
        run: |
          curl -L -o asio.zip https://www.steinberg.net/asiosdk
          7z x -oasio asio.zip
          move asio\*\* asio\
          choco install asio4all
          choco install llvm

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
          targets: ${{ matrix.target }}

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: clippy-${{ matrix.target }}-${{ matrix.name }}

      - name: Run clippy
        env:
          CPAL_ASIO_DIR: ${{ runner.os == 'Windows' && format('{0}/asio', github.workspace) || '' }}
        run: cargo clippy --all --target ${{ matrix.target }} ${{ matrix.features }} -- -D warnings

  docs:
    strategy:
      matrix:
        include:
          - name: Linux
    name: docs-${{ matrix.name }}
    runs-on: ubuntu-latest
    env:
      DOCS_RS: "1"
      RUSTDOCFLAGS: "--cfg docsrs -D warnings"
    steps:
      - uses: actions/checkout@v5

      - name: Cache Linux audio packages
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libasound2-dev libjack-jackd2-dev libjack-jackd2-0 libdbus-1-dev libpipewire-0.3-dev

      - uses: dtolnay/rust-toolchain@nightly

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: docs

      - run: cargo doc --all-features --no-deps

  lints-nightly:
    strategy:
      fail-fast: false
      matrix:
        include:
          # WASM - AudioWorklet (requires atomics + build-std)
          - target: wasm32-unknown-unknown
            name: WASM-worklet
            features: --features audioworklet
            os: ubuntu-latest
            build_std: std,panic_abort
            rustflags: -C target-feature=+atomics,+bulk-memory,+mutable-globals

          # tvOS - CoreAudio (Tier 3 target)
          - target: aarch64-apple-tvos
            name: tvOS
            features: ""
            os: macOS-latest
            build_std: std
            rustflags: ""

    name: clippy-${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v5

      - name: Cache Linux audio packages
        if: runner.os == 'Linux'
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libasound2-dev libjack-jackd2-dev libjack-jackd2-0 libdbus-1-dev libpipewire-0.3-dev

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@nightly
        with:
          components: clippy, rust-src
          targets: ${{ matrix.target }}

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: clippy-${{ matrix.target }}-${{ matrix.name }}

      - name: Run clippy
        env:
          RUSTFLAGS: ${{ matrix.rustflags }}
        run: cargo +nightly clippy --all --target ${{ matrix.target }} ${{ matrix.features }} -Z build-std=${{ matrix.build_std }} -- -D warnings