【AAOS】【源碼分析】CarAudioService(二)-- 功能介紹

汽車音頻是 Android 汽車操作系統 (AAOS) 的一項功能,允許車輛播放信息娛樂聲音,例如媒體、導航和通信。AAOS 不負責具有嚴格可用性和時間要求的鈴聲和警告,因為這些聲音通常由車輛的硬件處理。將汽車音頻服務集成在汽車中,徹底改變了駕駛體驗,為駕駛員和乘客提供了音樂、導航指導、語音命令等的無縫融合。

汽車音頻主要包括音量控制、音頻路由、音頻焦點、多區音頻等功能。主要功能如下:

  1. 音量控制: 通過將音頻設備分組到音量組(Volume Groups),CarAudioService 實現對特定設備組的音量和靜音控制。所有屬于同一音量組的設備將同步調整音量。

  2. 音頻路由(Audio Routing):是指系統如何決定將音頻流從一個或多個音頻源(如音樂播放器、應用、游戲等)發送到哪些音頻輸出設備的過程。音頻路由對于確保音頻數據能夠正確、高效地傳輸到目標設備至關重要。

  3. 音頻焦點管理(Audio Focus): 該服務通過注冊音頻策略焦點監聽器來管理應用程序的音頻焦點請求。它使用交互矩陣(Interaction Matrix)來定義不同音頻使用場景(如導航、媒體播放、電話等)之間的交互方式,包括并行、獨占或拒絕等策略。

  4. 音頻區域管理(Audio Zones): CarAudioService 支持將車輛的音頻設備劃分為不同的區域(zones),每個區域可以獨立控制音頻輸出。例如,前排和后排座位可以播放不同的音頻內容。

整體實現

AAOS 主要使用 AudioAttributes.AttributeUsages 進行路由、音量調整和焦點管理。AttributeUsages用于表示播放聲音流的“原因”。因此,所有聲音流和音頻焦點請求都應為其音頻播放指定AttributeUsages。如果在構建 AudioAttributes 對象時未明確設置,則用法將默認為 USAGE_UNKNOWN。雖然目前會對此用法采取與 USAGE_MEDIA 一樣的處理,但不應依賴此行為進行媒體播放。

系統用途(System Usages)

Android 11 中引入了系統用法。這些用法的行為與之前確立的用法類似,不同之處在于它們需要使用系統 API 以及 android.permission.MODIFY_AUDIO_ROUTING。?在 Android Automotive 操作系統(AAOS)中,System Usages(系統用途)指的是一組預定義的音頻使用場景,這些場景用于管理和路由車載音頻。當前系統用法如下:

No.描述
1

USAGE_CALL_ASSISTANT

用于語音助手在處理電話(蜂窩網絡或 VoIP)通話時的音頻交互。
2

USAGE_EMERGENCY

?用于緊急情況的音頻,例如車輛碰撞警報或其他需要立即引起注意的緊急通知。
3

USAGE_SAFETY

?用于安全相關的音頻提示,例如安全帶未系提示音或車道偏離警告。
4

USAGE_VEHICLE_STATUS

用于車輛狀態的音頻通知,例如車門未關好的提醒或油量不足的提示。
5

USAGE_ANNOUNCEMENT

用于一般性的公告或廣播音頻,例如全車廣播的通知或信息發布。
6

USAGE_SPEAKER_CLEANUP

?用于揚聲器清理過程中的音頻播放,例如播放特定頻率的聲音以清除揚聲器中的異物。

若要通過系統用法構造 AudioAttributes,請使用 AudioAttributes.Builder#setSystemUsage,而不是 setUsage。如果要通過非系統用法調用此方法,就會導致系統拋出 IllegalArgumentException。此外,如果同時在構建器上設置了系統用法和非系統用法,則在構建時將會拋出 IllegalArgumentException

音頻上下文(Audio contexts)

 為了簡化 AAOS 音頻的配置,類似用法均已歸入 CarAudioContext。這些音頻上下文會在整個 CarAudioService 中使用,以定義路由、音量組和音頻焦點管理。音頻上下文與屬性用途的映射關系如下:

No.CarAudioContext關聯的 AttributeUsages
1MUSIC

USAGE_UNKNOWN, USAGE_GAME, USAGE_MEDIA

2NAVIGATION

USAGE_ASSISTANCE_NAVIGATION_GUIDANCE

3VOICE_COMMAND

USAGE_ASSISTANT, USAGE_ASSISTANCE_ACCESSIBILITY

4CALL_RING

USAGE_NOTIFICATION_RINGTONE

5CALL

USAGE_VOICE_COMMUNICATION, USAGE_CALL_ASSISTANT, 

USAGE_VOICE_COMMUNICATION_SIGNALLING

6ALARM

USAGE_ALARM

7NOTIFICATION

USAGE_NOTIFICATION, USAGE_NOTIFICATION_EVENT

8SYSTEM_SOUND

USAGE_ASSISTANCE_SONIFICATION

9EMERGENCY

USAGE_EMERGENCY

10SAFETY

USAGE_SAFETY

11VEHICLE_STATUS

USAGE_VEHICLE_STATUS

12ANNOUNCEMENT

USAGE_ANNOUNCEMENT

 音頻 HAL

 車載音頻實現依賴標準 Android 音頻 HAL,其中包括以下內容:

  • IDevice.hal:負責創建輸入聲音流和輸出聲音流、處理主音量和靜音操作,以及使用:
    • createAudioPatch:在設備之間創建外部-外部音頻通路。
    • IDevice.setAudioPortConfig():為各個物理聲音流提供音量。
  • IStream.hal:連同輸入變體和輸出變體一起管理進出硬件的樣本音頻流。

車載設備類型

以下設備類型與車載平臺相關:

No.設備類型說明
1AUDIO_DEVICE_OUT_BUSAndroid 的主要輸出(Android 的所有音頻均通過這種方式提供給車輛)。用作消除各個上下文的信息流歧義的地址。
2AUDIO_DEVICE_OUT_TELEPHONY_TX用于傳輸路由到手機無線裝置的音頻。
3AUDIO_DEVICE_IN_BUS用于尚未進行分類的輸入。
4AUDIO_DEVICE_IN_FM_TUNER僅用于廣播無線裝置輸入。
5AUDIO_DEVICE_IN_TV_TUNER用于電視設備(如果存在)。
6AUDIO_DEVICE_IN_LINE用于 AUX 輸入耳機插孔。
7AUDIO_DEVICE_IN_BLUETOOTH_A2DP通過藍牙接收到的音樂。
8AUDIO_DEVICE_IN_TELEPHONY_RX用于從移動網絡電臺接收到的與通話相關聯的音頻。

配置音頻設備

Android 可見的音頻設備必須在 /audio_policy_configuration.xml 中進行定義,其中包括以下組件:

  • 模塊名稱:支持“primary”(用于汽車用例)、“A2DP”、“remote_submix”和“USB”。模塊名稱和相應音頻驅動程序應編譯到 audio.primary.$(variant).so 中。
  • devicePorts:包含可從此模塊訪問的所有輸入和輸出設備(包括永久連接的設備和可移除設備)的設備描述符列表。
    • 對于每種輸出設備,您可以定義增益控制(包含以 millibel 為單位的 min/max/default/step 值,其中 1 millibel = 1/100 dB = 1/1000 bel)。
    • 即使有多個設備的設備類型為 AUDIO_DEVICE_OUT_BUS,也可以使用 devicePort 實例上的地址屬性查找設備。
  • mixPorts:包含由音頻 HAL 提供的所有輸出聲音流和輸入聲音流的列表。每個 mixPort 實例都可被視為傳輸到 Android AudioService 的物理聲音流。
  • routes:定義輸入和輸出設備之間或聲音流和設備之間可能存在的連接的列表。

以下audioPolicyConfiguration的示例定義了音頻設備組件:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75204.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker安裝軟件匯總(持續更新)

1、簡介 本文介紹一些常用的軟件通過docker安裝并啟動,持續更新。 2、docker安裝軟件 2.1、zookeeper & kafka # 1、拉取zookeeper鏡像 git pull wurstmeister/zookeeper # 2、啟動zookeeper容器 docker run -d --restartalways --log-driver json-file --lo…

MySQL的左連接、右連接、內連接、外連接

一、前言 MySQL中的左連接、右連接、內連接和全外連接是用于多表關聯查詢的核心操作。 二、內連接(INNER JOIN) 定義:返回兩個表中完全匹配的行,即只保留兩個表連接字段值相等的行。示例場景:查詢所有有選課記錄的學…

前端面試寶典---數據類型

基本數據類型 對于基本類型在創建時無需使用 new 關鍵字 Bigint在實際開發不常用,如果對于精度要求高可以使用第三方庫,如decimal.js 基本數據類型介紹 undefined:當變量被聲明但未賦值,或者函數沒有返回值時,就會呈現…

Lua 函數使用的完整指南

在 Lua 中,函數是一等公民(First-Class Citizen),這意味著函數可以像其他值一樣被賦值、傳遞和操作。以下是 Lua 函數定義的完整指南,涵蓋基礎語法、高級特性、設計模式及性能優化。 在Lua 中,函數定義的完…

使用StockTV API對接印度金融市場數據全指南:K線、實時行情與IPO新股

一、印度金融市場數據特點 印度作為全球增長最快的主要經濟體之一,其金融市場具有以下顯著特征: 雙交易所體系:國家證券交易所(NSE)和孟買證券交易所(BSE)高流動性品種:Nifty 50指數成分股、銀行股等獨特交易機制:T2…

2021-10-26 C++繁忙通信兵

緣由繁忙的通訊兵,可以解決一下嗎-編程語言-CSDN問答 void 繁忙通信兵() {//緣由https://ask.csdn.net/questions/7544401?spm1005.2025.3001.5141int a 200, s1 8, s2 5, s3 45, p 0, n 0, c 0;std::cin >> n;while (a > n){a - s1 s2;if (a &l…

【Linux】進程控制:創建、終止、等待與替換全解析

文章目錄 前言一、重談進程創建二、進程終止2.1 正常終止的退出碼機制2.2 異常終止的信號機制2.3 進程常見的退出方法 三、進程等待:避免僵尸進程的關鍵3.1 進程等待的必要性3.2 進程等待的兩個系統調用接口3.2.1 wait()3.2.2 waitpid()區別 四、進程程序替換4.1 進…

基于Redis實現短信防轟炸的Java解決方案

基于Redis實現短信防轟炸的Java解決方案 前言 在當今互聯網應用中,短信驗證碼已成為身份驗證的重要手段。然而,這也帶來了"短信轟炸"的安全風險 - 惡意用戶利用程序自動化發送大量短信請求,導致用戶被騷擾和企業短信成本激增。本…

【后端開發】Spring MVC-常見使用、Cookie、Session

文章目錄 代碼總結初始化--RestController、RequestMapping傳遞參數單參數多參數 傳遞對象后端參數重命名(后端參數映射)--RequestParam必傳參數設置非必傳參數 傳遞數組傳遞集合傳遞JSON數據JSON語法JSON格式轉換JSON優點傳遞JSON對象 獲取URL中參數--P…

青少年編程考試 CCF GESP Python七級認證真題 2025年3月

Python 七級 2025 年 03 月 題號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B C A B B A A B C A B B A B A 1 單選題(每題 2 分,共 30 分) 第 1 題 下列哪個選項是python中的關鍵字? A. function B. class C. method D. object…

Vue 框架組件間通信方式

組件間通信方式 不管是 vue2 還是 vue3,組件通信方式很重要,以下是常見的幾種通信方式: props:可以實現父子組件、子父組件、甚至兄弟組件通信自定義事件:可以實現子父組件通信全局事件總線 $bus:可以實現…

SpringBoot學生成績管理系統設計與實現

概述 幽絡源本次分享的基于SpringBoot的學生成績管理系統項目,采用主流的Java技術棧開發,實現了從學生信息管理到成績統計分析的全流程數字化管理。 主要內容 管理員功能模塊 ??學生信息管理??:維護學生基本信息檔案,支持…

青少年編程與數學 02-016 Python數據結構與算法 01課題、算法

青少年編程與數學 02-016 Python數據結構與算法 01課題、算法 一、算法的定義二、算法的設計方法1. 分治法2. 動態規劃法3. 貪心算法4. 回溯法5. 迭代法6. 遞歸法7. 枚舉法8. 分支定界法 三、算法的描述方法1. **自然語言描述**2. **流程圖描述**3. **偽代碼描述**4. **程序設計…

Java 實現冒泡排序:[通俗易懂的排序算法系列之二]

引言 大家好!歡迎來到我的排序算法系列第二篇。今天,我們將學習另一種非常基礎且廣為人知的排序算法——冒泡排序 (Bubble Sort)。 冒泡排序的名字非常形象,它模擬了水中氣泡上升的過程:較小(或較大)的元素會像氣泡一樣,通過不斷交換,逐漸“浮”到數組的一端。 什么是…

struct結構體、union聯合體和枚舉

目錄 一、結構體的聲明和使用 1.1 結構體正常聲明和創建 1.2 結構體特殊聲明 1.3 結構體的自引用 二、結構體內存對齊 2.1 對齊規則 2.2 #pragma修改 三、結構體傳參 四、結構體位段 4.1 位段內存分配 4.2 位段內存應用 五、結構體中的柔性數組概念 六、union聯合…

大模型本地部署系列(2) Ollama部署DeepSeek-R1

成功運行截圖 部署步驟 我們進入到ollama的官網: Ollama?ollama.com/?編輯 找到上方的Models ,然后點擊 此時會跳轉到模型列表頁面: 點擊 deepseek-r1 鏈接進去,此時我們會看到下拉框中有各個版本的大模型,越往后…

繪制動態甘特圖(以流水車間調度為例)

import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np from matplotlib import cm# 中文字體配置(必須放在所有繪圖語句之前) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

PyTorch實現線性回歸的基礎寫法與封裝API寫法

目錄 1. 基礎寫法 1.1導包 2.2加載讀取數據 2.3原始數據可視化(畫圖顯示) 2.4線性回歸的(基礎)分解寫法 2.5定義訓練過程 2.PyTorch實現 線性回歸的封裝寫法(實際項目中的常用寫法) 2.1創建線性回歸模型 2.2定義損失函數 2.3定義優化器 2.4定義訓練過程 1…

python 常用的6個爬蟲第三方庫

Python中有非常多用于網絡數據采集的庫,功能非常強大,有的用于抓取網頁,有的用于解析網頁,這里介紹6個最常用的庫。 1. BeautifulSoup BeautifulSoup是最常用的Python網頁解析庫之一,可將 HTML 和 XML 文檔解析為樹形…

基于BP神經網絡的雜草智能識別系統(雜草識別、Python項目)

基于BP神經網絡的雜草智能識別系統 項目介紹 本項目是一個基于PyQt5和BP神經網絡的雜草智能識別系統。系統通過圖像處理和神經網絡技術, 能夠識別8種不同的雜草類別。用戶可以通過上傳圖片,系統會自動識別圖片中的雜草類別,并顯示識別結果和…