870920 Menu

AudioFormatReaderSource详解

AudioFormatReaderSource单继承自PositionableAudioSource,专用于读取AudioFormatReader对象所持有的数据。读取后的数据由本类负责转为系统内部可处理的音频数据,而后输出(即:将转换后的数据保存到本类继承自AudioSource音频来源基类的getNextAudioBlock()函数的参数对象中)。

AudioFormatReaderSource的构造函数:
 AudioFormatReaderSource (AudioFormatReader堆对象, 是否托管1参)

AudioFormatReaderSource实现了基类的7个纯虚函数,继承了1个虚函数,新增了1个成员函数:
 getAudioFormatReader () 返回本类所持有的AudioFormatReader指针
 prepareToPlay () 此函数什么也不做
 releaseResources () 此函数什么也不做
 getNextAudioBlock () 产生音频流,获取的数据保存到本函数的参数对象中
 setNextReadPosition (int64) getNextAudioBlock()产生音频流后,从给定处输出
 getNextReadPosition () 获取上个函数所设置的位置
 getTotalLength () 返回数据流的总长度(总的采样数)
 setLooping (bool值) 设置是否循环输出音频流
 isLooping () 检测当前是否处于循环模式

使用AudioFormatReaderSource的关键:创建对象时需提供AudioFormatReader类的指针变量,本类的根本作用就是转换该对象的数据并输出基于该数据的音频流(系统内部可识别并处理的音频采样数据)。

关于AudioFormatReader:一个独立的抽象基类,通常,该类作为辅助类来间接使用。即:另外一些类的成员函数的返回值为本类的堆对象(指针),比如专用于读取音频文件的AudioFormat类(及其派生类)的createReaderFor()函数。该函数的返回值为AudioFormatReader指针,可用作AudioFormatReaderSource的构造参数。从而实现:读取磁盘上某个音频文件的数据,将这些数据转换为系统内部处理的音频流。这是实现音频播放功能的最重要步骤之一。

AudioFormatReader有两个功能性的派生类,一是可读取音频CD数据的AudioCDReader,另一个是可读取音频文件中某一范围内数据的AudioSubsectionReader。按面向对象设计原则中的“依赖倒转”与“里氏代换”,这两个子类堆对象的指针变量当然可以作为AudioFormatReaderSource的构造参数,从而将CD中的数据或某个音频文件中的一部分数据转换为系统内部可识别并处理的音频流(采样数据)。

由此可理清一些重要的思路和流程:
 AudioFormatReader用于读取音频文件或CD,将其数据转交给AudioFormatReaderSource。
 AudioFormatReader读取和转交数据通过指针来实现,并无写操作,只是将内存地址转来转去。
 AudioFormatReaderSource通过AudioFormatReader将音频文件或CD数据转换为音频流。
 AudioFormatReaderSource可被另外两个平级类所使用(作为构造参数),以实现更多功能。