| Crates.io | cpal |
| lib.rs | cpal |
| version | 0.17.1 |
| created_at | 2014-12-17 05:59:37.82103+00 |
| updated_at | 2026-01-04 14:50:21.671944+00 |
| description | Low-level cross-platform audio I/O library in pure Rust. |
| homepage | |
| repository | https://github.com/RustAudio/cpal |
| max_upload_size | |
| id | 579 |
| size | 713,830 |
Low-level library for audio input and output in pure Rust.
The minimum Rust version required depends on which audio backend and features you're using, as each platform has different dependencies:
ndk crate requirements)alsa-sys crate requirements)coreaudio-rs crate requirements)jack crate requirements)windows crate requirements)wasm32-unknown): Rust 1.82 (due to gloo crate requirements)wasm32-wasip1): Rust 1.78 (target stabilized in 1.78)audioworklet): Rust nightly (requires -Zbuild-std for atomics support)This library currently supports the following:
Currently, supported hosts include:
Note that on Linux, the ALSA development files are required for building (even when using JACK). These are provided as part of the libasound2-dev package on Debian and Ubuntu distributions and alsa-lib-devel on Fedora.
If you are interested in using CPAL with WebAssembly, please see this guide in our Wiki which walks through setting up a new project from scratch. Some of the examples in this repository also provide working configurations that you can use as reference.
CPAL provides the following optional features:
asioPlatform: Windows
Enables the ASIO (Audio Stream Input/Output) backend. ASIO provides low-latency audio I/O by bypassing the Windows audio stack.
Requirements:
Setup: See the ASIO setup guide below for detailed installation instructions.
jackPlatform: Linux, DragonFly BSD, FreeBSD, NetBSD, macOS, Windows
Enables the JACK (JACK Audio Connection Kit) backend. JACK is an audio server providing low-latency connections between applications and audio hardware.
Requirements:
Usage: See the beep example for selecting the JACK host at runtime.
Note: JACK is available as an alternative backend on all supported platforms. It provides an option for pro-audio users who need JACK's routing and inter-application audio connectivity. The native backends (ALSA for Linux/BSD, WASAPI/ASIO for Windows, CoreAudio for macOS) remain the default and recommended choice for most applications.
wasm-bindgenPlatform: WebAssembly (wasm32-unknown-unknown)
Enables the Web Audio API backend for browser-based audio. This is the base feature required for any WebAssembly audio support.
Requirements:
wasm32-unknown-unknownUsage: See the wasm-beep example for basic WebAssembly audio setup.
audioworkletPlatform: WebAssembly (wasm32-unknown-unknown)
Enables the Audio Worklet backend for lower-latency web audio processing compared to the default Web Audio API backend.
Requirements:
wasm-bindgen feature (automatically enabled)RUSTFLAGS="-C target-feature=+atomics,+bulk-memory,+mutable-globals"Setup: See the audioworklet-beep example README for complete setup instructions.
Note: Audio Worklet provides better performance than the default Web Audio API by running audio processing on a separate thread.
customPlatform: All platforms
Enables support for user-defined custom host implementations, allowing integration with audio systems not natively supported by CPAL.
Usage: See examples/custom.rs for implementation details.
The location of ASIO SDK is exposed to CPAL by setting the CPAL_ASIO_DIR environment variable.
The build script will try to find the ASIO SDK by following these steps in order:
CPAL_ASIO_DIR is set and if so use the path to point to the SDK.CPAL_ASIO_DIR to the output of std::env::temp_dir().join("asio_sdk").CPAL_ASIO_DIR will be set to the output of std::env::temp_dir().join("asio_sdk").In an ideal situation you don't need to worry about this step.
Install LLVM/Clang: bindgen, the library used to generate bindings to the C++ SDK, requires clang. Download and install LLVM from http://releases.llvm.org/download.html under the "Pre-Built Binaries" section.
Set LIBCLANG_PATH: Add the LLVM bin directory to a LIBCLANG_PATH environment variable. If you installed LLVM to the default directory, this should work in the command prompt:
setx LIBCLANG_PATH "C:\Program Files\LLVM\bin"
Install ASIO Drivers (optional for testing): If you don't have any ASIO devices or drivers available, you can download and install ASIO4ALL from http://www.asio4all.org/. Be sure to enable the "offline" feature during installation.
Visual Studio: The build script assumes Microsoft Visual Studio is installed. It will try to find vcvarsall.bat and execute it with the right host and target architecture. If needed, you can manually execute it:
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
For more information see the vcvarsall.bat documentation.
Enable the feature in your Cargo.toml:
cpal = { version = "*", features = ["asio"] }
Select the ASIO host in your code:
let host = cpal::host_from_id(cpal::HostId::Asio)
.expect("failed to initialise ASIO host");
If you encounter compilation errors from asio-sys or bindgen:
CPAL_ASIO_DIR is set correctlycargo cleanLIBCLANG_PATH is setWhen Windows is the host and target OS, the build script supports all cross-compilation targets supported by the MSVC compiler.
It is also possible to compile Windows applications with ASIO support on Linux and macOS using the MinGW-w64 toolchain.
Requirements:
CPLUS_INCLUDE_PATH environment variableCPLUS_INCLUDE_PATH environment variableExample for macOS (targeting x86_64-pc-windows-gnu with mingw-w64 installed via brew):
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/opt/homebrew/Cellar/mingw-w64/11.0.1/toolchain-x86_64/x86_64-w64-mingw32/include"
If you receive errors about no default input or output device:
audio group and that ALSA is properly configuredpulseaudio --checkIf you experience audio glitches or dropouts:
BufferSize::Default first before requesting specific sizesBufferSize::Fixed, query SupportedBufferSize to find valid rangesLIBCLANG_PATH is set and LLVM is installedlibasound2-dev (Debian/Ubuntu) or alsa-lib-devel (Fedora)jack featureCPAL comes with several examples demonstrating various features:
beep - Generate a simple sine wave toneenumerate - List all available audio devices and their capabilitiesfeedback - Pass input audio directly to output (microphone loopback)record_wav - Record audio from the default input device to a WAV filesynth_tones - Generate multiple tones simultaneouslyRun an example with:
cargo run --example beep
For platform-specific features, enable the relevant features:
cargo run --example beep --features asio # Windows ASIO
cargo run --example beep --features jack # JACK backend
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Licensed under the Apache License, Version 2.0. See LICENSE for details.