用c++设计音效插件 :8 C++惯例和如何使用本书

2022/6/19 5:52:29

本文主要是介绍用c++设计音效插件 :8 C++惯例和如何使用本书,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本书包括DSP处理理论以及C++代码和面向对象编程。要使用本书附带的C++项目,你至少需要了解C++的基础知识,以及如何使用你的C++编译器--Visual Studio(Windows)或Xcode(MacOS)。对于C++部分,你应该熟悉以下术语;如果你不确定它们的含义,或者从未真正全面学习过这些概念,请花些时间来了解。

数据类型:int, float, double, unsigned int
对象:成员变量和函数
指针、数组、指针的数组
封装
继承;基类和派生类
虚函数和抽象基类
你需要有Windows的Visual Studio 2015或更高版本,MacOS的Xcode 8或更高版本。你可以找到许多资源来帮助你入门,包括www.aspikplugins.com/forum/,在这里你可以提出问题并寻找以前已经解决的问题。

你还需要选择一个第三方的插件框架,你很可能属于以下三种情况之一。

你已经选择了一个插件框架,而且你已经投入时间去了解它的基本操作:定义GUI,获得GUI控制变化,以及处理音频样本。
你是音频插件编程的新手,需要一个最简单的框架,同时也能产生专业的效果。
你看过其他框架,但更多的是困惑,或者你不想为你的商业插件向第三方支付许可费。
我们从头到尾开发了一个新的专业音频插件框架,叫做ASPiK,你也可以使用。这些插件项目被打包成ASPiK项目;然而,它们的设计方式使得它们可以简单地在任何其他插件框架中实现,或者用从头开始设计的插件。没有一个项目实际上需要ASPiK特定的代码来运作。

8.1 C++对象的三种类型

本书包含55个以上的C++对象,供你在自己的插件中使用。这些对象可分为三组。

  • DSP对象:这些小对象实现了基本的DSP算法。
  • effect 对象:这些较大的对象被设计为直接与GUI接口。它们实现了特定的音频效果,并做了所有必要的工作--它们只需要连接到GUI并处理输入样本
  • WDF梯形滤波器库对象:我们包括一个广泛的WDF梯形滤波器库,伴随着第12章。这些对象与其他对象有很大不同,有自己的基类和连接机制。

DSP、Effect和Ladder Filter Libarary对象在ASPiK SDK中包含的文件fxobjects.h和fxobjects.cpp中组合在一起。如果你决定不使用ASPiK作为你的框架,你可以很容易地从SDK中复制它们来包含在你自己的项目中。它们不包含任何与ASPiK框架绑定的代码,可以很容易地在其他框架之间移动。

所有伴随着信号处理章节的书本项目算法都被打包成简单和相对小的C++对象。每个对象的音频处理代码直接来源于信号处理算法,通常全部或部分与这些章节一起打印。信号处理代码是直接用C++完成的,它是通用的,与平台无关。除了需要FFTW库的FFT处理对象外,其他对象都不需要或包括第三方代码。信号处理代码与插件框架解耦,不需要支持代码。

8.1.1 效果对象成为框架对象成员

如果你使用一个插件框架,会有一个对象被分配来做音频信号处理。在ASPiK中,它总是PluginCore对象,而其他框架通常指定一个音频处理基类,你从该基类中派生出你的插件对象。你使用什么框架并不重要,音频算法对象被设计成主处理核心对象的成员对象。你可以把它们声明为静态成员,或者用指针动态地声明。对于书中的项目,我使用静态成员,因为这些对象处理自己的动态分配,但你当然可以改变这一点。几乎所有的效果对象都是一次处理一个通道的音频。对于多通道操作,你将使用多个对象,每个通道一个。我们没有将大多数对象聚合成多通道对象,以便在你的设计中提供最大的灵活性。

图8.1: 如图所示,算法对象是外部框架对象的成员;你只需为每种处理算法和通道数声明对象。

你的框架对象只需声明它需要处理的各种对象,并持有成员对象,如图8.1所示。例如,如果你的插件对象实现了音频过滤,你将使用我在第11章描述的AudioFilter对象。这个对象的类声明会是这样的。

// --- ASPiK uses PluginCore (always same name)
class PluginCore: public PluginBase
{
public:
    PluginCore();
    virtual -PluginCore(){}

        // --- PluginBase Overrides ---
        //
        // --- reset:
        virtual bool reset(ResetInfo& resetInfo);
        // --- etc.. others here

private:
      // --- one filter for the left channel and one for the right
      AudioFilter leftFilter;
      AudioFilter rightFilter;

      // --- etc … rest of object
};

一个融合了音频滤波器和变调器的立体声插件将为每个算法声明通道对象;随着章节的推进,我们也会使用数组。

private:
      // --- one filter for the left channel and one for the right
      AudioFilter filters[2];

      // --- one pitch shifter for each channel
      PitchShifter psmVocoder[2];

8.1.2 所有的效果对象和大多数DSP对象都实现了通用接口

每个效果对象都实现了两个接口中的一个,这使得它们的使用可预测且简单。对于这些项目,一个接口被定义为一个纯抽象的C++基类,它只定义了成员函数,没有成员变量;这些对象没有构造函数和析构函数。书中的算法对象是由这些接口子类化的,并实现它们所需的功能。这使得各对象的初始设置和音频处理代码从根本上说是相同的。大多数处理算法接受音频输入样本并产生音频输出样本。在几乎所有的情况下,用户与GUI控件互动,向对象发送参数信息(后面会详细介绍)。这些对象都继承并实现了IAudioSignalProcessor接口。如果你愿意,你可以自由地修改这个接口并添加更多的功能。IAudioSignalProcessor接口定义如下。

class IAudioSignalProcessor
{
                  // --- reset
                  virtual bool reset(double _sampleRate) = 0;

                  // --- process one sample in and out
                  virtual double processAudioSample(double xn) = 0;

                  // --- return true if the derived object can process a frame
                  virtual bool canProcessAudioFrame() = 0;

                  // --- optional processing function
                  virtual bool processAudioFrame(const float* inputFrame,
                                                       float* outputFrame,
                                                       uint32_t inputChannels,
                                                       uint32_t outputChannels)
                              {return false;}

                  // --- switch to enable.disable the aux input
                  virtual void enableAuxInput(bool enableAuxInput) {}

                  // --- for processing objects with a sidechain
                  // --- the return value will depend on the subclassed object
                 virtual double processAuxInputAudioSample(double xn)
                 {
                       // --- do nothing
                       return xn;
                 }
};


这篇关于用c++设计音效插件 :8 C++惯例和如何使用本书的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程