安卓audio 架構解析

audio_port_handle_t

? 定義:audio_port_handle_t標識音頻設備(如揚聲器、耳機)或虛擬端口(如遠程 submix)。它在設備連接或策略路由時由AudioPolicyManager分配,例如通過setDeviceConnectionState()動態注冊設備。

周期

audio_port_handle_t的生命周期,其周期可分為以下幾個階段:

  1. 生成階段

    ? 動態分配:當物理設備(如耳機、藍牙設備)連接或虛擬設備(如遠程submix)初始化時,AudioPolicyManager通過setDeviceConnectionState()動態分配唯一的audio_port_handle_t,并注冊到系統可用設備列表(如mAvailableOutputDevices或mAvailableInputDevices)中。例如,USB聲卡插入時會生成獨立的標識符。

    ? 靜態預定義:部分內置設備(如揚聲器)的audio_port_handle_t在系統啟動時通過解析audio_policy_configuration.xml預生成,無需動態注冊。

  2. 綁定與路由階段

    ? 策略路由選擇:應用創建AudioTrack或AudioRecord時,AudioPolicyManager根據音頻屬性(如usage、contentType)從可用設備中選擇目標設備,并返回其audio_port_handle_t。例如,媒體播放會選擇揚聲器,而通話則選擇聽筒。

    ? 動態更新:設備狀態變化(如拔出耳機)會觸發路由更新,系統銷毀原有綁定并重新分配audio_port_handle_t到新設備(如切換到揚聲器)。此過程通過SessionRouteMap維護會話與設備的關聯。

  3. 復用與共享

    ? 多會話共享:同一設備的audio_port_handle_t可被多個音頻會話復用。例如,多個AudioTrack輸出到藍牙設備時共享同一標識符,但各自維護獨立會話ID。

    ? 策略優先級調整:通過setPreferredDeviceForStrategy()等API,應用可指定策略的優先設備,系統動態更新audio_port_handle_t的綁定關系。

  4. 銷毀階段

    ? 設備斷開時釋放:設備斷開(如藍牙關閉)或虛擬設備銷毀時,AudioPolicyManager釋放對應的audio_port_handle_t并清理路由。例如,USB聲卡拔出后其標識符從可用設備列表中移除。

    ? 資源回收:若設備長時間未重新連接,系統可能回收其audio_port_handle_t以避免標識符耗盡。

關鍵特點

? 唯一性與動態性:每個標識符在生命周期內全局唯一,但設備重連可能重新分配不同值。

? 策略依賴性:生命周期受AudioPolicyManager路由規則控制,與硬件狀態和用戶配置強相關。

AudioPatch

1.核心變量
  1. audio_patch 結構體:
    ? num_sources - 源端數量

    ? sources[] - 源端配置數組(可以是設備或混音端口)

    ? num_sinks - 接收端數量

    ? sinks[] - 接收端配置數組(可以是設備或混音端口)

  2. AudioPatch 類成員:
    ? mPatch - 存儲當前的音頻補丁配置

    ? mUid - 創建該補丁的用戶ID

    ? mHandle - 補丁的唯一標識符

    ? mAfHandle - AudioFlinger 分配的補丁句柄

  3. 線程相關變量:
    ? mAudioPatches - 存儲所有音頻補丁的集合

    ? mPatchSinks - 輸出設備描述

    ? mPatchSources - 輸入設備描述

2.核心函數
  1. 創建補丁:
    ? createAudioPatch() - 創建新的音頻路由補丁

    ? sendCreateAudioPatchConfigEvent() - 發送創建補丁的配置事件

    ? installPatch() - 實際安裝補丁到系統中

  2. 釋放補丁:
    ? releaseAudioPatch() - 釋放已存在的音頻補丁

    ? sendReleaseAudioPatchConfigEvent() - 發送釋放補丁的配置事件

  3. 管理函數:
    ? updateAudioProfiles() - 更新與補丁相關的音頻配置

    ? checkForNewParameter_l() - 檢查補丁參數變化

    ? getParameters() - 獲取補丁參數

  4. 工具函數:
    ? patchSinksToString() - 將補丁接收端轉換為字符串

    ? patchSourcesToString() - 將補丁源端轉換為字符串

3.調用場景
  1. 設備連接/斷開時:
    ? 當音頻設備連接或斷開時,系統會創建或釋放相應的音頻補丁

    ? 調用createAudioPatch()或releaseAudioPatch()

  2. 路由策略變化時:
    ? 當音頻策略要求改變路由時(如通話時切換到耳機)

    ? 通過setParameters()觸發補丁更新

  3. 動態策略應用時:
    ? 應用請求特定路由(如遠程submix)時

    ? 使用sendCreateAudioPatchConfigEvent()通知音頻系統

  4. 效果鏈管理時:
    ? 當音頻效果需要特定設備路由時

    ? 通過補丁系統確保效果處理在正確的設備上

  5. 多設備輸出時:
    ? 需要同時輸出到多個設備(如藍牙和有線耳機)

    ? 創建多接收端的補丁配置

4.關鍵流程
  1. 補丁創建流程:

    應用請求 -> AudioPolicyManager -> AudioFlinger -> ThreadBase::createAudioPatch()
    -> installPatch() -> HAL層實現

  2. 補丁釋放流程:

    設備斷開/策略變化 -> AudioPolicyManager -> AudioFlinger -> releaseAudioPatch()
    -> HAL層清理

  3. 參數更新流程:

    參數變化 -> checkForNewParameter_l() -> 必要時創建/釋放補丁

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

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

相關文章

GitHub 上 Star 數量前 8 的開源 MCP 項目

原文鏈接:https://www.nocobase.com/cn/blog/github-open-source-mcp-projects。 MCP 這個詞真正被廣泛提起,是在 2025 年年初,尤其是在 AI 工具開發圈。3 月,一場圍繞 “MCP 是否能成為未來標準協議” 的爭論徹底點燃了討論熱度…

【數據結構與算法】數據結構初階:排序內容加餐(二)——文件歸并排序思路詳解(附代碼實現)

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…

Jetson Orin NX/NANO+ubuntu22.04+humble+MAVROS2安裝教程

MAVROS2目前不是官方提供的標準,主要區別還是通信機制的不同,以及API接口的區別,在使用的過程中,根據對應的版本安裝即可,此處進提供簡易的二進制安裝方法,源碼安裝暫不提供,前去使用mavros即可…

Ubuntu 安裝 ns-3 教程

Ubuntu 安裝 ns-3最全 教程 1. 環境更新 sudo apt update sudo apt install git2. Ns3 最低依賴要求 2.1 安裝依賴 安裝依賴網址:根據自己安裝的版本安裝對應依賴。 https://www.nsnam.org/wiki/Installation Ubuntu/Debian/Mint 以下軟件包列表在 Ubuntu 22.…

《林景媚與命運解放者》

《林景媚與命運解放者》——當數據庫成為命運的主宰,誰將成為人類自由意志的解放者?《林景媚數據庫宇宙》系列第十二部第一章:解放者的召喚公元 2098 年,隨著“命運終結者”的威脅被解除,PostgreSQL Quantum Engine&am…

linux編譯基礎知識-頭文件標準路徑

&#x1f4c2; ??1. 系統路徑結構差異?? 要查看 GCC 的默認頭文件搜索路徑&#xff0c;可通過以下方法操作&#xff08;以 Linux 環境為例&#xff09;&#xff1a; ??1. 查看 C 語言頭文件路徑?? gcc -v -E -xc - < /dev/null 2>&1 | grep -A 100 "#in…

離線語音芯片有哪些品牌和型號?

離線語音芯片的品牌有很多&#xff0c;型號也有很多&#xff0c;因為離線語音芯片的市場很大&#xff0c;幾乎所有的想要語音控制的產品都可以通過增加一顆離線語音芯片來實現語音控制的能力&#xff0c;今天主要提到的就是離線語音芯片品牌廠家之一的唯創知音。唯創知音發展歷…

Linux 軟件包管理

Linux 軟件包管理 分析 RPM 包 Linux 發行版本以 RHEL 為代表的發行版本&#xff0c;使用rpm包管理系統&#xff1a; RHEL (Red Hat Enterprise Linux&#xff09;Fedora&#xff08;由原來的RedHat桌面版本發展而來&#xff0c;免費版本&#xff09;CentOS&#xff08;RHEL的…

使用 Vue 3.0 Composition API 優化流程設計器界面

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

2025Nacos安裝Mac版本 少走彎路版本

https://github.com/alibaba/nacos 一開始看網上文章&#xff0c;隨便下了一個最新的3.0.2&#xff0c;然后出現很多錯誤 密鑰等等問題&#xff0c;最后啟動了&#xff0c;但是打不開鏈接&#xff1a;http://localhost:8848/nacos 然后開始找問題日志&#xff0c;/.nofollow/…

sifu mod制作 相關經驗

sifu mod制作一遍流程數據傳遞后拆開是ok的&#xff0c;沒必要合并 斷片不能使用原材質不然導入ue里沒法片段選擇 效果拔群 帶自動權重就會有跟隨骨骼的效果&#xff0c;空頂點組會跟隨父級的原點 這個選負的會抵消膠囊的碰撞效果 應用并刷新布料模擬&#xff08;相當于工程圖的…

論文精讀筆記:Overview

本文檔記錄了一些經典論文的講解筆記。 重讀經典&#xff1a;《ImageNet Classification with Deep Convolutional Neural Networks》 重讀經典&#xff1a;《Generative Adversarial Nets》 重讀經典&#xff1a;《Deep Residual Learning for Image Recognition》 重讀經典…

Elasticsearch+Logstash+Filebeat+Kibana單機部署

目錄 一、配置準備 下載java&#xff0c;需要java環境 二、單機模式 ELK部署 修改域名解析 elasticsearch配置 啟動elasticsearch服務 查看是否啟用 查看監聽端口 logstash服務 創建配置文件 kibana 啟動服務kebana 驗證 網頁訪問 ?編輯 生成圖表 回到網頁 一、配置準…

redis快速部署、集成、調優

redis快速部署、集成、調優 1.部署 1.1 docker部署 參考&#xff1a;https://blog.csdn.net/taotao_guiwang/article/details/135508643 1.2 redis部署 資源見&#xff0c;百度網盤&#xff1a;https://pan.baidu.com/s/1qlabJ7m8BDm77GbDuHmbNQ?pwd41ac 執行redis_insta…

大學生HTML期末大作業——HTML+CSS+JavaScript音樂網站

HTMLCSSJS【音樂網站】網頁設計期末課程大作業 web前端開發技術 web課程設計 網頁規劃與設計&#x1f4a5; 文章目錄一、&#x1f3c1; 網站題目二、&#x1f6a9; 網站描述三、&#x1f38c; 網站介紹四、&#x1f3f4; 網站效果五、&#x1f3f3;? 網站代碼六、&#x1f3f3…

ARP協議是什么?ARP欺騙是如何實現的?我們該如何預防ARP欺騙?

ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析協議&#xff09;是一個工作在數據鏈路層&#xff08;OSI第二層&#xff09;和網絡層&#xff08;OSI第三層&#xff09;之間的基礎網絡協議&#xff0c;它的核心功能是將網絡層地址&#xff08;IP地址&#xf…

一個物理引擎仿真器(mujoco這種)的計算流程

物理仿真的核心循環 一個典型的物理仿真引擎&#xff0c;在每一個時間步&#xff08;dt&#xff09;內&#xff0c;大致會執行以下流程&#xff1a; 確定當前狀態 (State)&#xff1a;獲取所有物體當前的位置 q 和速度 v。計算力 (Forces)&#xff1a;根據當前狀態&#xff0c;…

自然語言處理NLP(3)

上文&#xff1a; 自然語言處理NLP&#xff08;1&#xff09; 自然語言處理NLP&#xff08;2&#xff09; Gated RNN & LSTM 簡單RNN存在的問題 隨著時間的回溯&#xff0c;簡單RNN不能避免梯度消失或者梯度爆炸 梯度裁剪 用來解決梯度爆炸問題 code: g&#xff1a;所有參…

內循環全部滿足條件后,為true

### 實現方式在 C 中&#xff0c;可以通過在內循環外部定義一個布爾變量&#xff0c;并在內循環的每次迭代中檢查特定條件是否滿足。如果所有迭代均滿足條件&#xff0c;則在內循環結束后將布爾變量設置為 true。以下是一個示例代碼&#xff1a;cpp #include <iostream>i…

STM32--DHT11(標準庫)驅動開發

一、前言在我們進行嵌入式開發時&#xff0c;驅動開發也是十分重要的一步&#xff0c;在很多時候&#xff0c;我們的都需要自己來編寫硬件的底層驅動&#xff0c;實現硬件與芯片的通信&#xff0c;常見的協議有SPI&#xff0c;IIC&#xff0c;以及單總線的一些通信方式&#xf…