8个版本 (5个重大更改)

0.6.0 2020年10月23日
0.5.1 2020年3月28日
0.4.1 2020年2月23日
0.3.0 2017年5月13日
0.1.0 2016年7月29日

#229 in 音频

Download history 16/week @ 2024-03-15 11/week @ 2024-03-22 35/week @ 2024-03-29 14/week @ 2024-04-05 24/week @ 2024-04-12 37/week @ 2024-04-19 55/week @ 2024-04-26 53/week @ 2024-05-03 14/week @ 2024-05-10 22/week @ 2024-05-17 11/week @ 2024-05-24 13/week @ 2024-05-31 25/week @ 2024-06-07 15/week @ 2024-06-14 13/week @ 2024-06-21 5/week @ 2024-06-28

每月62次下载
用于 bankstown-lv2

MIT/Apache

285KB
4.5K SLoC

Rust-LV2

Build Status Current Crates.io Version

一个安全、快速、易用的框架,用于创建LV2插件进行音频处理,用Rust编写。

此库仍在开发中。

它通过LV2核心规范提供以下功能

  • 轻量级、实时非阻塞和分配免费音频处理。
  • 生成所有模板代码以创建LV2插件二进制文件,适用于任何LV2主机。
  • 任意数量的端口/任意通道映射,输入和输出可以不同。
    这显然包括单声道、立体声、环绕声等,任何CPU能够处理的配置。
  • 可以扩展以支持任何其他功能、扩展和端口类型。
    它们可以是官方的、非官方的或完全定制的。

通过LV2官方附加规范,此库还提供了许多附加功能,包括

  • MIDI处理
  • 自定义数据结构的序列化,以及插件间或插件-GUI通信和属性操作
  • 状态管理
  • 异步工作处理
  • 自定义图形用户界面,无论是在工具无关还是在平台无关的方式下 (尚未实现)
  • 预设处理 (尚未实现)
  • ... 更多! (尚未实现)

请注意,此库仅提供官方LV2规范的Rust绑定,但它与任何其他任意或自定义规范兼容,其他外部包能够并且欢迎为任何其他规范提供与该库集成的Rust绑定。

示例

此示例包含一个简单放大插件代码。请注意,这并不是创建插件所需的所有内容,更多详情请参阅下面的文档。

// Import everything we need.
use lv2::prelude::*;

// The input and output ports are defined by a struct which implements the `PortCollection` trait.
// In this case, there is an input control port for the gain of the amplification, an input audio
// port and an output audio port.
#[derive(PortCollection)]
struct Ports {
    gain: InputPort<Control>,
    input: InputPort<Audio>,
    output: OutputPort<Audio>,
}

// The plugin struct. In this case, we don't need any data and therefore, this struct is empty.
//
// LV2 uses URIs to identify types. This association is expressed via the `UriBound` trait,
// which tells the framework that the type `Amp` is identified by the given URI. The usual
// way to implement this trait is to use the `uri` attribute.
#[uri("urn:rust-lv2-book:eg-amp-rs")]
struct Amp;

// The implementation of the `Plugin` trait, which turns `Amp` into a plugin.
impl Plugin for Amp {
    // Tell the framework which ports this plugin has.
    type Ports = Ports;

    // We don't need any special host features; We can leave them out.
    type InitFeatures = ();
    type AudioFeatures = ();

    // Create a new instance of the plugin; Trivial in this case.
    fn new(_plugin_info: &PluginInfo, _features: &mut ()) -> Option<Self> {
        Some(Self)
    }

    // Process a chunk of audio. The audio ports are dereferenced to slices, which the plugin
    // iterates over.
    fn run(&mut self, ports: &mut Ports, _features: &mut ()) {
        let coef = if *(ports.gain) > -90.0 {
            10.0_f32.powf(*(ports.gain) * 0.05)
        } else {
            0.0
        };

        for (in_frame, out_frame) in Iterator::zip(ports.input.iter(), ports.output.iter_mut()) {
            *out_frame = in_frame * coef;
        }
    }
}

// Generate the plugin descriptor function which exports the plugin to the outside world.
lv2_descriptors!(Amp);

关于此框架

常见问题解答

我的宿主程序支持它吗?

使用 rust-lv2 创建的插件与符合规范的 LV2 宿主程序兼容。如果你的应用程序使用 lilv,那么它很可能支持你的插件。一些示例包括 CarlaArdour

我可以用 rust-lv2 宿主插件吗?

目前,不支持插件宿主。该项目最初是为了创建使用安全的 Rust 编写的插件而启动的,因此,它非常侧重于插件。有计划集成插件宿主或衍生项目,但这些不会在近期启动。

然而,有很多代码可以用于宿主框架。如果你想要创建这样的框架,你应该查看 lv2-sysuridlv2-atom

一个基本的宿主框架需要 RDF 三元组存储库来加载 Turtle 文件,插件接口及其扩展的内部存储库,一个集中式的 URID 映射存储库,以及一个基于图的工作调度系统来执行 run 函数。

文档

有多个有价值的文档来源

功能

内部,此框架由几个子仓组成,这些子仓由 lv2 仓重新导出。所有依赖项都是可选的,可以通过功能启用。这些包括

  • lv2-atom:通用数据 IO。
  • lv2-core:核心 LV2 规范的实现。
  • lv2-midi:对 lv2-midi 的 MIDI 消息扩展。可以使用 wmidi 功能启用对 wmidi 仓的支持。
  • lv2-state:LV2 插件的扩展,用于存储其状态。
  • lv2-time:用于描述时间和时间流逝的规范,无论是实际还是音乐意义上的。
  • lv2-units:度量单位定义。
  • lv2-urid:LV2 对 URID 概念的集成。
  • lv2-worker:工作调度库,允许实时 LV2 插件执行非实时操作。
  • urid:惯用的 URID 支持。

带有 lv2- 前缀的子仓实现特定的 LV2 规范,这些规范可以在 参考 中查找。启用仓仅添加新内容,不会删除或破坏其他内容。

还有针对常见场景的功能集

  • minimal_plugin:创建插件所需的最小内容。包括 lv2-coreurid
  • plugin:标准插件的常规仓。包括 lv2-corelv2-atomlv2-midilv2-uridurid。**这是默认选项**。
  • full:所有子crate。

支持的目标

Rust-LV2为了提高可用性和构建速度,为不同的目标使用预先生成的C API绑定。Rust有很多支持的目标,但我们的维护能力有限,因此只能支持某些目标。我们已经根据层次划分了不同的目标,就像rustc所做的那样,这为您提供了一个目标预期的总体了解。下表列出了支持的目标、在lv2-sys crate中使用的绑定,以及适用的情况下,维护者和该目标的最后验证。

绑定本身是通过LV2 systool生成的,并通过构建书籍中的示例插件并使用该目标的宿主进行测试来验证。

第一层

对于rust-lv2的第一层目标,也必须是rustc的第一层目标。您可以通过查看平台支持页面来了解哪些目标被包括以及它们提供了什么。此外,必须有一个维护者,他有权访问运行此目标的机器,并且可以在该机器上生成和验证绑定。这意味着,如果您在第一层目标上运行代码时遇到问题,将有一个维护者可以帮助您。

目标 绑定 维护者 最后验证
x86_64-unknown-linux-gnu linux/x86_64.rs @Janonard 2020年5月10日,使用Carla v2.1,在Arch Linux上运行
x86-unknown-linux-gnu linux/x86.rs @Janonard 2020年5月16日,使用Carla v2.1,在Linux Mint 19.3 32位上运行

第二层

第二层目标是一个至少在rustc的第二层且已生成绑定的目标。然而,它可能无法正常工作,并且可能没有维护者有权访问运行此目标的机器,并可以在该机器上生成和验证绑定。这意味着,如果您在第二层目标上运行代码时遇到问题,您将进入未知的领域。

目标 绑定
aarch64-unknown-linux-gnu aarch64.rs
arm-unknown-linux-gnueabi arm.rs
arm-unknown-linux-gnueabihf arm.rs
armv5te-unknown-linux-gnueabi arm.rs
armv7-unknown-linux-gnueabi arm.rs
armv7-unknown-linux-gnueabihf arm.rs
thumbv7neon-unknown-linux-gnueabihf arm.rs
x86_64-pc-windows-msvc windows.rs

许可证

许可方式为以下之一

任选其一。

依赖