870920 Menu

BufferingAudioSource详解

BufferingAudioSource

图 3 10 BufferingAudioSource类的继承层次

BufferingAudioSource使用后台线程读取另一个PositionableAudioSource所产生的音频流,读取时使用缓冲,缓冲数据使用后台线程保存到getNextAudioBlock()函数的参数中,以实现音频流的输出。读取和输出均使用缓冲技术,并且使用同一个后台线程。

本类同时继承了TimeSliceClient,并且本类组合了TimeSliceThread时间片线程对象(该对象为本类的构造参数之一),内部使用该对象添加自身,以实现后台运行(读取数据和产生数据均使用后台线程)。

BufferingAudioSource类利用缓冲技术,以平稳输出另一个PositionableAudioSource所产生的音频流,从而避免出现声音断续、爆音等问题。为防止本类及本类所持有的另一个PositionableAudioSource的不间断运行影响前台UI的响应(即主线程上运行的消息循环),还专门开辟并使用一个后台线程来完成内部处理。即:本类的代码与主线程代码并发执行,互不影响。

综上,归纳BufferingAudioSource类的两大特点:
 使用缓冲技术,防止另一个PositionableAudioSource所产生的音频流在播放时断续爆音
 运行于后台线程,不影响UI响应

BufferingAudioSource的构造函数(共4个构造参数):
 BufferingAudioSource (另一个PositionableAudioSource, TimeSliceThread对象, bool 是否托管1参, int 缓冲大小, int 所生成的音频流的通道数 = 2)

BufferingAudioSource没有新增成员函数,以下函数全部为继承而来并做了实现:
 setNextReadPosition (int64) getNextAudioBlock()产生音频流后,从给定处输出
 getNextReadPosition () 获取上个函数所设置的位置
 getTotalLength () 返回数据流的总长度(总的采样数)
 setLooping (bool值) 设置是否循环输出音频流
 isLooping () 检测当前是否处于循环模式
 prepareToPlay (采样数,采样率) 准备在后台线程上产生音频流
 releaseResources () 停止生成音频流
 getNextAudioBlock (…) 生成音频流,所产生的数据保存到本函数的参数中