4个版本
使用旧Rust 2015
0.2.2 | 2024年3月5日 |
---|---|
0.2.1 | 2022年11月13日 |
0.2.0 | 2020年7月22日 |
0.1.0 | 2019年7月5日 |
#263 在 音频
932 每月下载量
在 5 个crate中使用(通过 cpal)
68KB
1K SLoC
CPAL - 跨平台音频库
纯Rust的音频输入和输出低级库。
该库目前支持以下功能
- 列出支持的音频主机。
- 列出所有可用的音频设备。
- 获取当前默认的输入和输出设备。
- 列出设备已知支持的输入和输出流格式。
- 获取设备当前默认的输入和输出流格式。
- 在选择的设备上以给定的流格式构建和运行输入和输出PCM流。
目前支持的宿主包括
- Linux(通过ALSA或JACK)
- Windows(默认通过WASAPI,请参阅以下ASIO说明)
- macOS(通过CoreAudio)
- iOS(通过CoreAudio)
- Android(通过Oboe)
- Emscripten
注意,在Linux上,需要ALSA开发文件。这些文件在Debian和Ubuntu发行版中作为libasound2-dev
包的一部分提供,在Fedora中作为alsa-lib-devel
提供。
为Web Assembly编译
如果您对使用CPAL与WASM感兴趣,请参阅我们Wiki中的此指南 this guide,它将引导您从头开始设置新项目。
音频后端的功能标志
一些音频后端是可选的,并且只有通过 功能标志 才会编译。
- JACK(在Linux上):
jack
- ASIO(在Windows上):
asio
Oboe可以使用共享或静态运行时。默认情况下使用静态运行时,但激活oboe-shared-stdcxx
功能使其使用共享运行时,这需要Android NDK中的libc + + + _shared.so在执行期间存在。
Windows上的ASIO
ASIO 是 Steinberg 公司开发的一种音频驱动协议。虽然它可以在多个操作系统上使用,但最常用于 Windows,以克服 WASAPI 的限制,包括访问大量通道和低延迟音频处理。
CPAL 允许在 Windows 上使用 ASIO SDK 作为音频主机,而不是 WASAPI。
定位 ASIO SDK
通过设置环境变量 CPAL_ASIO_DIR
,ASIO SDK 的位置会被暴露给 CPAL。
构建脚本将按照以下步骤尝试找到 ASIO SDK
- 检查是否设置了
CPAL_ASIO_DIR
,如果设置了,则使用该路径指向 SDK。 - 检查 ASIO SDK 是否已安装在临时目录中,如果是,则使用它,并将
CPAL_ASIO_DIR
的路径设置为std::env::temp_dir().join("asio_sdk")
的输出。 - 如果 ASIO SDK 未预先安装,请从 https://www.steinberg.net/asiosdk 下载并安装在临时目录中。将
CPAL_ASIO_DIR
的路径设置为std::env::temp_dir().join("asio_sdk")
的输出。
在理想情况下,您不需要担心这一步。
准备构建环境
-
bindgen
是一个用于生成 C++ SDK 绑定的库,它需要 clang。请从 此处 的 "预构建二进制文件" 部分下载和安装 LLVM。截至撰写本文时,版本为 17.0.1。 -
将 LLVM 的
bin
目录添加到环境变量LIBCLANG_PATH
中。如果您将 LLVM 安装在默认目录,则应在命令提示符下正常工作。setx LIBCLANG_PATH "C:\Program Files\LLVM\bin"
-
如果您没有任何可用的 ASIO 设备或驱动程序,您可以 下载并安装 ASIO4ALL。请确保在安装过程中启用“离线”功能,尽管安装程序表示它没有用。
-
我们的构建脚本假定如果编译的主机操作系统是 Windows,则已安装 Microsoft Visual Studio。脚本将尝试找到
vcvarsall.bat
并使用正确的宿主机和目标机器架构执行它,而不考虑 Microsoft Visual Studio 的版本。如果在过程中遇到任何错误(这种情况很少见),您可以手动找到vcvarsall.bat
并使用您的机器架构作为参数执行它。脚本将检测到这一点并跳过此步骤。64 位机器上的手动执行命令示例
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
有关更多信息,请参阅 `vcvarsall.bat`` 的文档。
-
使用以下代码在程序开始时选择 ASIO 主机
let host; #[cfg(target_os = "windows")] { host = cpal::host_from_id(cpal::HostId::Asio).expect("failed to initialise ASIO host"); }
如果您遇到由
asio-sys
或bindgen
生成的编译错误,请确保CPAL_ASIO_DIR
设置正确,并尝试cargo clean
。 -
在构建CPAL时,请确保启用
asio
功能。cargo build --features "asio"
或者如果您将CPAL作为下游项目的依赖项使用,可以这样启用该功能
cpal = { version = "*", features = ["asio"] }
截至ASIO版本2.3.3更新。
交叉编译
当Windows是宿主和目标操作系统时,asio-sys
的构建脚本支持MSVC编译器支持的所有交叉编译目标。可以在此处找到详尽的组合列表,包括非官方的arm64
、arm64_x86
、arm64_amd64
和arm64_arm
目标。(2023年11月5日)
还可以在Linux和macOS上编译支持ASIO的Windows应用程序。
对于这两个平台,通常的做法是使用MinGW-w64工具链。
请确保您已经将MinGW-w64
的包含目录包含在您的CPLUS_INCLUDE_PATH
环境变量中。请确保已经安装了LLVM,并且包含目录也包含在您的CPLUS_INCLUDE_PATH
环境变量中。
以下是针对macOS和目标为x86_64-pc-windows-gnu
的示例,其中通过brew安装了mingw-w64
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/opt/homebrew/Cellar/mingw-w64/11.0.1/toolchain-x86_64/x86_64-w64-mingw32/include"
依赖项
~0.4–3.5MB
~63K SLoC