AOSP 音频焦点接口调研

本文详细解析了AndroidOpenSourceProject(AOSP)中AudioManager类的requestAudioFocus和abandonAudioFocus方法,以及它们在请求和释放音频焦点时的内部时序逻辑。重点介绍了如何使用AudioFocusRequest和监听器进行音频焦点管理,以及系统应用如何操作这些API。
摘要由CSDN通过智能技术生成

一 AOSP AudioMnager.java 中对外暴露的API

1 申请音频焦点

 public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)

    示例:

mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

public int requestAudioFocus(@NonNull AudioFocusRequest focusRequest) 

    示例:

mFocusRequest = new AudioFocusRequest

                     .Builder(focusRequest)

                     .setAudioAttributes(mAttrib)

                     .setOnAudioFocusChangeListener(mFocusListener)

                     .setForceDucking(false)

                     .setWillPauseWhenDucked(false)

                     .setAcceptsDelayedFocusGain(false)

                     .build();

ret = mAudioManager.requestAudioFocus(mFocusRequest);

其余这种都是隐藏的只能系统应用调用的API

2 释放音频焦点

public int abandonAudioFocusRequest(@NonNull AudioFocusRequest focusRequest)

    示例:mAudioManager.abandonAudioFocusRequest(mFocusRequest)

public int abandonAudioFocus(OnAudioFocusChangeListener l)

    示例:mAudioManager.abandonAudioFocus(mAudioFocusListener)

二 AOSP AudioManager requestAudioFocus /abandonAudioFocus 时序图

接口一 :

public int requestAudioFocus(@NonNull AudioFocusRequest focusRequest) 

  public int requestAudioFocus(@NonNull AudioFocusRequest afr, @Nullable AudioPolicy ap)

    public void registerAudioFocusRequest(@NonNull AudioFocusRequest afr)

      mAudioFocusIdListenerMap.put(key, fri); 将afr的listener加入map

    status = service.requestAudioFocus(afr.getAudioAttributes(),//调用的音频attribute场景

               afr.getFocusGain(),//申请的焦点类型

               mICallBack,//应用侧的binder线层

               mAudioFocusDispatcher,//这个用来指示dispatchAudioFocusChange焦点变化的回调

               clientId,//一般是应用的标识android.media.AudioManager@9d3bd79com.ximalaya.ting.android.opensdk.player.service.ad$3@778babe 

               getContext().getOpPackageName() /* package name */, //应用包名

   afr.getFlags(),//指示是否延迟获取焦点的标记

               ap != null ? ap.cb() : null,//是否有额外的policy

               sdk);//sdk版本标记

说明:AOSP的应用requestAudioFocus,流程中会遍历已有的mFocusStack栈中的clinetid,找到相同的clientId先remove,然后在回调listenner轮询通知之前的client,焦点状态的变化,最终将这个clientid 放入栈顶。abandonAudioFocus  与之相反。

ps:上图是使用drawio 画的,导出为图片,然后附上去的,因为比较大,所以模糊,需要仔细看的,可以另存为,然后电脑上打开,放大看,应该可以看到细节

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值