870920 Menu

JUCE类库音频UI及其它

本小节主要涉及以下类:
 AudioThumbnail 波形缩略图
 AudioThumbnailCache 缩略图缓存,以提高缩略图加载的效率
 MidiKeyboardComponent MIDI键盘组件
 StandaloneFilterWindow 可加载并运行某个具体插件的DocumentWindow

waveform

图 3 19 AudioThumbnail的显示图示
(图片来源:笔者(Running)开发的某款软件的界面抓图)

AudioThumbnail
AudioThumbnail继承自AudioThumbnailBase和ChangeBroadcaster等类,可将InputSource或AudioFormatReader中的音频数据显示为波形缩略图,由于InputSource和AudioFormatReader均可持有磁盘上音频文件的数据(或某个音频文件中某一范围内的部分数据,此功能是AudioSubsectionReader的专长),因此可将AudioThumbnail视为音频文件的波形缩略图。

AudioThumbnail

图 3 18 AudioThumbnail类的继承图示

AudioThumbnail音频缩略图并不可视,它只是保存了一堆数据,这些数据依据来源采样值计算得出(一批音频数据的实际采样值经RMS均方根计算后,得到一个供绘制缩略图所用的数据值。此值所需的原始采样的数量为本类的构造1参,比如可设置为512,1024等等。此值越小,计算量越大,但波形水平放大后的显示精度越高)。

如需将波形缩略图显示出来,则需借助内容组件的paint()方法来渲染绘制。也就是说,基于计算得出的一系列均方根值,绘制波形。

AudioThumbnail的使用流程
 AudioThumbnail构造时需给出AudioFormatManager对象,从而可读取不同音频格式的数据;
 为了提高再次加载和显示的效率,构造对象时还需给出AudioThumbnailCache缩略图缓存对象;
 创建对象后需setSource()或setReader()关联具体的音频数据(音频文件);
 内容组件类的paint()函数中,AudioThumbnail调用自己的drawChannels()函数绘制缩略图;
 本类可随时set新的音频数据,此时需重绘缩略图。触发重绘,通过可变捕获类的回调函数来完成;
 通常内容组件继承自ChangeListener类,在changeListenerCallback()中repaint()。

一个完整的音频波形缩略图绘制示例代码:(网站发布,略)

以上是静态缩略图的完整编码流程,而动态缩略图需专门写一个类。同时,动态缩略图又可分为已有音频数据和音频设备实时收到的信号等两种情况。这两种情况的处理思路是截然不同的。(网站发布,示例略)

AudioThumbnailCache
用于提高缩略图显示效率的缓存类。构造函数:
 AudioThumbnailCache (最多缓存几个) 构造函数

AudioThumbCache类的成员函数
 clear () 清除所有已缓存的缩略图
 loadThumb () 如果已缓存给出的缩略图,则重新加载之
 storeThumb () 将给出的缩略图对象缓存到本类中
 readFromStream () 从InputStream中加载已缓存的缩略图
 writeToStream () 将当前已缓存的数据写如OutputStream中

AudioThumbnail的成员函数及使用技巧(略)。