关注了就能看到更多这么棒的文章哦~

An introduction to Linux audio plugin APIs

April 21, 2022
This article was contributed by Alexandre Prokoudine
DeepL assisted translation
https://lwn.net/Articles/890272/

音乐和音频制作(music and audio production)相关领域主要是由专有软件供应商(proprietary software vendors)主导的。其中,Steinberg 公司作为一家创造了一些最常用软件的公司脱颖而出,这些软件包括 Cubase 和 Nuendo digital audio workstations (数字音频工作站)。Steinberg 也是著名的 VST plugin API 的创造者,这个 API 由于许可政策(licensing policy)的原因,让开发者们很愤怒以至于多次尝试去创造一个开源的替代品。尽管现在 VST3 SDK 已经可以在 GPLv3 license 下使用,但是该公司对 SDK 的控制方式仍然将开发者们在推向其他的开源解决方案。

本文是对音乐家和音响工程师所使用的开源 plugin API 各种方案的介绍。主要关注点是较大的生态系统,以及他们有哪些缺点,如何导致了新的基于自由许可证的替代方案。

What audio and MIDI plugins do

大多数的音频编辑器、MIDI 音序器(sequencers)和数字音频工作站(DAW, digital audio workstations)都是可扩展的。这里的可扩展,有时候是指可以写脚本来使用程序提供公共 API(例如 Ardour 的 Lua 脚本,Reaper 的 ReaScript 脚本)。但最常见的用法还是直接写一个扩展(extension),或者叫插件(plugin),来利用那些通常不局限于单一程序里的 API。然后,音频编辑器或 DAW 就会作为该插件的 "host",在自己的进程中运行,或作为一个单独的进程来运行(这是一个越来越流行的做法了)。

插件在 DAW 中最常见的两个使用场景就是处理音频(equalizers 均衡器、reverbs 混响器等),这意味着要有音频输入和音频输出;以及将音符(note)变成音乐(music),这就需要有 MIDI 输入和音频输出。大多数插件的 API 都支持音频和 MIDI 的输入和输出。此外,有些插件是为了控制外部设备而创造出来的,比如有的带有 DSP 的主板的音频接口,也比如内置的 reverberation engine (混响引擎)。这些插件通常由硬件供应商自己制作,不过也有一些少见的例外情况。

不同于许多图像编辑器中的插件,音频和 MIDI 的插件通常被设计成非破坏性的(non-destructively)工作方式,并实时运行。这意味着你不需要去渲染生成(render)经过处理后的音轨来听。你完全可以直接连接一个 MIDI 键盘,演奏一个虚拟乐器,都完全不需要记录一个音符,而且你可以在今后随时来改变插件中的参数的值。

A quick overview of current plugin APIs

如下这些插件 API 目前在广泛使用中:

  • Virtual Studio Technologyy,即 VST2/VST3,由 Steinberg 开发。它支持 Windows、macOS 和 Linux,并且有广泛的 host/DAW 都支持它。

  • Digidesign/Avid 的 Real Time AudioSuite,即 RTAS(Windows、macOS,需要 Avid Pro Tools 才能支持)。

  • Avid Audio eXtension, 或称 AAX, 由 Avid 开发 (Windows, macOS, 需要 Avid Pro Tools 才能支持)。

  • 苹果公司的 Audio Unit, 或 AU, (macOS, iOS/iPadOS)。

  • LV2,这是一个开源项目(Linux、Windows、macOS)。

在行业之中所提供的插件大多是以 VST2/VST3 的形式提供给 Windows 和 macOS,也会以 AU 的形式提供给 macOS。有时候插件也是 AAX 和 RTAS 的形式来提供给 Avid Pro Tools 用户,因为 Avid 早就因为拒绝支持它自己以外的任何 API 而臭名昭著了。

具体到 Linux 环境,LADSPA 是第一个广泛使用的音频插件 API;DSSI(一次性软合成器接口)是由同一个团队在这个 API 上面开发的,使得软件合成器(synthesizer)和采样器(sampler)也可以作为插件来使用。目前有几百个 LADSPA 插件,但 DSSI 插件还不到 50 个。Linux 上的大多数音频编辑器和 DAW 都支持 LADSPA,很少有支持 DSSI 的。LADSPA 和 DSSI 现在基本上都被 LV2 取代了,LV2 支持音频和 MIDI 处理。今天有了超过一千种 LV2 插件。

还有越来越多的插件——既有专有的也有自由许可的——是为 VST API 编写的,并且是在 Linux 上编译生成的,这主要是由于 VST3 SDK 既支持 GPLv3 也支持专有许可证的条款。事实上,一些非常棒的自由软件插件,如 Dexed 和 OB-Xd synthesizer 在 Linux 上只支持 VST3。

最后一个值得一提的 API 是 Generalized Music Plugin Interface,即 GMPI。其最初规范是在 2003 年到 2005 年之间由很多开发者共同设计出来的,开发者们包括来自专有软件(SONAR、SynthEdit、FL Studio 等)和免费软件(Ardour 等)的成员。尽管他们的背景各不相同,但这些开发者都有一个共同的想法:每个人都对 Steinberg 在行业中的主导地位感到不爽,我们将在下面详细讨论这个问题。

GMPI 规范被 Tim Hockin(来自谷歌,但是这个工作跟公司无关)和 Jeff McClintock(SynthEdit)实现成了一个非官方的 SDK,Koen Tanghe(当时是根特大学的工程师)也在开发他自己的版本。尽管很多人提出要求进行 review,但是 Hockin 和 McClintock 代码并没有得到很多同行评审。最终工作组解散了,McClintock 在他的 SynthEdit 插件 API 的第三次大改中使用了这个 SDK 的一个削减过的版本。第四次大改中将包含经过重构的 GMPI SDK 版本。

关于这里发生了些什么,我已经听到了若干种解释。McClintock 在一次私人谈话中分享的故事是与公开的邮件列表中的讨论最接近的。他的印象是,许多利益相关者只想要一种自由许可的 VST2,而不希望有重大的改变和改进,所以没有动力去 SDK 进行 review。Paul Davis(Ardour)提供的另一个说法是,当初宣布这一提案倡议的 MIDI Manufacturers Association 会希望开发阶段是封闭进行。据报道,该协会也不能保证最终会采用所有人都会满意的许可证。因此,当一个官方 SDK 真正出现时,许多利益相关者可能都已经失去了兴趣,而这些人可能对非官方的 SDK 也不感兴趣。

我提到 GMPI 有三个原因。首先,这是历史上第一次由专有软件和自由软件的开发者联手开发一个开源的音频/MIDI 插件 API。其次,虽然基本上没有成功,但 GMPI 影响了 VST3 和 LV2 的设计( https://lv2plug.in/gmpi.html 有关于后者的更多信息)。最后,McClintock 在去年 12 月继续开始进行完整的 GMPI SDK 的开发工作。该 SDK 遵循 ISC license 许可。

Where existing plugin APIs fall short

首先,如果你想开发一个在 Linux 上使用的音频/MIDI 插件,那么比起 Windows 和 MacOS 环境来说,你只有更少的选择。

除了 macOS 和 iOS/iPadOS 之外,AU(包括 v2 和 v3)无法在其他任何地方使用。AAX 和 RTAS 是跨平台的,但只能在 Avid Pro Tools 中使用,在 Linux 上无法使用。到目前为止,SynthEdit 似乎是唯一真正使用 GMPI 的软件。那就剩下 VST2、VST3、LADSPA、DSSI 和 LV2 了。这些 API 在 Linux 上的 host application 应用程序里都有支持,既有免费的也有专有的,尽管其实只有只有两个 host 程序,也就是 Qtractor 和 Zrythm,它们俩都支持所有五个插件 API。

VST2 就已经到了生命的尽头。如果你持有 VST2 SDK 的 license,只要你愿意,你就可以开始制作该插件的新版本了。但是 Steinberg 不会为新的插件来发布 SDK license,VST2 在 Linux 上从未广泛使用的一个主要原因就是需要授权使用这个 SDK。为数不多的原生的 VST2 插件确实曾经在 Linux 上出现过,这要归功于一些 LMMS 开发者制作的 clean-room reverse-engineered VeSTige header file。

LADSPA 和 DSSI 都是简单的 API,Linux 上大多数 audio host 都支持 LADSPA。然而,这些 API 都有很多技术限制,它们没有很好地维护起来,而且几乎所有人都在几年前就停止制作新的 LADSPA 和 DSSI 插件了。因此,我们现在只剩下 VST3 和 LV2 了。

VST3 的规范(specification)很符合当代的需求,从而可以创建功能强大的插件。它也是可扩展的,尽管 VST3 的扩展都分布在零零散散的第三方供应商那里。然而,多年来,Steinberg 已经成功地激怒了专有和自由软件插件的开发者。该公司淘汰 VST2 的方式使插件开发者们感到很不爽,因为无法使用以前的技术来为仍然支持 VST2 的 host 创造新作品了。除此之外,Steinberg 自己的 host 和插件都将在 2024 年 1 月停止支持 VST2,所以用户拥有的任何 Cubase 和 Nuendo 项目都会完全无法加载了。Steinberg 采取了一些措施,方便 VST2 向 VST3 的过渡,但据说既没有设计好,也没有能让开发者及时去了解这一功能,从而导致现在这个悔之不及的错误。

再有就是不可避免的技术争议。VST3 SDK 非常庞大,而且有许多难以理解的奇葩做法,比如强制使用 UTF-16。尤其是,VST3 中有一个全新的方式,来通过一个方便的抽象层来处理传入的 MIDI 数据,这个做法很有价值,但它要求对现有的插件重新修改架构,完全无法继续沿用以前的旧方式。这使得人们很难去同时维护插件的 VST2 和 VST3 版本。要了解开发和维护一个功能齐全的 VST3 版本的比较复杂的插件需要多少工作,你可以阅读 Urs Heckmann 在 KVR 的说法(https://www.kvraudio.com/forum/viewtopic.php?p=8331782#p8331782)。

总之,这个行业已经厌倦了受 Steinberg 摆布的生活。GMPI 是打破这个现状的第一次重大尝试,但是,如上所述,它并不成功。

LV2 是在 2000 年中期利用 GMPI 规范中的许多想法建立的。它的设计是很现代的、可扩展的,并支持许多很棒的功能。然而,尽管现在有超过 1000 个 LV2 插件可用(https://gist.github.com/mxmilkiib/8624da2fdd59c17d048147d97f6ea0c7 有一个较新的、但并不完整的列表),但人们普遍认为 LV2 很难上手。自从它诞生以来,我观察到开发者对这个 API 有一些抱怨。有些问题是纯技术性的。例如,plugin metadata 是单独存储在使用 Turtle 语法的文本文件中。对于复杂的插件,这些文件往往会变得非常大。比如说,Mix Maxtrix 的生成的 metadata 文件有将近 32000 行,尽管这只是一个极端的例子。其他开发者认为太多灵活性是他们对 API 的主要抱怨。

还有一些组织方面的问题,如缺乏管理机构并且 "厨房里有太多的厨师",这导致插件开发者感觉没有人听他们的观点。LV2 的维护者对他们的设计决定都表现的有些过度防卫了,不喜欢重新检查是否需要改变这些设计,这种感觉也让人们不太满意。在更大的范围内来说,最终用户需要一个生态系统,而 LV2 从来没有建立起这样的生态系统。然而,这是一个非常宽泛的说法,这一点需要单独开一个文章来讨论如何定义一个插件 API 的生态系统了。

还有更多的原因导致了这个 API 的采用非常缓慢。一个原因是,LV2 在自由软件领域之外的 host 开发者中并不受欢迎。由于 host 缺乏对 LV2 的支持,因此大大限制了最终用户去接触到这些插件。Reaper 几乎是唯一支持 LV2 的主流 DAW(大范围采用的),但 Reaper 也支持几乎所有的插件 API。

另一个问题是,LV2 目前不被主流插件开发框架所支持。使用这些框架,可以一次编码就能编译生成多个插件 API 的插件。在这些框架中,有一个由 falkTX 开发的、10 年前从 JUCE fork 出来的框架,它添加了对 LV2 的支持,upstream project 正在重新实现这部分功能,但没有宣布计划大概会在什么时候完成。另外,第三方针对 iPlug2 框架添加 LV2 支持的工作也一直未被合并到 mainstream 中。

所有这些因素都影响了 LV2 的采用。因此才会有后来发生的各种事情,比如 OB-Xd 开发者关闭了请求支持 LV2 的要求,因为 JUCE6 有 VST3 支持但是没有 LV2 支持。要让插件开发者在使用 JUCE 时也能生成一个原生的 VST3 插件已经很困难了,要让他们发布一个 LV2 版本,那就几乎是不可能的了。

我可以肯定,这里提到的大部分观点都会被那些大量使用 LV2 的开发者所反驳。然而,就算是简单的观察一下也可以看出,LV2 在 FOSS 生态系统之外既不流行、也不出名。

In conclusion

目前有两个开源的音频/MIDI 插件 API 在活跃使用中,这就是 VST3 和 LV2。这两个 API 都提供了可以创建复杂插件的功能,但从一些开发者的角度来看,无论是技术方面还是这些 API 各自的维护者的管理方式方面,两者都有些问题。

对于 VST3 来说,开发者必须要接受 Steinberg 的很有侵略性的 license 政策。这实质上意味着永远不能再新建 VST2 插件了。对于虚拟乐器的开发者来说,这意味着要么完全放弃对现有 VST2 插件的支持,要么就只有花费精力同时维护两个不同架构下的代码库。除此之外,API 中的其他各种设计决策也也都受到了批评。

对于 LV2 来说,开发人员学习曲线太陡峭,而且如果他们想在一个代码库中开发支持多个 API 的插件的话几乎没有什么选择。他们还将被限制在只有开源的 host 应用程序以及唯一一个专有的数字音频工作站(Reaper),这大大限制了他们能触达的用户,除非他们能够支持多个 API。

这种情况已经持续了多年。在 2015 年引出了另一个开源 API,也就是 CLAP。这个项目在去年年底被复活了,现在正在想办法支持免费和专有软件。我们将在后续的文章中更详细地谈论它。

[非常感谢 Paul Davis, Robin Gareus, Filipe "falktx" Coelho, William Light, Alexandre Bique, Jeff McClintock 就音频/MIDI 插件 API 的各种技术问题提供指导。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

LWN:Linux audio plugin APIs综述!相关推荐

  1. [Linux Audio Driver] Qualcomm平台音频GMS认证器件要求

    从GMS测试常见的fail项来明确其器件要求,常见的fail测试项主要是以下三个: 后面是分析,要看结论的话直接拉到文末: 一:Audio Frequency Speaker Test 此测试使用外部 ...

  2. [Linux Audio Driver] SM6350平台音频bring up ( 一 )

    0. 背景 这个是高通5G平台,音频的内容改的比较多,比较直接的是platform.c就直接移动到vendor了:目前 高通那边的趋势还是把音频逐渐从kernel剥离,android 7/androi ...

  3. [Linux Audio Driver] Android 10 machine driver probe函数分析

    0. 背景 平台:Qualcomm 5G SM6350.android10.kernel version: msm-4.19. 本文重点分析machine driver里面的msm_asoc_mach ...

  4. [Linux Audio Driver] Android7 外部PA Speaker代码结构

    0. 背景 平台:MSM8953 kernel version: msm-3.18. 1. enable_spk_ext_pa 代码路径:LA.UM.5.6\kernel\msm-3.18\sound ...

  5. [Linux Audio Driver] 从设备地址理解

    背景: 以前调试了一个音频codec芯片es7543,当时在想这个codec_name如何配置: 网上看了些调试codec的心得文档,有的博主瞎写,以这个es7243e.5-0010为例, 说es72 ...

  6. [Linux Audio Driver] 高通平台内部MIC_BIAS简介

    #更新 2020.05.10 我觉得我这个标题取的不是很妥当,为了表达对技术的敬畏之心,我将原标题 <一文搞懂内部MIC_BIAS>修改为<高通平台内部MIC_BIAS简介> ...

  7. Linux Audio (6) DAPM-3 damp的kcontrol注册过程

    DAPM-3 damp的kcontrol注册过程 普通kcontrol DAMP kcontrol 第一步 codec驱动add widget 第二步 Mechine驱动add kcontrol da ...

  8. LWN: Linux 5.3合入窗口进展 part 1

    点击上方蓝色字关注我们~ 5.3 Merge window, part 1 By Jonathan Corbet July 12, 2019 在Janathan撰写此文的时候,已经有6666个patc ...

  9. linux audio A2B

    Android 中并没有使用标准的 ALSA,而是使用一个 ALSA 的简化版叫做 tinyalsa.ALSA是Advanced Linux Sound Architecture,高级Linux声音架 ...

最新文章

  1. 使用Javascript制作连续滚动字幕
  2. python计算结果传给spark_将Python函数作为对象传递给Spark
  3. Spring中IoC的入门实例
  4. 常用 Git 命令清单(转)
  5. 邮箱验证 ——ACM
  6. 使用迁移学习和TensorFlow.js在浏览器中进行AI情感检测
  7. Webpack学习手册
  8. Java基础复习笔记系列 七 IO操作
  9. Android TextView 实现文字大小不同和文字颜色不同
  10. 原来做浏览器这么简单
  11. 游戏开发中的脚本语言
  12. ios:应用发布蒲公英流程
  13. PON串口链接上网步骤
  14. Linux块设备驱动(一) _驱动模型
  15. 大神推荐,这几个电脑实用技巧,让你电脑用起来更加流畅舒服
  16. String类型——字符串
  17. 关于物流管理的软件测试项目经验,物流软件自动化测试用例管理和执行调度的设计与实现...
  18. python你好怎么写_python学习之python入门
  19. DirectX、Direct3D、OpenGL的区别(DX、D3D、OpenGL)
  20. 7-6 谁是凶手 (100 分)

热门文章

  1. android分屏模式_Android分屏显示总结
  2. OpenKruise :SidecarSet 助力 Mesh 容器热升级,TCP的三次握手、四次挥手
  3. 关于多个Jenkins实例共享同一个工作目录的问题
  4. 三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经
  5. TextView 字体中间加 横划线
  6. SSL生成证书的几种方式
  7. AndroidIOS APP启动速度专项测试方法
  8. 通过js进行在线PDF电子签名和小编辑
  9. 健身记录--每日更新
  10. 网易称暴雪离婚不离身;苹果发布 M2 Pro 和 M2 Max 芯片;滴滴出行 App 已重新上架安卓应用商店 | 极客头条