ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用c++设计音效插件 : 音频插件的剖析

2022-06-16 22:33:28  阅读:203  来源: 互联网

标签:插件 音效 主机 c++ DLL 编译 API 链接


翻译自: https://learning.oreilly.com/library/view/designing-audio-effect/9780429954313/xhtml/Ch02.xhtml#sec2_1

关于AAX、AU和VST3的音频插件规范,首先要了解的是:它们在本质上都是一样的,它们都实现了相同的属性和行为集,专门针对以伪通用的方式包装音频信号处理软件的问题。插件被封装在C++对象中,从制造商提供的指定基类或基类集合中派生出来。插件宿主将插件对象实例化,并收到一个指向新创建对象的基类指针。主机只能调用它在API中定义的那些功能,并且要求插件正确地实现这些功能,以便被认为是DAW的一个适当的插件--如果所需的功能缺失或实现不正确,插件将失败。这在制造商和插件开发者之间形成了一个合同。你对不同的API钻研得越深,你就越能意识到它们内部的相似性。这一章就是关于API之间的相似性--了解这些底层结构细节将有助于你的编程,即使你使用的是JUCE或我们新的ASPiK这样的框架。在本书的其余部分,我将提到插件和主机。插件当然是我们的小信号处理宝石,它要对音频做一些有趣的事情,被打包成C++对象,而主机是DAW或其他软件,它加载插件,获得一个指向其基本基类的指针,并与之交互。

每个插件的API都被打包在一个SDK中,这实际上只是一堆充满C++代码文件和其他插件组件的文件夹。所有的API都没有预编译的库来连接,所以所有的代码都在那里,你可以看到。要使用任何框架,如JUCE或ASPiK,你需要下载你想支持的每个API的SDK。SDK总是附带有示例代码;你要做的第一件事就是打开一些代码并检查一下,即使你使用的是一个隐藏了实现细节的框架。记住:不要害怕。所有的API都是做同样的基本事情。是的,有很多API特定的东西,但你真的需要超越这些,寻找相似之处。本章将帮助你做到这一点,而接下来的四章将提供更多的细节和洞察力。一个好的练习是打开SDK提供的最基本的样本项目(通常是一个音量插件),然后试着在代码的某个地方找到本章中的每一个部分。

2.1 插件包装。动态链接库(DLLs)

所有的插件都被打包成动态链接库(DLLs)。你有时会看到这些被称为动态链接或动态链接,但它们都是指同一件事。从技术上讲,DLL是微软对共享库的一个特定术语,但这个术语已经变得如此普遍,似乎已经失去了对其母公司的依恋。我们将普遍使用它来指一个预编译的库,可执行文件在运行时而不是在编译时与之链接。可执行文件是DAW,预编译的库是DLL,也就是你的插件。如果你已经了解了DLL的工作原理,那么你可以安全地跳过这一节,但如果你对DLL是陌生的,那么无论你打算如何编写插件,都必须了解这一概念。

要了解DLLs,首先要考虑静态链接库,你可能已经使用过了,也许是在不知不觉中。C++编译器包括一组预编译的函数库,供你在项目中使用。也许其中最常见的是数学库。如果你试图使用sin()方法,你通常会在编译时得到一个错误,说明 "sin()没有定义"。为了使用这个函数,你必须链接到包含这个函数的库。这样做的方法是将#include <math.h>放在文件的顶部。根据你的编译器,你可能还需要告诉它要链接到math.lib。当你这样做时,你是在静态链接到math.h库,这是一个预编译的数学函数集,在一个.lib文件中(该文件在MacOS中以.a为后缀)。静态链接也被称为隐式链接。当编译器遇到一个数学函数时,它会用库中的预编译代码替换函数调用。通过这种方式,额外的代码被编译到你的可执行文件中。你不能取消对数学函数的编译。你为什么要这样做呢?假设在sin()函数中发现了一个错误,math.h库必须被重新编译和重新发布。那么你就必须用新的math.h库重新编译你的软件,以获得错误的修复。图2.1a形象地显示了静态链接,其中math.lib代码在主机代码中。

解决我们的数学错误问题的方法是在运行时链接到这些函数。这意味着这些预编译的函数将存在于一个单独的文件中,我们的可执行文件(DAW)将知道并与之通信,但只有在它开始运行之后。这种链接方式被称为动态链接或显式链接,如图2.1b所示。包含预编译功能的文件就是DLL。其优点是,如果在库中发现了一个错误,你只需要重新发布新编译的DLL文件,而不是用固定的静态库重新编译你的可执行文件。另一个优点是,这个系统的设置方式--在运行时连接到一个组件的主机--可以完美地作为一种扩展主机功能的方式,而主机在编译时不知道任何关于该组件的信息。它也是建立一个插件处理系统的理想方式。主机成为DAW,你的插件是DLL,如图2.1c所示。

标签:插件,音效,主机,c++,DLL,编译,API,链接
来源: https://www.cnblogs.com/pencilCool/p/16383840.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有