Android 14 CarAudioService

文章目录

      • 新功能
      • AudioMirring
      • oemCarService

新功能

  • AudioMirring

简单的说就是两个bus输出的是同一个音频数据。
构建的流程是: 一个输入src的bus,和两个输出dst的bus。 通过setParamter 设置到hal。 hal解析这些参数,将输入bus
的音频数据拷贝输出到两个dst的bus。

  • CarOemService

可以外部注册对应的carAudioFocusService、CarAudioVolumeService、CarAudioDuckingService.
分别为焦点请求,音量设置、音频闪避。
也就是oem 根据自己的需要去控制这三个方面的音频功能。
当有定义这三个service的时候,相应的处理会调用到对应的服务。 调用过程是基于binder 的 是需要IPC调用。
这一部处理是在java层处理。

  • 对于按键的处理

新增了CarInputService, 可以通过监听不同的InputService 来处理按键。 补齐了12上面无法多屏幕按键控制。

这个按键需要OEM 自己定义 通过vhal hal 上报到CarInputService。 然后audio这边去监听相关的按键事件。
vehicle hal中可以携带三个参数 是int类型的数组
第一个参数 是按键事件的代码 1001 - 1007
第二个是屏幕 可以主屏副屏等等。音量调节的时候 可以从这个display ID 获取zoneID。

AudioMirring

  • 如何配置mirror的区域
    • mirror的工作原理

首先在配置文件中添加的配置为, 在carAudioService 中进行标签的解析,然后设置mirror的device。

    <mirroringDevices><mirroringDevice address="mirror_bus_device_1"/><mirroringDevice address="mirror_bus_device_2"/></mirroringDevices>
  • 基本的原理:
    在CarService 这一层是构造类似下面这样的keyvalue序列,然后这个序列通过AudioManager的setParameters给到hal。
    mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20.

    而上述的keyValue 序列是要求hal层 实现所有写入到mirroring_src bus的数据 都要拷贝到bus_10 和bus_20进行输出。其中bus_10 和 bus_20是需要在zondID 中进行定义的,是已经有的输出设备。

详细来说: 首先解析xml中mirroringDevice,这个device 同时也需要在audio_policy_configuration.xml中定义。 跟正常的device address一样。在CarService 中

  1. 判断是不是支持mirror(通过判断mirroringDevice是不是至少有一个存在),支持的话,构造一个mix,将这个mix添加到audioPolicy当中。
  2. 构造mix,这个mix 的device是mirroringDevice,attribute是music。现有只支持music类型共享。mix添加到audiopolicy 说明 后续的音频
    数据通过mix线程都会写到mirror的device address。
  3. 构造parameter 参数列表(怎么构建的?)外部的接口是
    enableMirrorForAudioZones,传递的参数是需要mirror的zone id列表。carAudioService 中会经过一系列的判断确认zoneID可用时,
    通过zoneId来获取USAGE_MEDIA的DeviceAddress。
    然后将mirrorDevice 和 获取到的DeviceAddress 组成paramter传递给hal。
  • Hal 层的实现

    在有paramete的情况下。解析获取mirror src dst的address。 但不是打开的src的address,而是打开dst的address。
    然后将数据分别写入到这两个地址中。mirror的src相当于一个中转的地址。

oemCarService

  • oemCarService的作用

使用一个app的service 替换原生的focusrequest、duck和volume。

    private OemCarAudioFocusResult evaluateFocusRequestLocked(FocusEntry replacedCurrentEntry,AudioFocusInfo audioFocusInfo) {return isExternalFocusEnabled()? evaluateFocusRequestExternallyLocked(audioFocusInfo, replacedCurrentEntry) :evaluateFocusRequestInternallyLocked(audioFocusInfo, replacedCurrentEntry);}
  • 如何启用

配置应用的的名字。比如想用 test的这个com.android.car.oemcarservice.testapp.OemCarServiceImpl

将名字config 到xml,然后编译这个应用 push到system/priv-app目录底下。

String componentName = res.getString(R.string.config_oemCarService);Intent intent = (new Intent()).setComponent(ComponentName.unflattenFromString(mComponentName));Slogf.i(TAG, "Binding to Oem Service with intent: %s", intent);mHandlerThread = CarServiceUtils.getHandlerThread("car_oem_service");mHandler = handler == null ? new Handler(mHandlerThread.getLooper()) : handler;mIsOemServiceBound = mContext.bindServiceAsUser(intent, mCarOemServiceConnection,Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM);
    private boolean isExternalFocusEnabled() {CarOemProxyService proxy = CarLocalServices.getService(CarOemProxyService.class);if (!proxy.isOemServiceEnabled()) {return false;}if (!proxy.isOemServiceReady()) {logFocusEvent("Focus was called but OEM service is not yet ready.");return false;}return proxy.getCarOemAudioFocusService() != null;}
  • 如何调用
    bindServiceAsUser的作用是什么?https://bbs.huaweicloud.com/blogs/325746

    • 客户端服务端都继承.stub.

    • 服务端实现具体的AIDL接口,主要是下面的这些接口。

          IOemCarAudioFocusService getOemAudioFocusService();IOemCarAudioVolumeService getOemAudioVolumeService();IOemCarAudioDuckingService getOemAudioDuckingService();
      
    • 在配置config中国oemCarService 后,现有的实现是packages/services/Car/tests/OemCarServiceTestApp/src/com/android/car/oemcarservice/testapp/OemCarServiceImpl.java。

    • 客户端获取服务, 通过package的名字构造一个intent,然后bindServiceAsUser。发送intent
      在onServiceConnected 通过binder获取到远程的mOemCarService。外部通过getService
      的方式获取CarOemProxyService的服务。 然后通过这个服务调用HIDL的接口。

         CarOemProxyService proxy = CarLocalServices.getService(CarOemProxyService.class);public void onServiceConnected(ComponentName componentName, IBinder iBinder) {Slogf.i(TAG, "onServiceConnected: %s, %s", componentName, iBinder);synchronized (mLock) {if (mOemCarService == IOemCarService.Stub.asInterface(iBinder)) {return; // already connected.}Slogf.i(TAG, "car oem service binder changed, was %s now: %s",mOemCarService, iBinder);mOemCarService = IOemCarService.Stub.asInterface(iBinder);Slogf.i(TAG, "**CarOemService connected**");mIsOemServiceConnected = true;mLock.notifyAll();}}
  • 如何配置
  1. 在config.xml 中配置componet name
    com.android.car.oemcarservice.testapp/com.android.car.oemcarservice.testapp.OemCarServiceImpl
    componet name 根据app的package和service name一起组成的。
    形式为package name/service name 这两个名字可以从源码的AndroidManifest.xml中获取到。

  2. 编译carService 和 test app push 到system/priv_app即可。

    <!-- This is the component name for the OEM customization service. OEM can choose to implementthis service to customize car service behavior for different policies. If OEMs choose toimplement it, they have to implement a service extending OemCarService exposed by car-lib,and implement the needed component services.If the component name is invalid, CarService would not connect to any OEM service.Component name can not be a third party package. It should be pre-installed --><string name="config_oemCarService" translatable="false">com.android.car.oemcarservice.testapp/com.android.car.oemcarservice.testapp.OemCarServiceImpl</string>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.android.car.oemcarservice.testapp"><uses-permission android:name="android.car.permission.CAR_CONTROL_AUDIO_SETTINGS" /><uses-permission android:name="android.car.permission.CAR_CONTROL_AUDIO_VOLUME" /><application><service android:name="com.android.car.oemcarservice.testapp.OemCarServiceImpl"android:directBootAware="true"android:permission="android.car.permission.BIND_OEM_CAR_SERVICE"android:exported="true"></service></application>
</manifest>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security 6.x 系列(8)—— 源码分析之配置器SecurityConfigurer接口及其分支实现

一、前言 本章主要内容是关于配置器的接口架构设计&#xff0c;任意找一个配置器一直往上找&#xff0c;就会找到配置器的顶级接口&#xff1a;SecurityConfigurer。 查看SecurityConfigurer接口的实现类情况&#xff1a; 在 AbstractHttpConfigurer 抽象类的下面可以看到所有…

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

【网络安全】虚假IP地址攻击如何防范?

在当今的网络时代&#xff0c;虚假IP地址攻击已成为一种新型的网络攻击方式&#xff0c;给网络安全带来了极大的威胁。那么&#xff0c;什么是虚假IP地址攻击&#xff1f;又如何进行溯源和防范呢&#xff1f;本文将为您揭开这一神秘面纱。 一、虚假IP地址攻击概述 虚假IP地址攻…

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行&#xff0c;然后 打开twenty_newsgroups.py文件&#xff08;在fetch_20newsgroups函数名上&#xff0c;右键转到定义即可找到&#xff09; 之后运行代码即…

羊大师教你如何有效应对冬季流感,保护自己与家人

羊大师教你如何有效应对冬季流感&#xff0c;保护自己与家人 随着冬季的临近&#xff0c;流感病毒将再次蔓延。如何预防冬季流感来袭&#xff0c;成为了许多人关注的话题。幸运的是&#xff0c;我们可以采取一系列的预防措施来保护自己和家人&#xff0c;避免被流感侵袭。下面…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

【初阶解法-数据结构】包含min函数的栈(代码+图示)

【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法 文章目录 【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法题目提炼题目要求分析题目总结思路代码时间/空间复杂度进阶版 题目 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函…

Ubuntu22.04 交叉编译mp4V2 for Rv1106

一、配置工具链环境 sudo vim ~/.bashrc在文件最后添加 export PATH$PATH:/opt/arm-rockchip830-linux-uclibcgnueabihf/bin 保存&#xff0c;重启机器 二、下载mp4v2 下载路径&#xff1a;MP4v2 | mp4v2 三、修改CMakeLists.txt 四、执行编译 mkdir build cd buildcmak…

羊大师教你如何在冬天运动,然后悄悄惊艳所有人

羊大师教你如何在冬天运动&#xff0c;然后悄悄惊艳所有人 寒冷的冬季&#xff0c;寂静的清晨&#xff0c;你是否也曾感到在冰冷的天气中进行锻炼是一件非常困难的事情&#xff1f;但是&#xff0c;现在请跟随小编羊大师一起来探索冬季秘密运动&#xff0c;让你在春节惊艳众人…

人工智能_机器学习060_核函数对应数学公式_数据空间错位分割_简单介绍_以及核函数总结---人工智能工作笔记0100

我们之前做的都是线性分类问题,那么需要一根线来分割类别,但是,如果出现了,环形数据,我们知道,在二维中我们就无法分割了,那么有没有什么办法分割呢? 实际上是有的,可以看到,我们可以把数据进行升维,可以看到,如果把数据升高到2维度以上,可以看到,神奇的一幕出现了,这个时候,因…

认知觉醒(三)

认知觉醒(三) 第二节 焦虑&#xff1a;焦虑的根源 焦虑肯定是你的老朋友了&#xff0c;它总像背景音乐一样伴随着你&#xff0c;我们虽对它极为熟悉&#xff0c;却从来不知道它究竟是谁。我也是默默忍受多年之后&#xff0c;终于在某天鼓足气力和它对视了一番&#xff0c;从…

【Linux】进程控制--进程创建/进程终止/进程等待/进程程序替换/简易shell实现

文章目录 一、进程创建1.fork函数2.fork函数返回值3.写时拷贝4.fork常规用法5.fork调用失败的原因 二、进程终止1.进程退出码2.进程退出场景3.进程常见退出方法 三、进程等待1.为什么要进行进程等待2.如何进行进程等待1.wait方法2.waitpid方法3.获取子进程status4.进程的阻塞等…

job_queue_processes参数讲解

原文地址&#xff1a;job_queue_processes参数讲解作者&#xff1a;rainbow_尧 本文转自【乐沙弥的世界】&#xff0c;在此感谢原作者&#xff01; Oracle jobs为Oracle开发人员和数据库管理员提供了数据库层面维护的极大便利性。对于Oracle jobs在Oracle 9i之前&#xff0c;是…

价差后的几种方向,澳福如何操作才能盈利

在价差出现时&#xff0c;澳福认为会出现以下几种方向。 昂贵资产的贬值和便宜资产的平行升值。昂贵的资产贬值&#xff0c;而便宜的资产保持不变。昂贵资产的贬值和便宜资产的平行贬值&#xff0c;但昂贵资产的贬值速度更快&#xff0c;超过便宜资产。更贵的一对的进一步升值和…

7. 系统信息与系统资源

7. 系统信息与系统资源 1. 系统信息1.1 系统标识 uname()1.2 sysinfo()1.3 gethostname()1.4 sysconf() 2. 时间、日期2.1 Linux 系统中的时间2.1.1 Linux 怎么记录时间2.1.2 jiffies 的引入 2.2 获取时间 time/gettimeofday2.2.1 time()2.2.2 gettimeofday() 2.3 时间转换函数…

登录校验过滤器

会话技术 JWT令牌 过滤器Filter 拦截器 interceptor cookise package com.it.controller;import com.it.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

Android wifi连接和获取IP分析

wifi 连接&获取IP 流程图 代码流程分析 一、关联阶段 1. WifiSettings.submit – > WifiManager WifiSettings 干的事情比较简单&#xff0c;当在dialog完成ssid 以及密码填充后&#xff0c;直接call WifiManager save 即可WifiManager 收到Save 之后&#xff0c;就开…

新的 BLUFFS 攻击导致蓝牙连接不再私密

蓝牙是一种连接我们设备的低功耗无线技术&#xff0c;有一个新的漏洞需要解决。 中间的攻击者可以使用新的 BLUFFS 攻击轻松窥探您的通信。 法国研究中心 EURECOM 的研究员 Daniele Antonioli 演示了六种新颖的攻击&#xff0c;这些攻击被定义为 BLUFFS&#xff08;蓝牙转发和…

【Java】文件I/O-文件内容操作-输入输出流-Reader/Writer/InputStream/OutputStream四种流

导读 在文件I/O这一节的知识里&#xff0c;对文件的操作主要分为两大类&#xff1a; ☑️针对文件系统进行的操作 ☑️针对文件内容进行的操作 上文已经讲了针对文件系统即File类的操作&#xff0c;这篇文章里博主就来带了解针对文件内容的操作&#xff0c;即输入输出流&am…

04_网络编程

网络编程 什么是网络编程 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09; java.net.* 包下提供了网络编程的解决方案 通信的基本架构 CS 架构&#xff08;Client 客户端 / Server 服务端&#xff09;BS 架构&#xff08;…