Android音频系统之AudioFlinger(三)

本文详细介绍了Android音频系统中的PlaybackThread主循环,包括配置事件处理、standby判断、数据准备、混合操作、休眠时间计算、数据写入以及Track移除等关键步骤,揭示了AudioFlinger如何确保音频播放的流畅性和避免BufferUnderrun问题。
摘要由CSDN通过智能技术生成

1.1.1 PlaybackThread的循环主体

当一个PlaybackThread进入主循环后(threadLoop),音频事务就正式开启了。仔细观察的话,我们会发现这个循环中会不断地调用以“threadLoop_”开头的若干接口,比如threadLoop_mix、threadLoop_sleepTime、threadLoop_standby等等。以这样的前缀开头,是因为这些函数都是在threadLoop这个主体里被调用的,可以说代表了这个PlaybackThread所需要完成的各个操作步骤。

从上一小节可以了解到,当程序执行到PlaybackThread::onFirstRef时会去真正启动一个线程承载运行threadLoop,接下来我们具体看下这个循环体的处理流程。

bool AudioFlinger::PlaybackThread::threadLoop()

{ …        

    while (!exitPending())/*Step1.*/

    {   …    

        processConfigEvents();/*Step 2. */

        { /*把这段代码框起来的目的是限制自动锁变量_l的生命期,

           从而灵活地实现了自动锁的控制范围*/

          Mutex::Autolock  _l(mLock);

                                 …

          /*Step 3. Standby判断*/

          if(CC_UNLIKELY((!mActiveTracks.size() && systemTime() > standbyTime)|| mSuspended> 0)) {                       

                if (!mStandby){

                   threadLoop_standby();//调用设备的

                    mStandby =true;

                   mBytesWritten = 0;

                }

                                                 …

           }

                                  /*Step 4.*/

            mMixerStatus =prepareTracks_l(&tracksToRemove);

                                   …

        }

                                /*Step5.*/

        if(CC_LIKELY(mMixerStatus == MIXER_TRACKS_READY)) {

            threadLoop_mix();

        } else {

           threadLoop_sleepTime();

        }

                   …

        /*Step 6.*/

        if (sleepTime == 0) {

           threadLoop_write(); //不需要休眠,有数据要写

                                   …

            mStandby = false;

        } else {

            usleep(sleepTime);//进入休眠,时间长短是sleepTime

        }

                    /*Step 7.*/

        threadLoop_removeTracks(tracksToRemove);//移除相关Track

       tracksToRemove.clear();…

    }//while (!exitPending())结束

                …

    releaseWakeLock();

    return false;

}

Step1@ PlaybackThread::threadLoop, 循环的条件是!exitPending()为true。这个函数属于Thread类,它主要通过判断内部变量mExitP

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值