AAOS 音频焦点请求

文章目录

      • 前言
      • 基本概念
      • 提供给应用来获取音频焦点的api
      • AAOS中的音频焦点管理
      • 交互矩阵
      • duck的实现流程
      • AAOS 测试应用kitchensink焦点相关

前言

本文章的目标是首先了解Android中音频焦点的基本概念,理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念,理解其实现焦点管理的流程。

基本概念

  • 音频焦点的目标是 是确保在多个应用程序同时播放音频时,用户能够顺利地听到他们想要听的声音,并防止多个应用同时混合输出声音,造成用户困扰。也就是每次要去播放某个声音的时候 先去请求焦点,请求到焦点 后才能开始播放。

  • 音频焦点是在Android API 8中引入的一个概念。它用于表示用户一次只能专注于一个音频流,比如听音乐或播客,但不能同时进行。在某些情况下,多个音频流可以同时播放,但用户只会真正聆听(专注于)其中一个,而其他音频在后台播放。例如,在导航提示播放时,同时降低音量播放音乐。当应用程序请求音频焦点时,它表示希望“拥有”音频焦点来播放音频。

提供给应用来获取音频焦点的api

android 的audioManager 提供了requestAudioFocus 的接口来获取焦点

        AudioFocusRequest mFocusRequest = new AudioFocusRequest.Builder(focusRequest)
                    .setAudioAttributes(mAttrib)
                    .setOnAudioFocusChangeListener(mFocusListener)
                    .setForceDucking(false)
                    .setWillPauseWhenDucked(false)
                    .setAcceptsDelayedFocusGain(false)
                    .build();
            ret = mAudioManager.requestAudioFocus(mFocusRequest);

mFocusRequest 的构造有几个参数可以传递

  1. attribute可以认为是音频播放的原因如 USAGE_MEDIA或者 USAGE_VOICE_COMMUNICATION等等建议为请求使用与音频/媒体播放相同的AudioAttributes。 如果未设置任何属性,则会使用默认属性AudioAttributes.USAGE_MEDIA。
  2. AudioFocusChangeListener延时焦点注册的回调,当延时焦点获取到的时候会回调到注册的函数中。
  3. 是否强制降低音量
  4. 当焦点被duck的时候 是否进行pause操作
  5. 是否接受获取到焦点是延时焦点

当然还支持其他不同的参数设置,这些参数设置是为了满足不同的场景来使用。比如:在用户听音频书籍或播客时,设备播放导航提示时,用户希望音频暂停而不是降低音量,因为同时听导航提示和语音内容会让人难以理解。因此,系统不会自动对播放音频书籍或博客的应用程序进行降低音量。 如果应用程序想要需要暂停而不是降低音量,可以使用Builder.setWillPauseWhenDucked(true) 设置之后 在其他应用占用了焦点后框架不会自动为应用降低音量而是回调到应用注册的函数中。

不同类型的焦点请求:

  • AudioManager.AUDIOFOCUS_GAIN:表示您的应用程序现在是用户正在听取的唯一音频源。音频播放的持续时间未知,可能非常长:在用户完成与您的应用程序的交互后,不希望其他音频流继续播放。这种焦点通常用于音乐播放、游戏或视频播放器。
  • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:用于在应用程序暂时从当前拥有者那里获取焦点,但用户期望一旦应用程序不再需要音频焦点时,播放会回到之前的状态。例如,用于播放闹钟或进行VoIP通话。播放是有限的:闹钟会超时或被取消,VoIP通话有开始和结束。当其中任何事件结束时,如果用户在开始时正在听音乐,则用户希望音乐恢复,而不希望同时听两者。
  • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:这种焦点请求类型与AUDIOFOCUS_GAIN_TRANSIENT相似,都是临时性的焦点请求。但其还表示在拥有焦点的同时,允许另一个应用以降低的音量(“ducked”)继续播放。例如,在播放导航提示或通知时,允许音乐继续播放,但音量不足以妨碍用户听清导航提示。典型的"ducked"应用程序的衰减率为0.2f(或-14dB),例如播放时可以使用**MediaPlayer.setVolume(0.2f)**来实现。
  • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:也用于临时请求,但还表示应用程序希望设备在此期间不播放任何其他内容。这通常用于音频录制或语音识别等情况,在此期间不希望系统播放通知等内容。

AAOS中的音频焦点管理

AAOS请求处理是CarService 这边处理,所谓的处理 就是根据传递进来的请求参数 和目前持有的场景来决定 是否让这个焦点请求成功。 这个具体的规则是基于交互矩阵来实现的。具体来所通过重写 AudioPolicy的相关回调 来截获原来的audioRequest,然后处理完成后设置到AudioManger 中。主要是重写下面的那些实现。

 public static abstract class AudioPolicyFocusListener {
        public void onAudioFocusGrant(AudioFocusInfo afi, int requestResult) {}
        public void onAudioFocusLoss(AudioFocusInfo afi, boolean wasNotified) {}
        /**
         * Called whenever an application requests audio focus.
         * Only ever called if the {@link AudioPolicy} was built with
         * {@link AudioPolicy.Builder#setIsAudioFocusPolicy(boolean)} set to {@code true}.
         * @param afi information about the focus request and the requester
         * @param requestResult deprecated after the addition of
         *     {@link AudioManager#setFocusRequestResult(AudioFocusInfo, int, AudioPolicy)}
         *     in Android P, always equal to {@link #AUDIOFOCUS_REQUEST_GRANTED}.
         */
        public void onAudioFocusRequest(AudioFocusInfo afi, int requestResult) {}
        /**
         * Called whenever an application abandons audio focus.
         * Only ever called if the {@link AudioPolicy} was built with
         * {@link AudioPolicy.Builder#setIsAudioFocusPolicy(boolean)} set to {@code true}.
         * @param afi information about the focus request being abandoned and the original
         *     requester.
         */
        public void onAudioFocusAbandon(AudioFocusInfo afi) {}
    }

AAOS中的音频焦点管理具体外部设置focus流程:

  1. 首先在创建外部的audioPolicy时,会设置AudioPolicyFocusListener注册外部的focus处理的handler到policy并设置IsAudioFocusPolicy 为true将外部的 audioPolicy注册到audioManger,实际是注册到audioservice,
  2. 在audioservice中管理焦点请求的类是mMediaFocusControl。在有外部注册的AudioPolicyFocusListener的情况下,所有外部通过audiomanger调用的requestfocus。都会在通过audioPolicy的notifyAudioFocusRequest来处理,这边是一个handler 发送MSG_FOCUS_REQUEST消息 然后处理消息的地方将使用外部注册的mFocusListener.onAudioFocusRequest来处理。这个地方会回调caraudioservice 注册进去的mFocusHandler来处理
  3. mFocusHandler是实现了audiopolicy的AudioPolicyFocusListener的接口主要包括focus grant\loss\request\loss几种情况。
  4. carAudioService 中requestFoces实现的流程,这个流程简单来说就是根据AAOS定义的交互矩阵和当前已经获取的焦点类型和当前请求焦点的类型 来判断 当前的这个焦点请求是可以获取还是拒绝。

交互矩阵

为了支持 AAOS 的需求,系统会根据请求的 CarAudioContext 和当前焦点持有者的 CarAudioContext 之间的预定义交互来处理音频焦点请求。交互类型分以下三种:独占、拒绝和并发。

  • 独占交互

    简单来说就是当前应用持有的焦点会被将要请求焦点的应用占有,当前应用失去焦点。

  • 拒绝交互

    简单来说当前应用持有的焦点会一直保持,其他应用无法获取当前的焦点。

  • 并发交互

    当前应用和其他应用可以同时拥有焦点,AAOS特有的。

    AAOS 最独特的地方就是并发交互。在这种交互模式下,请求音频焦点的车载应用可与其他应用同时持有焦点。若要实现并发交互,必须满足以下条件。即:

    1. 传入的焦点请求的是 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

    2. 当前焦点持有者未设置 setPauseWhenDucked(true)

      如果满足上述条件,焦点请求将返回 AUDIOFOCUS_REQUEST_GRANTED,而当前焦点持有者的焦点不会发生任何变化。不过,如果当前焦点持有者选择接收闪避事件或在闪避时暂停,则会失去焦点,就像独占交互一样。

下表显示了由 CarAudioService 定义的交互矩阵。行内容和列内容分别表示当前焦点持有者和传入请求的 CarAudioContext

举例:如果音乐媒体应用目前正持有音频焦点,而导航应用要请求获得焦点,那么通过该矩阵便能知道,这两个交互可以同时进行。

由于并发交互的缘故,可能会存在多个焦点持有者。在这种情况下,系统会将传入的焦点请求与当前的各个焦点持有者进行比较,然后决定应用哪种交互。此时,最保守的交互会胜出(先是拒绝交互,然后是独占交互,最后是并发交互)。

下表罗列了传入焦点请求的 CarAudioContext(列)与现有焦点持有者的上下文(行)之间的焦点交互。每个单元格表示两种上下文的预期交互类型,其中:

  • R 代表拒绝交互

  • E 代表独占交互

  • C 代表并发交互

在这里插入图片描述

duck的实现流程

duck指的是两个音频都在播放的时候,其中一个音频主动的降低音量。

  • AOSP legacy模式

    关键代码MediaFocusControl.java、FocusRequester.java

    1. 根据是不是有外部注册的focusPolicy, 使用的是框架的 还是外部的音频焦点请求策略。如果使用框架的,在音频焦点失去的时候,同时本应用的焦点类型是AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK那么就会调用frameworkHandleFocusLoss,这里面会调用mFocusController.duckPlayers进行处理. 这其中会调用addDuck其中会调用applyVolumeShaper, 对进行duck的音频设置曲线。
    2. 在audiotrack的PlaybackThread 线程中 有外部的数据写入的时候 调用mixthread的prepareTracks_l 从volumeShaper这边获取音量,这个音量是经过sharp处理的,duck的时候 就是原来的0.2倍,这个音量最后会乘上音频数据。 从而实现了音量的降低。
  • AAOS 动态路由

    1. AAOS 动态路由目前的实现是所有的焦点的获取都是由外部的CarAudioService 进行处理的。其中在焦点类型为AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK(当前请求焦点的播放需要正在播放的声音能够降低音量)需要调用audioControl hal的onDevicesToDuckChange来降低音量。
    2. 主要是onDevicesToDuckChange起作用, 在carAudioService request policy中会回调这个, 这个调用到AudioControl hal。hal 中调用 set_device_address_is_ducked 这个是属于audio_hw 也就是audio hal 中,在这里面是设置具体的哪个address为duck,设置为duck的 在后面往这边写数据的时候会乘上一个值。相当于是减小音量了。

AAOS 测试应用kitchensink焦点相关

  • 代码位置:packages\services\Car\tests\EmbeddedKitchenSinkApp\src\com\google\android\car\kitchensink\audio\AudioTestFragment.java
  • 首先进行音乐music播放,这个播放是循环的, 然后在在播放过程中可以选择Nav 导航播放 USAGE_ASSISTANCE_NAVIGATION_GUIDANCE ,或者 Vr USAGE_ASSISTANT播放这两个获取的焦点不同。
  • Nav获取的焦点是AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,也就是music播放还是可以获取到焦点播放不会暂停,但是会降低音量。Vr获取到的是 AUDIOFOCUS_GAIN_TRANSIENT,music音乐播放会完全暂停。其暂停的操作是通过audioservice发送focuschange的消息到请求焦点的回调中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/53130.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ns3.39编译时报错与解决_包括netanim-3.109(NetAnim)

ns(来源于“network simulator”)是一系列离散事件网络模拟器,包括ns-1、ns-2和ns-3。他们主要应用于研究和教学。ns-3是自由软件,以GNU GPLv2协议分发。​——百度百科 熟悉ns的朋友都知道,使用build.py编译时会先编…

线性代数的学习和整理2:线性代数的基础知识(整理ing)

目录 0 写在前面的话 网上推荐的线性代数的课程 1 线性代数和矩阵的各种概念 1.1 各种逻辑图 2 关于线性代数入门的各种灵魂发问 2.1 什么是线性,什么是线性相关 ? 为什么叫线性变换? 为什么叫线性代数? 2.2 线性代数是人造…

搞活系列-Java NIO之偏偏不用buffer.flip()会出现什么问题?

最近看博客又看到了Java NIO相关的博客,其中有讲解NIO和传统IO关于文件复制的文章,看到了如下的代码: /**** channel用例* 基于channel的文件复制*/Testpublic void fileCopyByChannel(){try {FileInputStream fileInputStream new FileInpu…

黑苹果如何在macOS Sonoma中驱动博通网卡

准备资源(百度:黑果魏叔 下载) 资源包中包含:AirportBrcmFixup.kext/IOSkywalkFamily.kext/IO80211FamilyLegacy.kext/OpenCore-Patcher 使用方法: 1.将 csr-active-config 设置为 03080000 全选代码 复制 2.在 …

如何进行软件回归测试

什么是软件回归测试,如何进行回归测试,进行回归测试时有哪些常用的方法? 回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误的一种测试方法。回归测试是指重复以前的全部或部分的相同功能…

2,认识N(logN)的排序【p3】

认识N( logN} 的排序 2.1归并排序2.1.1代码实现归并排序2.1.1.1自己c实现归并排序2.1.1.2gptc实现归并排序2.1.1.3总结2.1.1.4比较行为 2.1.2归并排序使用master公式2.1.3归并排序的扩展2.1.3.1小和问题2.1.3.2逆序对问题 2.2快排、荷兰国旗问题2.2.1问题一2.2.2问题二(荷兰国旗…

数电基础知识学习笔记

文章目录: 一:逻辑门 1.逻辑门电路的分类 1.1 按逻辑(逻辑门) 1.1.1 逻辑定义 1.1.2 常见数字电路相关符号 1.1.3 电路图表示 1.1.4 逻辑门电路图像符号 1.2 按电路结构 1.3 按功能特点 2.高低电平的含义 3.常见的门…

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化,可实现数据库同步(一主一从(双机备份),一主多从(总部数据库,工厂1,工厂2,工厂数据合并到总部数据)) sqlserver 启用数据库…

uni-app在小米手机上运行【步骤细节】

注意细节重点: 1.手机使用数据线与电脑连接,手机连接模式必须是传输文件模式 2.手机必须打开开发者模式 3.打开开发者模式后,仔细浏览并调整USB调试权限,重点打开USB是否允许安装按钮!!! 操作步…

黄东旭:The Future of Database,掀开 TiDB Serverless 的引擎盖

在 PingCAP 用户峰会 2023 上, PingCAP 联合创始人兼 CTO 黄东旭 分享了“The Future of Database”为主题的演讲, 介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念。黄东旭 通过分享个人经历和示例,强调了数据库的服务化而非服务化…

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试 上节学习了FatFs文件系统的相关知识,这节内容继续学习在STM32上如何移植FatFs文件系统,并且实现文件的创建、读、写与删除等功能。各位看官觉得还行的话点点赞&#xff0c…

Spring Tool Suite 4

参考:Spring tool suite4 安装及配置_springtoolsuite4_猿界零零七的博客-CSDN博客 下载:Spring | Tools 将下载的JAR进行解压两次,直至解压出contents中的sts 双击启动 第一次打开需要指定工作区文件夹 配置Maven的config 安装插件

(笔记)Layout知识点汇总(积累量变)

Layout知识点汇总 布线1、电容电阻中间不要穿线2、线宽不要超过焊盘,引出后加粗 拐角1、layout:钝角走线 线宽间距1、注意和差分信号线的距离 焊盘1、焊盘中心出线2、线连接到焊盘中心 布局1、时钟线包地处理2、音频的左右声道,加粗&#xff…

【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)

文章目录 一、背景二、方法2.1 对新类别的定位 Localization2.2 使用 cropped regions 进行开放词汇检测2.3 ViLD 三、效果 论文:Open-vocabulary Object Detection via Vision and Language Knowledge Distillation 代码:https://github.com/tensorflo…

C语言每日一题之整数求二进制1的个数

今天分享一道题目&#xff0c;用三种方法来求解 二进制1的个数 方法1 我们的十进制除10和取余数就可以得到我们每一位的数字&#xff0c;那我们的二进制也可 以 #include<stdio.h> int num_find_1(unsigned int n) {int count 0;while (n){if (1 n % 2){count;}n / 2…

element中tabs组件,click事件点击拿到当前item的所有数据

话不多说&#xff0c;直接上代码&#xff1a; 添加一个:value&#xff0c;然后在用JSON.stringify(item)转一下就可以了&#xff0c;这样就会存在$attrs.value这个里面了。 接着在点击事件里面获取使用el.$attrs.value&#xff0c;注意这里在拿到这个值时&#xff0c;再用JSON…

事务的隔离级别以及传播机制的详细讲解

1.为什么需要事务&#xff1f; 事务就是将一组操作封装成一个执行单元&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败 ⽐如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元第⼆步操作&#xff1a;B 账户 100 元 如果没有事务&#xff0c;第⼀…

SQL-每日一题【1173. 即时食物配送 I】

题目 配送表: Delivery 如果顾客期望的配送日期和下单日期相同&#xff0c;则该订单称为 「即时订单」&#xff0c;否则称为「计划订单」。 查询即时订单所占的百分比&#xff0c; 保留两位小数。 查询结果如下所示。 示例 1: 解题思路 1.题目要求我们查询出顾客期望的配送日…

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-LS…

Ubuntu20.04安装Autoware.universe并与Awsim联调

文章目录 引言一、安装依赖1.1 安装git1.2 克隆Autoware到本地1.3 自动安装相关依赖1.4 安装显卡驱动1.5 安装ROS2 Galactic1.6 安装ros2_dev_tools1.7 安装rmw_implementation1.8 安装pacmod1.9 安装autoware_core1.10 安装autoware universe dependencies1.11 安装pre_commit…
最新文章