870920 Menu

AudioSource之MixerAudioSource(混音)

MixerAudioSource可将其他一或多个AudioSource合而为一,混合后作为一个单独的AudioSource集中输出,即:本类所产生的音频流为其他一或多个AudioSource的混合数据。成员函数有:

  • addInputSource () 将某个AudioSource添加到本类,可设置是否托管之
  • removeInputSource () 移除已经添加的某个AudioSource
  • removeAllInputs () 移除所有已经添加的AudioSource
  • prepareToPlay () 准备混合,内部调用所有输入源的prepareToPlay()
  • releaseResources () 结束混合,内部调用所有输入源的releaseResources()
  • getNextAudioBlock () 混合所有输入源,生成混合型音频流,设置采样率

注意:addInputSource()函数添加新的AudioSource时,如果当前正在工作,即本类调用了prepareToPlay()和 getNextAudioBlock()之后、尚未releaseResources()之前,在此期间添加新的AudioSource,需确保在添加之前,所添加的AudioSource对象调用它自己的prepareToPlay()。这么做之后,本类每次releaseResources()结束混合并重新prepareToPlay()后,该来源可自动调用它自己的prepareToPlay(),而无需再次重复上述步骤。

本类在工作函数getNextAudioBlock()中混合已添加的所有AudioSource,其核心语句为:

通过ToneGeneratorAudioSource和MixerAudioSource这两个派生类可得出整个AudioSource类系最重要的使用流程:

  1. 在产生音频流之前,需调用prepareToPlay(),并给出所生成的数据块的大小和音频数据的采样率,这两个指标也是prepareToPlay()的两个实参。调用此函数后,可形象的比喻为:我已准备好,可以生成音频数据了。如果本类关联或聚合了其他AudioSource,则在此一并调用该AudioSource的同名函数,大家一起做好准备。
  2. 只有调用了prepareToPlay()之后,getNextAudioBlock()才会产生所需的音频数据。该函数为工作函数,其参数为AudioSourceChannelInfo结构体对象,所产生的音频数据即写入该对象中。同理,如果本类关联或聚合了其他AudioSource,则在此一并调用该AudioSource的同名函数,大家一起开工。如有需要,可临时定义AudioSourceChannelInfo对象,供本类聚合的AudioSource的getNextAudioBlock()函数所用。这些AudioSource所产生的音频数据写入本函数临时定义的AudioSourceChannelInfo对象中,而该对象在定义和初始化时直接关联了本函数的info参数,因此,最终所写入的数据,保存在本函数的info对象中。该对象的数据,即为本类所产生的音频流。
  3. 当不再需要产生音频数据时,调用releaseResources()停止工作,在此清理善后。该函数无参。同上所述,如果本类关联或聚合了其他AudioSource对象,则在此一并调用该AudioSource的同名函数,大家一起停止工作。善始善终,有条不紊。