基于Android P版本分析
MixerThread
MixerThread是Android音频输出的核心部分,所有Android的音频都需要经过MixerThread进行混音后再输出到音频设备;
MixerThread的继承关系:
- MixerThread --> PlaybackThread --> ThreadBase --> Thread
在PlaybackThread中,重写了Thread的threadLoop、onFirstRef等方法,因此在调用MixerThread这些方法时,实际上就是调用了PlaybackThread的方法;
核心操作
| 操作 | 方法 | 功能 |
|---|---|---|
| standby | threadLoop_standby | 待机 |
| mix | threadLoop_mix | 混音 |
| write | threadLoop_write | 音频输出 |
| exit | threadLoop_exit | 退出 |
| drain | threadLoop_drain | 只有offload用到 |
| sleep | threadLoop_sleeptime | 无音频需要处理,计算睡眠时间 |
核心变量
| 变量 | 取值 | 含义 |
|---|---|---|
| tracksToRemove | 需要被移除的Track,一旦所有的Track都被移除,则表明没有音频数据需要处理,那么线程会进入睡眠 | |
| sleepTime | 睡眠时间 | |
| standbyTime | 如果持续睡眠超出standbyTime,则会进入待机 | |
| mStandby | 表明当前是否为待机状态 | |
| mActiveTracks | 需要进行音频处理的Track,如果该Track已经播放完成或者被停止,则会被移入tracksToRemove | |
| mMixerStatus | MIXER_IDLE | Mixer状态,no active tracks,表明不需要混音,而是进入睡眠 |
| MIXER_TRACKS_ENABLED | Mixer状态,at least one active track,but no track has any data ready | |
| MIXER_TRACKS_READY | Mixer状态,at least one active track,and at least one track has data,表明可以进行混音 |
MixerStatus
| MixerStatus | Desc |
|---|---|
| MIXER_IDLE | 没有可用的活动track,表明不需要混音,而是进入睡眠 |
| MIXER_TRACKS_ENABLED | 至少有一个活动track,但是没有track有任何已经准备好的数据 |
| MIXER_TRACKS_READY | 至少有一个活动track同时至少有一个track中存在已经准备好的数据,表明可以进行混音 |
| MIXER_DRAIN_TRACK | 删除当前正在播放的track |
| MIXER_DRAIN_ALL | 完全耗尽硬件资源 |