JUCE音频—AudioIODevice类群

音频设备(音频驱动)是计算机音频系统中不可或缺的一个重要环节,本小节讲解的类群就代表了这一环节。首先需明确“音频驱动的类型与音频设备、物理设备与逻辑设备”等关系:音频驱动的类型指的是ASIO、DirectSound、CoreAudio等音频驱动的抽象概念,音频设备则代表某个具体的音频驱动,可将此处的音频驱动理解为计算机中的逻辑音频硬件(音频设备)。JUCE类库中,通过具体的驱动类型来创建该类型所对应的音频设备。一个音频设备也许支持多种驱动类型,一个驱动类型也可以由多个音频设备所共有。比如:

继续阅读JUCE音频—AudioIODevice类群

AudioFormatReader类系详解

AudioFormatReader是一个抽象基类,无需也无法创建此类的对象。该类相当于一个保存了音频文件或音频CD数据的指针。更简单的描述:各种格式的音频文件通过AudioFormat类将有关数据转交给AudioFormatReader,供下一个音频处理环节使用(比如AudioSource)。

实际编程时,一般不直接与AudioFormat打交道,而是通过AudioFormatManager类的有关函数直接返回AudioFormatReader指针。AudioFormatManager类在内部处理时将使用合适的AudioFormat来创建本类指针,这些内部细节无需关心。并且也很少用本类对象完成具体的工作,往往只是需要一个本类指针就足矣(偶尔会用到本类的public成员数据,以获取当前音频文件的各类信息)。

继续阅读AudioFormatReader类系详解

JUCE音频之AudioFormat类群

本小节主要详解以下类:

  • AudioFormat类系 代表某个具体的音频格式,其成员函数createReaderFor()可生成输入流对象,供AudioFormatReader读取;createWriterFor()可生成输出流对象,供AudioFormatWriter写入
  • AudioFormatReader类系 读取AudioFormat所生成的音频数据
  • AudioFormatWriter 将音频数据写入到AudioFormat所生成的输出流对象中
  • AudioFormatManager 注册音频格式,直接返回用于读取某个音频文件的AudioFormatReader

继续阅读JUCE音频之AudioFormat类群

AudioTransportSource详解

AudioTransportSource

图 3 11 AudioTransportSource类的继承层次

AudioTransportSource可对另一个PositionableAudioSource所产生的音频流进行中转和控制,其内部使用一个BufferingAudioSource对象。因此,由该类中转并控制的音频流可进行缓冲处理及并发生成。换句话说,AudioTransportSource相当于BufferingAudioSource的功能增强版,除了缓冲和并发之外,还可对来源音频流进行更多控制。在增强BufferingAudioSource的功能时,Jules并没有采取派生子类的方式,而是将该类组合到与其平级的AudioTransportSource类中。优先使用组合而非继承,这是非常重要的设计原则。

继续阅读AudioTransportSource详解

小小的说明之三:关于设计模式

继续上文。除了“四人帮”罗列的那一堆设计模式之外,实际上在现代面向对象的软件工程中还有一些常用、常见的模式,或者“模式变体”。本文只列出一部分(比较大众和大众熟知的)。仅为了配合介绍JUCE类库做个导引或预备,并非专门谈论模式(实际上,真实项目中的模式运用是很复杂,很模糊的,不下一番苦工梳理和去芜存菁,很难直接套用现成的或对号入座)。

继续阅读小小的说明之三:关于设计模式

小小的说明之二:关于设计原则

随着对JUCE类库的介绍不断深入与具体,为了从更高的层次描述清晰,减少废话,让读者更宏观、更直接的了解此库,不可避免的会牵扯到类库设计、面向对象设计原则与设计模式(我会尽量避免)。实际上,有些方面,并无严格的统一与定论,甚至有争议,或自相矛盾。为避免误解和歧义,此处简单补充一下我所理解和体会的原则、模式等等,敬请批评指正。

严格说起来,这篇文章不能算是原创。更多,类似于依托于书本及经典,个人的读书笔记。或者说是不揣冒昧、厚颜无耻地总结大师经验而已。当然,多多少少,也有一点个人的实践体会在里面。只是,和前人智慧比起来,完全可以忽略。

继续阅读小小的说明之二:关于设计原则

小小的说明之一:关于术语、概念的严谨性

截至目前,本站所发布的文字(包括前段时间在新浪博客上的发文),绝大多数来自于本人(Running)所著的Cross-Platform Programming with C++ and JUCE《用JUCE类库进行C++跨平台开发》一书。网络发布,基于网上阅读与大众传播的特点,不可能做到照搬,也无法知无不言、言无不尽,只能摘录其中一些部分,并做适当简写和临时改写。

继续阅读小小的说明之一:关于术语、概念的严谨性