Crates.io | cpal |
lib.rs | cpal |
version | 0.15.3 |
source | src |
created_at | 2014-12-17 05:59:37.82103 |
updated_at | 2024-03-05 00:41:40.447002 |
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 | 492,750 |
Low-level library for audio input and output in pure Rust.
This library currently supports the following:
Currently, supported hosts include:
Note that on Linux, the ALSA development files are required. 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 WASM, please see this guide in our Wiki which walks through setting up a new project from scratch.
Some audio backends are optional and will only be compiled with a feature flag.
jack
asio
Oboe can either use a shared or static runtime. The static runtime is used by default, but activating the
oboe-shared-stdcxx
feature makes it use the shared runtime, which requires libc++_shared.so
from the Android NDK to
be present during execution.
ASIO is an audio driver protocol by Steinberg. While it is available on multiple operating systems, it is most commonly used on Windows to work around limitations of WASAPI including access to large numbers of channels and lower-latency audio processing.
CPAL allows for using the ASIO SDK as the audio host on Windows instead of WASAPI.
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.
bindgen
, the library used to generate bindings to the C++ SDK, requires
clang. Download and install LLVM from
here under the "Pre-Built Binaries"
section. The version as of writing this is 17.0.1.
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"
If you don't have any ASIO devices or drivers available, you can download and install ASIO4ALL. Be sure to enable the "offline" feature during installation despite what the installer says about it being useless.
Our build script assumes that Microsoft Visual Studio is installed if the host OS for compilation is Windows. The script will try to find vcvarsall.bat
and execute it with the right host and target machine architecture regardless of the Microsoft Visual Studio version.
If there are any errors encountered in this process which is unlikely,
you may find the vcvarsall.bat
manually and execute it with your machine architecture as an argument.
The script will detect this and skip the step.
A manually executed command example for 64 bit machines:
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
For more information please refer to the documentation of `vcvarsall.bat``.
Select the ASIO host at the start of our program with the following code:
let host;
#[cfg(target_os = "windows")]
{
host = cpal::host_from_id(cpal::HostId::Asio).expect("failed to initialise ASIO host");
}
If you run into compilations errors produced by asio-sys
or bindgen
, make
sure that CPAL_ASIO_DIR
is set correctly and try cargo clean
.
Make sure to enable the asio
feature when building CPAL:
cargo build --features "asio"
or if you are using CPAL as a dependency in a downstream project, enable the feature like this:
cpal = { version = "*", features = ["asio"] }
Updated as of ASIO version 2.3.3.
When Windows is the host and the target OS, the build script of asio-sys
supports all cross compilation targets
which are supported by the MSVC compiler. An exhaustive list of combinations could be found here with the addition of undocumented arm64
, arm64_x86
, arm64_amd64
and arm64_arm
targets. (5.11.2023)
It is also possible to compile Windows applications with ASIO support on Linux and macOS.
For both platforms the common way to do this is to use the MinGW-w64 toolchain.
Make sure that you have included the MinGW-w64
include directory in your CPLUS_INCLUDE_PATH
environment variable.
Make sure that LLVM is installed and include directory is also included in your CPLUS_INCLUDE_PATH
environment variable.
Example for macOS for the target of x86_64-pc-windows-gnu
where mingw-w64
is 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"