汽車音頻是 Android 汽車操作系統 (AAOS) 的一項功能,允許車輛播放信息娛樂聲音,例如媒體、導航和通信。AAOS 不負責具有嚴格可用性和時間要求的鈴聲和警告,因為這些聲音通常由車輛的硬件處理。將汽車音頻服務集成在汽車中,徹底改變了駕駛體驗,為駕駛員和乘客提供了音樂、導航指導、語音命令等的無縫融合。
汽車音頻主要包括音量控制、音頻路由、音頻焦點、多區音頻等功能。主要功能如下:
-
音量控制: 通過將音頻設備分組到音量組(Volume Groups),CarAudioService 實現對特定設備組的音量和靜音控制。所有屬于同一音量組的設備將同步調整音量。
-
音頻路由(Audio Routing):是指系統如何決定將音頻流從一個或多個音頻源(如音樂播放器、應用、游戲等)發送到哪些音頻輸出設備的過程。音頻路由對于確保音頻數據能夠正確、高效地傳輸到目標設備至關重要。
-
音頻焦點管理(Audio Focus): 該服務通過注冊音頻策略焦點監聽器來管理應用程序的音頻焦點請求。它使用交互矩陣(Interaction Matrix)來定義不同音頻使用場景(如導航、媒體播放、電話等)之間的交互方式,包括并行、獨占或拒絕等策略。
-
音頻區域管理(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 |
---|---|---|
1 | MUSIC | USAGE_UNKNOWN, USAGE_GAME, USAGE_MEDIA |
2 | NAVIGATION | USAGE_ASSISTANCE_NAVIGATION_GUIDANCE |
3 | VOICE_COMMAND | USAGE_ASSISTANT, USAGE_ASSISTANCE_ACCESSIBILITY |
4 | CALL_RING | USAGE_NOTIFICATION_RINGTONE |
5 | CALL | USAGE_VOICE_COMMUNICATION, USAGE_CALL_ASSISTANT, USAGE_VOICE_COMMUNICATION_SIGNALLING |
6 | ALARM | USAGE_ALARM |
7 | NOTIFICATION | USAGE_NOTIFICATION, USAGE_NOTIFICATION_EVENT |
8 | SYSTEM_SOUND | USAGE_ASSISTANCE_SONIFICATION |
9 | EMERGENCY | USAGE_EMERGENCY |
10 | SAFETY | USAGE_SAFETY |
11 | VEHICLE_STATUS | USAGE_VEHICLE_STATUS |
12 | ANNOUNCEMENT | USAGE_ANNOUNCEMENT |
音頻 HAL
車載音頻實現依賴標準 Android 音頻 HAL,其中包括以下內容:
IDevice.hal
:負責創建輸入聲音流和輸出聲音流、處理主音量和靜音操作,以及使用:createAudioPatch
:在設備之間創建外部-外部音頻通路。IDevice.setAudioPortConfig()
:為各個物理聲音流提供音量。
IStream.hal
:連同輸入變體和輸出變體一起管理進出硬件的樣本音頻流。
車載設備類型
以下設備類型與車載平臺相關:
No. | 設備類型 | 說明 |
---|---|---|
1 | AUDIO_DEVICE_OUT_BUS | Android 的主要輸出(Android 的所有音頻均通過這種方式提供給車輛)。用作消除各個上下文的信息流歧義的地址。 |
2 | AUDIO_DEVICE_OUT_TELEPHONY_TX | 用于傳輸路由到手機無線裝置的音頻。 |
3 | AUDIO_DEVICE_IN_BUS | 用于尚未進行分類的輸入。 |
4 | AUDIO_DEVICE_IN_FM_TUNER | 僅用于廣播無線裝置輸入。 |
5 | AUDIO_DEVICE_IN_TV_TUNER | 用于電視設備(如果存在)。 |
6 | AUDIO_DEVICE_IN_LINE | 用于 AUX 輸入耳機插孔。 |
7 | AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 通過藍牙接收到的音樂。 |
8 | AUDIO_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的示例定義了音頻設備組件: