基于Android O平台Audio Focus分析(主要结合Car)(下)

本文深入探讨了Android O在Car平台上的Audio Focus实现,从CarAudioService的mFocusListener和mFocusHandler入手,分析了handleCarFocusRequestAndResponseLocked、reevaluateCarAudioFocusAndSendFocusLocked等关键函数,以及车机端如何响应Audio Focus请求和变化。重点讨论了VehicleAudioFocusIndex及其在AudioHalService和CarAudioService中的应用。
摘要由CSDN通过智能技术生成
Car相关

经过一番查找,只有这个地方设置了mFocusListener,我们就拿Car来做研究吧

packages/services/Car/service/src/com/android/car/CarAudioService.java

public void init() {
  
    AudioPolicy.Builder builder = new AudioPolicy.Builder(mContext);
    ...
        builder.setAudioPolicyFocusListener(mSystemFocusListener);
    ...
}

mSystemFocusListener

//SystemFocusListener是CarAudioService的内部类
private class SystemFocusListener extends AudioPolicyFocusListener {
  
  @Override
  public void onAudioFocusGrant(AudioFocusInfo afi, int requestResult) {
  
    ...
      if (requestResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
  
                synchronized (mLock) {
  
                    mPendingFocusChanges.addFirst(afi);
                }
                mFocusHandler.handleAndroidFocusChange();
            }
    ...
  }
  
  @Override
        public void onAudioFocusLoss(AudioFocusInfo afi, boolean wasNotified) {
  
            //理由没看懂,总之就是这个地方不管不顾不处理回调这种做法安全
            // ignore loss as tracking gain is enough. At least bottom listener will be
            // always there and getting focus grant. So it is safe to ignore this here.
        }
}

mFocusHandler定义:

mFocusHandlerThread = new HandlerThread(CarLog.TAG_AUDIO);
mFocusHandler = new CarAudioFocusChangeHandler(mFocusHandlerThread.getLooper());

mFocusHandler.handleAndroidFocusChange

private void handleAndroidFocusChange() {
  
            cancelFocusReleaseRequest();
            Message msg = obtainMessage(MSG_ANDROID_FOCUS_CHANGE);
            sendMessage(msg);
        }
case MSG_ANDROID_FOCUS_CHANGE:
                    doHandleAndroidFocusChange(false /* triggeredByStreamChange */);
                    break;

又碰到一个比较复杂的函数doHandleAndroidFocusChange@CarAudioService

private void doHandleAndroidFocusChange(boolean triggeredByStreamChange) {
  
    ...
        //前面onAudioFocusGrant@SystemFocusListener的时候进行的
        //mPendingFocusChanges.addFirst(afi);
        newTopInfo = mPendingFocusChanges.getFirst();
            //这是一个LinkedList。不知道为什么getFirst之后就要马上清掉
            mPendingFocusChanges.clear();
        ...
        if (newTopInfo != null) {
     
               if (newTopInfo.getGainRequest() ==
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) {
  
                    //新的request是获得暂时的可以duck的
                    //让之前的老大降级成副手
                    mSecondaryFocusInfo = mPrimaryFocusInfo;
                } else {
  
                    //否则就不设置副手
                    mSe
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值