当前位置: 首页 > news >正文

音频焦点 Android Audio Focus 进阶

旧焦点处理

示例调用链:

  1. requestAudioFocus() → propagateFocusLossFromGain_syncAf() → handleFocusLossFromGain()。
  2. 系统事件(如来电)→ 强制焦点变化 → handleFocusLossFromGain()。
函数
propagateFocusLossFromGain_syncAf 焦点持有者发生的焦点丢失通知
  1. 主要功能:
    • 当新的音频焦点请求到来时,通知当前所有焦点持有者可能发生的焦点丢失

    • 根据新的焦点增益类型决定哪些现有焦点持有者需要永久放弃焦点

    • 清理那些需要永久放弃焦点的持有者

  2. 关键处理逻辑:
    • 遍历当前焦点栈中的所有持有者,通知它们新的焦点变化

    • 对于多音频焦点模式,同样处理额外的焦点持有者列表

    • 收集所有需要永久放弃焦点的持有者并移除它们

  3. 参数作用:
    • focusGain: 新请求的焦点增益类型(如AUDIOFOCUS_GAIN等)

    • fr: 新的焦点请求者对象

    • forceDuck: 是否强制应用ducking效果(降低音量而非完全停止)

  4. 多音频焦点支持:
    • 当启用多音频焦点(mMultiAudioFocusEnabled)时,会额外处理mMultiAudioFocusList中的焦点持有者

/*** 当新的焦点请求到来时,传播相关的焦点丢失通知到当前焦点栈中的各个持有者。* 同时会移除那些收到永久性焦点丢失的栈条目。* * @param focusGain 新的焦点增益类型,将被添加到栈顶* @param fr 新的焦点请求者* @param forceDuck 是否强制应用 ducking 效果*/
@GuardedBy("mAudioFocusLock")
private void propagateFocusLossFromGain_syncAf(int focusGain, final FocusRequester fr,boolean forceDuck) {if (DEBUG) {Log.i(TAG, "propagateFocusLossFromGain_syncAf gain:" + focusGain);}// 创建一个列表来存储需要移除的客户端IDfinal List<String> clientsToRemove = new LinkedList<String>();// 遍历音频焦点栈,通知所有条目关于新的外部焦点增益if (!mFocusStack.empty()) {for (FocusRequester focusLoser : mFocusStack) {if (DEBUG) {Log.i(TAG, "propagateFocusLossFromGain_syncAf checking client:"+ focusLoser.getClientId());}// 处理焦点丢失,并判断是否是永久性丢失final boolean isDefinitiveLoss =focusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);if (isDefinitiveLoss) {// 如果是永久性丢失,则添加到移除列表clientsToRemove.add(focusLoser.getClientId());}}} else if (DEBUG) {Log.i(TAG, "propagateFocusLossFromGain_syncAf empty stack");}// 如果启用了多音频焦点且列表不为空,同样处理这些焦点持有者if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {for (FocusRequester multifocusLoser : mMultiAudioFocusList) {final boolean isDefinitiveLoss =multifocusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);if (isDefinitiveLoss) {clientsToRemove.add(multifocusLoser.getClientId());}
http://www.dtcms.com/a/302433.html

相关文章:

  • MongoDB的内存和核心数对于运行效率的影响
  • mongodb源代码分析createCollection命令创建Collection流程分析
  • 未授权访问漏洞靶场(redis,MongoDB,Memcached...)
  • MongoDB占用内存情况分析
  • jimfs:Java内存文件系统,脱离磁盘IO瓶颈利器
  • Java强制转换
  • TDengine 中 TDgpt 用于异常检测
  • 【AI绘画】Stable Diffusion 全面指南:安装、版本对比、功能解析与高级应用
  • selenium 特殊场景处理
  • 技术工具箱 |五、一个避免头文件重复引用的 Python 脚本
  • 【Java基础面试题】Java特点,八种基本数据类型
  • 提取apk中的各种语言翻译成表格,python脚本
  • 【图像处理】霍夫变换:霍夫变换原理、霍夫空间、霍夫直线、霍夫圆详解与代码示例
  • 小智源码分析——音频部分(二)
  • java设计模式 -【责任链模式】
  • 2025 DevOps工具生态全景解读:本土化服务与智能化演进成关键赛点
  • 电商项目DevOps一体化运维实战
  • Kafka 3.9.1的KRaft模式部署
  • AR远程协作系统设计:虚实融合场景下的设备维护操作指引界面
  • 【JSqlParser】sql解析器使用案例
  • 3. 卷积网络代码参数解读分析
  • 基于百度 iframe 框架与语音解析服务的数字人交互系统实现
  • 仓颉编程语言程序基本结构
  • dapp前端⾯试题
  • 数据库审计及安全管理的解决方案
  • OpenCV(05)直方图均衡化,模板匹配,霍夫变换,图像亮度变换,形态学变换
  • 虚拟地址空间:从概念到内存管理的底层逻辑
  • 572. 另一棵树的子树
  • PyTorch武侠演义 第二卷:高塔中的注意力秘境 第1章:残卷指引
  • 11. 若依参数验证 Validated