#asio #input-output #audio-devices #sound #output-stream #steinberg

sys asio-sys

steinberg ASIO SDK的低级接口和绑定生成

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音频

Download history 92/week @ 2024-04-21 142/week @ 2024-04-28 120/week @ 2024-05-05 298/week @ 2024-05-12 223/week @ 2024-05-19 297/week @ 2024-05-26 229/week @ 2024-06-02 164/week @ 2024-06-09 266/week @ 2024-06-16 214/week @ 2024-06-23 252/week @ 2024-06-30 150/week @ 2024-07-07 143/week @ 2024-07-14 188/week @ 2024-07-21 286/week @ 2024-07-28 304/week @ 2024-08-04

932 每月下载量
5 个crate中使用(通过 cpal

Apache-2.0

68KB
1K SLoC

CPAL - 跨平台音频库

Actions Status Crates.io docs.rs

纯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

  1. 检查是否设置了 CPAL_ASIO_DIR,如果设置了,则使用该路径指向 SDK。
  2. 检查 ASIO SDK 是否已安装在临时目录中,如果是,则使用它,并将 CPAL_ASIO_DIR 的路径设置为 std::env::temp_dir().join("asio_sdk") 的输出。
  3. 如果 ASIO SDK 未预先安装,请从 https://www.steinberg.net/asiosdk 下载并安装在临时目录中。将 CPAL_ASIO_DIR 的路径设置为 std::env::temp_dir().join("asio_sdk") 的输出。

在理想情况下,您不需要担心这一步。

准备构建环境

  1. bindgen 是一个用于生成 C++ SDK 绑定的库,它需要 clang。请从 此处 的 "预构建二进制文件" 部分下载和安装 LLVM。截至撰写本文时,版本为 17.0.1。

  2. 将 LLVM 的 bin 目录添加到环境变量 LIBCLANG_PATH 中。如果您将 LLVM 安装在默认目录,则应在命令提示符下正常工作。

    setx LIBCLANG_PATH "C:\Program Files\LLVM\bin"
    
  3. 如果您没有任何可用的 ASIO 设备或驱动程序,您可以 下载并安装 ASIO4ALL。请确保在安装过程中启用“离线”功能,尽管安装程序表示它没有用。

  4. 我们的构建脚本假定如果编译的主机操作系统是 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`` 的文档。

  5. 使用以下代码在程序开始时选择 ASIO 主机

    let host;
    #[cfg(target_os = "windows")]
    {
       host = cpal::host_from_id(cpal::HostId::Asio).expect("failed to initialise ASIO host");
    }
    

    如果您遇到由 asio-sysbindgen 生成的编译错误,请确保 CPAL_ASIO_DIR 设置正确,并尝试 cargo clean

  6. 在构建CPAL时,请确保启用asio功能。

    cargo build --features "asio"
    

    或者如果您将CPAL作为下游项目的依赖项使用,可以这样启用该功能

    cpal = { version = "*", features = ["asio"] }
    

截至ASIO版本2.3.3更新。

交叉编译

当Windows是宿主和目标操作系统时,asio-sys的构建脚本支持MSVC编译器支持的所有交叉编译目标。可以在此处找到详尽的组合列表,包括非官方的arm64arm64_x86arm64_amd64arm64_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