870920 Menu

JUCE类库音频播放详解2-1

实现音频播放这一功能,其流程很像一个链,从读取音频文件或音频数据到最终声卡发声,所用到的类及其顺序为:
AudioFormatManager — AudioFormatReader — AudioFormatReaderSource —
AudioTransportSource — AudioSourcePlayer — AudioDeviceManager

对应的核心语句(对象名与类名相同,开头字母换为小写):

// AudioFormatManager注册可识别的音频格式
audioFormatManager.registerBasicFormats(); 【*△】
// AudioFormatReader获取由AudioFormatManager所创建的音频数据。 此处audioFile为具体的音频文件
AudioFormatReader* audioFormatReader =
audioFormatManager.createReaderFor (audioFile);

// 实例化AudioFormatReaderSource,构造1参为AudioFormatReader,2参为本类托管1参
audioFormatReaderSource = new AudioFormatReaderSource (audioFormatReader, true); 【■】
// AudioTransportSource设置来源为AudioFormatReaderSource,此处用到了时间片线程对象
audioTransportSource.setSource (audioFormatReaderSource, 32768,
&timeSliceThread, audioFormatReader->sampleRate); 【△】

// AudioSourcePlayer设置来源为AudioTransportSource
audioSourcePlayer.setSource (&audioTransportSource); 【*△】
// AudioDeviceManager初始化
audioDeviceManager.initialise (0, 255, nullptr, true);

// AudioDeviceManager添加音频回调,所回调的对象为AudioSourcePlayer
audioDeviceManager.addAudioCallback (&audioSourcePlayer); 【*△】

1、带 * 者为该语句位于内容组件类的构造函数中。

2、带 △ 者为该类对象在内容组件类中声明为栈对象。

3、带 ■ 者为该类对象在内容组件类中声明为作用域指针。

4、AudioFormatReader类的对象临时声明和定义,因该类是抽象基类,因此只能声明为指针。声明的同时,将audioFormatManager.createReaderFor()函数的返回值赋值给它。因为是地址赋值,而非new堆中空间,因此该对象无需销毁事宜。

下图是这六个类的类图、各自的核心函数及所继承的类系。

juce-audio-play

图 7 2 JUCE类库音频播放机制的类图与流程图