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

广西企业网站建设国家建设材料检测网站

广西企业网站建设,国家建设材料检测网站,织梦网站内容自动更新,怎么做地下彩票网站文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵duck的实现流程AAOS 测试应用kitchensink焦点相关 前言 本文章的目标是首先了解Android中音频焦点的基本概念#xff0c;理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念… 文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵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 的构造有几个参数可以传递 attribute可以认为是音频播放的原因如 USAGE_MEDIA或者 USAGE_VOICE_COMMUNICATION等等建议为请求使用与音频/媒体播放相同的AudioAttributes。 如果未设置任何属性则会使用默认属性AudioAttributes.USAGE_MEDIA。AudioFocusChangeListener延时焦点注册的回调当延时焦点获取到的时候会回调到注册的函数中。是否强制降低音量当焦点被duck的时候 是否进行pause操作是否接受获取到焦点是延时焦点 当然还支持其他不同的参数设置这些参数设置是为了满足不同的场景来使用。比如在用户听音频书籍或播客时设备播放导航提示时用户希望音频暂停而不是降低音量因为同时听导航提示和语音内容会让人难以理解。因此系统不会自动对播放音频书籍或博客的应用程序进行降低音量。 如果应用程序想要需要暂停而不是降低音量可以使用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流程 首先在创建外部的audioPolicy时会设置AudioPolicyFocusListener注册外部的focus处理的handler到policy并设置IsAudioFocusPolicy 为true将外部的 audioPolicy注册到audioManger实际是注册到audioservice在audioservice中管理焦点请求的类是mMediaFocusControl。在有外部注册的AudioPolicyFocusListener的情况下所有外部通过audiomanger调用的requestfocus。都会在通过audioPolicy的notifyAudioFocusRequest来处理这边是一个handler 发送MSG_FOCUS_REQUEST消息 然后处理消息的地方将使用外部注册的mFocusListener.onAudioFocusRequest来处理。这个地方会回调caraudioservice 注册进去的mFocusHandler来处理mFocusHandler是实现了audiopolicy的AudioPolicyFocusListener的接口主要包括focus grant\loss\request\loss几种情况。carAudioService 中requestFoces实现的流程这个流程简单来说就是根据AAOS定义的交互矩阵和当前已经获取的焦点类型和当前请求焦点的类型 来判断 当前的这个焦点请求是可以获取还是拒绝。 交互矩阵 为了支持 AAOS 的需求系统会根据请求的 CarAudioContext 和当前焦点持有者的 CarAudioContext 之间的预定义交互来处理音频焦点请求。交互类型分以下三种独占、拒绝和并发。 独占交互 简单来说就是当前应用持有的焦点会被将要请求焦点的应用占有当前应用失去焦点。 拒绝交互 简单来说当前应用持有的焦点会一直保持其他应用无法获取当前的焦点。 并发交互 当前应用和其他应用可以同时拥有焦点AAOS特有的。 AAOS 最独特的地方就是并发交互。在这种交互模式下请求音频焦点的车载应用可与其他应用同时持有焦点。若要实现并发交互必须满足以下条件。即 传入的焦点请求的是 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。 当前焦点持有者未设置 setPauseWhenDucked(true)。 如果满足上述条件焦点请求将返回 AUDIOFOCUS_REQUEST_GRANTED而当前焦点持有者的焦点不会发生任何变化。不过如果当前焦点持有者选择接收闪避事件或在闪避时暂停则会失去焦点就像独占交互一样。 下表显示了由 CarAudioService 定义的交互矩阵。行内容和列内容分别表示当前焦点持有者和传入请求的 CarAudioContext。 举例如果音乐媒体应用目前正持有音频焦点而导航应用要请求获得焦点那么通过该矩阵便能知道这两个交互可以同时进行。 由于并发交互的缘故可能会存在多个焦点持有者。在这种情况下系统会将传入的焦点请求与当前的各个焦点持有者进行比较然后决定应用哪种交互。此时最保守的交互会胜出先是拒绝交互然后是独占交互最后是并发交互。 下表罗列了传入焦点请求的 CarAudioContext列与现有焦点持有者的上下文行之间的焦点交互。每个单元格表示两种上下文的预期交互类型其中 R 代表拒绝交互 E 代表独占交互 C 代表并发交互 duck的实现流程 duck指的是两个音频都在播放的时候其中一个音频主动的降低音量。 AOSP legacy模式 关键代码MediaFocusControl.java、FocusRequester.java 根据是不是有外部注册的focusPolicy, 使用的是框架的 还是外部的音频焦点请求策略。如果使用框架的在音频焦点失去的时候同时本应用的焦点类型是AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK那么就会调用frameworkHandleFocusLoss这里面会调用mFocusController.duckPlayers进行处理. 这其中会调用addDuck其中会调用applyVolumeShaper 对进行duck的音频设置曲线。在audiotrack的PlaybackThread 线程中 有外部的数据写入的时候 调用mixthread的prepareTracks_l 从volumeShaper这边获取音量这个音量是经过sharp处理的duck的时候 就是原来的0.2倍这个音量最后会乘上音频数据。 从而实现了音量的降低。 AAOS 动态路由 AAOS 动态路由目前的实现是所有的焦点的获取都是由外部的CarAudioService 进行处理的。其中在焦点类型为AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK当前请求焦点的播放需要正在播放的声音能够降低音量需要调用audioControl hal的onDevicesToDuckChange来降低音量。主要是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_TRANSIENTmusic音乐播放会完全暂停。其暂停的操作是通过audioservice发送focuschange的消息到请求焦点的回调中。
http://www.dnsts.com.cn/news/52158.html

相关文章:

  • 现在还有人用asp做网站wordpress移动下方的菜单
  • 南头手机公司网站建设宁波信誉好全网seo优化
  • 永久免费的网站服务器有哪些软件wordpress envato主题
  • 网站开发需要哪些人才暴富建站 网址
  • 以就业为导向的高职计算机专业网站设计海口云建站模板
  • 部队网站设计天津建站模板源码
  • 南昌网站系统南京城乡建设网站
  • 免费建站系统官网做网站用ui好还是ps
  • 营销型网站建设的特色电子商务网站的建设费用
  • 网站界面修改wordpress seo yoast
  • 网站怎么优化自己免费淘宝网页设计招聘
  • 关于怎么做网站涪陵网站建设 优帮云
  • 网址导航网站有哪些图片街景位置识别
  • 长春网站优化哪家好资阳抖音搜索优化
  • 上海网站改版方案wordpress群晖插件
  • 网站备案表不会写消防证怎么考取需要什么条件
  • 常见的网站布局结构织梦网站怎么做下载地址
  • 用dw做网站图片的基本尺寸seo自学
  • 主题资源网站建设步骤网络技术基础知识
  • 温州专业制作网站外贸退税流程及方法
  • 微信后台网站建设北京seo执行
  • 做设计参考的网站哪家云服务器性价比高
  • 中山网站建设案例十大奢侈品牌logo图片
  • 商城形式的网站需要多少钱威海建设局网站首页
  • 免费做期中考试的网站东莞百度seo在哪
  • 平台类网站建设价格表河南工程建设信息网站
  • 建网站卓上海建筑设计院招聘
  • 织梦网站做站群微商城 手机网站
  • 深圳南山 网站建设开发微信微网站建设
  • 企业网站规划书范文汕头站扩建效果图