MixerThread详解

293 阅读2分钟

基于Android P版本分析

MixerThread

MixerThread是Android音频输出的核心部分,所有Android的音频都需要经过MixerThread进行混音后再输出到音频设备;

ThreadBase_class.jpg

MixerThread的继承关系:

  • MixerThread --> PlaybackThread --> ThreadBase --> Thread

在PlaybackThread中,重写了Thread的threadLoop、onFirstRef等方法,因此在调用MixerThread这些方法时,实际上就是调用了PlaybackThread的方法;

核心操作

操作方法功能
standbythreadLoop_standby待机
mixthreadLoop_mix混音
writethreadLoop_write音频输出
exitthreadLoop_exit退出
drainthreadLoop_drain只有offload用到
sleepthreadLoop_sleeptime无音频需要处理,计算睡眠时间

核心变量

变量取值含义
tracksToRemove需要被移除的Track,一旦所有的Track都被移除,则表明没有音频数据需要处理,那么线程会进入睡眠
sleepTime睡眠时间
standbyTime如果持续睡眠超出standbyTime,则会进入待机
mStandby表明当前是否为待机状态
mActiveTracks需要进行音频处理的Track,如果该Track已经播放完成或者被停止,则会被移入tracksToRemove
mMixerStatusMIXER_IDLEMixer状态,no active tracks,表明不需要混音,而是进入睡眠
MIXER_TRACKS_ENABLEDMixer状态,at least one active track,but no track has any data ready
MIXER_TRACKS_READYMixer状态,at least one active track,and at least one track has data,表明可以进行混音

MixerStatus

MixerStatusDesc
MIXER_IDLE没有可用的活动track,表明不需要混音,而是进入睡眠
MIXER_TRACKS_ENABLED至少有一个活动track,但是没有track有任何已经准备好的数据
MIXER_TRACKS_READY至少有一个活动track同时至少有一个track中存在已经准备好的数据,表明可以进行混音
MIXER_DRAIN_TRACK删除当前正在播放的track
MIXER_DRAIN_ALL完全耗尽硬件资源

核心逻辑分析

PlaybackThread threadLoop

PlaybackThread threadLoop.png

MixerThread prepareTracks_l

MixerThread prepareTracks_l.png

MixerThread threadLoop_mix

MixerThread threadLoop_mix.png

MixerThread threadLoop_write

MixerThread threadLoop_write.png

MixerThread threadLoop_removeTracks

MixerThread threadLoop_removeTracks.png

MixerThread threadLoop_standby

MixerThread threadLoop_standby.png

MixerThread threadLoop_sleepTime

MixerThread threadLoop_sleepTime.png