到底执行哪个线程的threadLoop?我记得我们是根据output句柄来查找线程的。 看看openOutput的实行,真正的线程对象创建是在那儿。 nt AudioFlinger::openOutput(uint32_t *pDevices, { //如果flags没有设置直接输出标准,或者format不是16bit,或者声道数不是2立体声 //则创建DirectOutputThread。 } else { 1. MixerThread 非常重要的工作线程,我们看看它的构造函数。 AudioFlinger::MixerThread::MixerThread(const sp& audioFlinger, AudioStreamOut* output, int id) { mType = PlaybackThread::MIXER; //混音器对象,传进去的两个参数时基类ThreadBase的,都为0 //这个对象巨复杂,最终混音的数据都由它生成,以后再说... 2. AT调用start 此时,AT得到IAudioTrack对象后,调用start函数。 status_t AudioFlinger::TrackHandle::start() { } //果然,自己又不干活,交给mTrack了,这个是PlayintThread createTrack_l得到的Track对象 status_t AudioFlinger::PlaybackThread::Track::start() { sp thread = mThread.promote(); //这个Thread就是调用createTrack_l的那个thread对象,这里是MixerThread |