永发信息网

android 播放音乐时为什么用不到混音线程mixerthread

答案:1  悬赏:20  手机版
解决时间 2021-02-12 04:58
  • 提问者网友:謫仙
  • 2021-02-11 14:24
android 播放音乐时为什么用不到混音线程mixerthread
最佳答案
  • 五星知识达人网友:迷人又混蛋
  • 2021-02-11 15:51
MixerThread是按照音频输出的核心部分,所有Android的音频都需要经过MixerThread进行混音后再输出到音频设备。
MixerThread的继承关系如下:
MixerThread--->PlaybackThread--->ThreadBase--->Thread
在PlaybackThread中,重写了Thread的threadLoop,onFirstRef等方法,因此在调用MixerThread这些方法时,实际上就是调用了PlaybackThread的方法。
1. onFirstRef
在getOutput的时候,我们创建了一个MixerThread对象,由于这个对象继承于Thread,因此在创建对象时,会调用它的onFirstRef函数。
void AudioFlinger::PlaybackThread::onFirstRef(){ run(mName, ANDROID_PRIORITY_URGENT_AUDIO);}
在该方法内部,调用了run,即开始运行threadLoop。也就是说,其实在new MixerThread的时候就已经开始启动PlaybackThread::threadLoop。
2. threadLoop
在分析threadLoop之前,我们先来了解MixerThread中的几种Audio操作。
在Threads.cpp内有几个threadLoop_xxx方法,这些方法就分别代表不同的Audio操作:
操作 方法 功能 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,表明不需要混音,而是进入睡眠
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯