国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 音頻框架 基于android 12

這篇具有很好參考價(jià)值的文章主要介紹了Android 音頻框架 基于android 12。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

  • Android 的音頻是一個(gè)相當(dāng)復(fù)雜的部分。從應(yīng)用到框架、hal、kernel、最后到硬件,每個(gè)部分的知識(shí)點(diǎn)都相當(dāng)?shù)亩?。而android 這部分代碼在版本之間改動(dòng)很大、其中充斥著各種workaround的處理,讓人看的云里霧里。網(wǎng)上相應(yīng)的分析文章也很多,有些就貼大段的代碼 是很不容易理解的。
  • 本系列就遵循從整體到局部, 從簡(jiǎn)單到復(fù)雜來(lái)分析。很多時(shí)候可能是帶著問題來(lái)看文章。而寫博客的目的 一是記錄分析的過(guò)程,從迷茫 混亂到清晰 有序的關(guān)鍵概念和流程的理解。二是對(duì)系統(tǒng)或者框架思想的一個(gè)整體理解,為解決問題打下基礎(chǔ)。
  • 總體的一個(gè)理解:借用android 官網(wǎng)的一張圖, 從應(yīng)用層開始,所有封裝中的音頻數(shù)據(jù)經(jīng)過(guò)解碼后為pcm數(shù)據(jù)(或者音頻的裸數(shù)據(jù)),這個(gè)數(shù)據(jù)就拷貝到framework層,framework根據(jù)設(shè)備和配置文件中定義的路由情況,將應(yīng)用層指定的數(shù)據(jù)送到對(duì)應(yīng)的設(shè)備進(jìn)行輸出。
    Android 音頻框架 基于android 12,android,音頻

本篇文章的目標(biāo)包括以下幾點(diǎn)

  1. 從開機(jī)出發(fā)理解android audioservice 中audioflinger、audiopolicy提供怎樣的服務(wù)。
  2. 從播放出發(fā)理解android的音頻數(shù)據(jù)如何一路送到硬件。
  3. 從vendor.auio-hal出發(fā)理解hal層提供了怎樣的服務(wù)。

音頻服務(wù)audioserver

  • 首先從開機(jī)啟動(dòng)的音頻相關(guān)服務(wù)audioserver開始

    • 開機(jī)init.rc文件中和音頻有關(guān)的service audioserver其包括android 音頻框架兩個(gè)最重要的服務(wù)audioflinger 和audiopolicy。當(dāng)然這兩個(gè)服務(wù)之間并沒有相互隔離的很開,有些函數(shù)會(huì)在這兩個(gè)服務(wù)直接相互調(diào)用。
  • audioflinger的作用:

    • 跟HAL層的接口進(jìn)行交互的地方, 包括load具體的某個(gè)module的實(shí)現(xiàn),open相應(yīng)的stream、往stream中寫數(shù)據(jù)。
    • 為每個(gè)open的stream 創(chuàng)建相對(duì)應(yīng)的線程,并維護(hù)線程和dev之間的關(guān)系,創(chuàng)建線程的時(shí)機(jī)是在成功open stream之后。
    • 維護(hù)和暴露給外部接口相對(duì)應(yīng)的track,對(duì)外部track寫到stream的數(shù)據(jù)進(jìn)行處理包括mix、格式轉(zhuǎn)換、采樣率轉(zhuǎn)換、音效處理、音量處理等等。
    • 創(chuàng)建patch,為音頻輸入和輸出直接創(chuàng)建通路和線程, 使輸入的數(shù)據(jù)直接輸出到輸出設(shè)備,而不需要通過(guò)應(yīng)用層。
    • 根據(jù)配置track的模式、生成不同的線程,對(duì)數(shù)據(jù)進(jìn)行不同的處理 主要有三種分別為direct(track的數(shù)據(jù)直接寫到hal)、mix(經(jīng)過(guò)混音 格式轉(zhuǎn)換等處理)、offload (不經(jīng)過(guò)解碼數(shù)據(jù)直接寫到dsp中。
  • audiopolicy的作用:

    • 載入音頻audio_policy_configuration.xml配置文件,并將配置文件中的moules、module、port、profile、routes抽象成代碼中的各種概念比如modules、device、port等等。并在解析到attach device后 去調(diào)用audioflinger的openOutput stream打開設(shè)備.
    • 保存路由的信息、這里面包括xml定義的 和 通過(guò)外部注冊(cè)到policy的mix。
    • track 啟動(dòng)播放的時(shí)候 會(huì)調(diào)用audiopolicy的接口getoutputfromattr 通過(guò)attr獲取輸出的設(shè)備。獲取設(shè)備后同時(shí)可以找到對(duì)應(yīng)的線程,這樣往track寫的數(shù)據(jù) 就會(huì)寫到hal。

音頻數(shù)據(jù)鏈路

  • 簡(jiǎn)單的來(lái)講 外部通過(guò)解碼或者未解碼的數(shù)據(jù) buffer 寫到track(這個(gè)track 可以是應(yīng)用層也可以是framework層,應(yīng)用層的調(diào)用到mediaPlayerservice 中的AudioOutput 其繼承了AudioSink,audioSink是外部用的),

  • 從前面的分析可以往這個(gè)track寫數(shù)據(jù)最終都會(huì)要通過(guò)output device對(duì)應(yīng)的線程里面去寫的。可以看出這兩個(gè)是屬于不同的進(jìn)程。一個(gè)是mediaserver 一個(gè)是audioserver,其數(shù)據(jù)交互是通過(guò)匿名共享內(nèi)存來(lái)實(shí)現(xiàn)。 這個(gè)共享內(nèi)存在audioflinger創(chuàng)建track的時(shí)候分配的。在mediaserver 往track寫數(shù)據(jù)的時(shí)候,會(huì)把數(shù)據(jù)拷貝到這個(gè)共享內(nèi)存中,然后audioflinger 把數(shù)據(jù)從共享內(nèi)存中拷貝出來(lái) 經(jīng)過(guò)一系列處理寫到hal中。

hal 提供什么樣的作用

hal的功能有定義的一系列的接口,主要就是打開聲卡設(shè)備、然后往聲卡設(shè)備里面寫數(shù)據(jù)。hal提供給外部audioFlinger的主要接口是openDevice 和open_output_stream。不同vendor實(shí)現(xiàn)的方式不一樣,目前看到的大部分的實(shí)現(xiàn)是基于tinyalsa提供的接口來(lái)實(shí)現(xiàn)對(duì)聲卡控件的操作和聲卡的讀寫。

  • open_output_stream

    實(shí)現(xiàn)是創(chuàng)建了stream_out結(jié)構(gòu)體,并賦值實(shí)現(xiàn)stream_out結(jié)構(gòu)體中的不同函數(shù)指針。并將這個(gè)結(jié)構(gòu)體返回給外部調(diào)用。這個(gè)會(huì)轉(zhuǎn)換為外部的結(jié)構(gòu)體 AudioStreamOut。 這個(gè)結(jié)構(gòu)體會(huì)傳遞到audioFlinger 創(chuàng)建MixerThread中,后續(xù)應(yīng)用調(diào)用audiotrack的write 函數(shù)會(huì)調(diào)用到hal層的write函數(shù)hal層使用tinyalsa 或者alsa的寫到內(nèi)核驅(qū)動(dòng)中。

  • out_write

    hal中只有在out_write里面才會(huì)真正的去打開底層的硬件 進(jìn)行數(shù)據(jù)的寫入。

總結(jié):
總的來(lái)說(shuō), 外部 framework audioflinger 通過(guò)hal提供的接口創(chuàng)建出dev 和stream以用來(lái)獲取hal層的能力,相關(guān)的接口實(shí)現(xiàn)在audio hal中有定義,然后audioFlinger 通過(guò)調(diào)用dev和stream的指針函數(shù)來(lái)操作hal,主要的接口有打開設(shè)備 打開流 寫數(shù)據(jù) 讀數(shù)據(jù)等等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-686997.html

到了這里,關(guān)于Android 音頻框架 基于android 12的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android音頻框架之一 詳解audioPolicy流程及HAL驅(qū)動(dòng)加載與配置

    Android音頻框架之一 詳解audioPolicy流程及HAL驅(qū)動(dòng)加載與配置

    android 系統(tǒng) framework 代碼起點(diǎn), frameworks/base/core/jni/AndroidRuntime.cpp 文件, 此文件是android系統(tǒng)主線程代碼,代碼內(nèi)容涉及系統(tǒng)很多模塊,此程序主要是注冊(cè)模塊的JNI接口方法。其中涉及到模塊 native、sensorHal、media、audioflinger、displayflinger、camera、serialport、binder等, 從各模塊名稱

    2024年01月22日
    瀏覽(21)
  • HIDL Service創(chuàng)建流程 - 基于Android 12 S分析

    HIDL Service創(chuàng)建流程 - 基于Android 12 S分析

    系列文章 Android 12 S ServiceManager原理 Android 12 S Native Service的創(chuàng)建流程 Android 12 S Binder原理之BpBinder,BnBinder以及IInterface介紹 Android 12 S HIDL Service創(chuàng)建流程 Android 12 S 自定義Hal服務(wù)selinux權(quán)限添加 Android 12 S 自定義Native服務(wù)selinux權(quán)限添加 Android 12 S java服務(wù)調(diào)用native服務(wù) Android 12 S 自定

    2024年02月11日
    瀏覽(20)
  • android pdf框架-3,基于recyclerview修改

    基于recyclerview的實(shí)現(xiàn)版本 解析使用的是pdifum.這個(gè)庫(kù)缺點(diǎn)是縮放功能不行.點(diǎn)擊鏈接功能沒有.只有渲染. GitHub - danjdt/android-pdfviewer: A Android PDF Viewer that render pdf using PdfRenderer and displays it in a RecyclerView. recyclerview的滑動(dòng)并不是像ios那樣,有很好的慣性,針對(duì)此,從ebookdroid中拿了flinge

    2024年02月19日
    瀏覽(17)
  • Android MediaCodec 框架 基于codec2

    Android MediaCodec 框架 基于codec2

    系列文章的目的是什么? 粗略: 解碼需要哪些基礎(chǔ)的服務(wù)? 標(biāo)準(zhǔn)解碼的調(diào)用流程? 各個(gè)流程的作用是什么? 解碼框架的層次? 各個(gè)層次的作用? 細(xì)化: 解碼參數(shù)的配置? 解碼輸入數(shù)據(jù)包的流轉(zhuǎn)? 解碼輸出幀內(nèi)存的申請(qǐng)和管理? 首先從MediaCodec 到具體的解碼Component 梳理出

    2024年02月07日
    瀏覽(21)
  • LSPatch —— 一款基于Android的免root框架

    LSPatch —— 一款基于Android的免root框架

    前言 LSPosed(百度百科) 是一個(gè)基于 Riru 的 ART hook 框架 (最初用于 Android Pie) ,提供與原版 Xposed 相同的 API, 使用 YAHFA (或 SandHook) 進(jìn)行 hook, 支持 Android 9 及其以上安卓版本。 LSPatch 則是LSPosed開發(fā)者所開發(fā)的另一款基于Android的免root框架。 Rootless implementation of LSPosed framework, in

    2024年02月12日
    瀏覽(13)
  • Android上的基于協(xié)程的存儲(chǔ)框架

    在Android上,經(jīng)常會(huì)需要持久化本地?cái)?shù)據(jù),比如我們需要緩存用戶的配置信息、用戶的數(shù)據(jù)、緩存數(shù)據(jù)、離線緩存數(shù)據(jù)等等。我們通常使用的工具為SharePreference、MMKV、DataStore、Room、文件等等。通過(guò)使用現(xiàn)有的存儲(chǔ)框架,結(jié)合協(xié)程,我們可以方便地實(shí)現(xiàn)一個(gè)輕量級(jí)的響應(yīng)式存儲(chǔ)

    2024年02月13日
    瀏覽(13)
  • Android開發(fā) 基于ARouter開源的路由框架的YmRouter

    目錄 一、ARouter的簡(jiǎn)介 二,集成 ?1、添加jitpack 倉(cāng)庫(kù) 2、依賴YmRouter庫(kù) 單model項(xiàng)目 多model項(xiàng)目 三、使用和ARouter的小區(qū)別 3.1、和ARouter的區(qū)別 3.2、簡(jiǎn)單的初始化 ?3.3、簡(jiǎn)單使用 3.4 攜帶值跳轉(zhuǎn)Activity ARouter是一個(gè)用于Android的路由框架,它能夠幫助開發(fā)者實(shí)現(xiàn)組件之間的通信和頁(yè)面

    2024年02月02日
    瀏覽(90)
  • Repo下載、編譯AOSP源碼:基于Ubuntu 21.04,android-12.1.0_r27

    最近準(zhǔn)備更新專欄文章,AOSP源碼自然也需要進(jìn)行更新了,但這次不是為最新的android 13, 而是取android 12的最新tag version: android-12.1.0_r27,這應(yīng)該是市面上的主流版本。 每次更新,自然也會(huì)遇到問題,所以就記錄一下 另外,這次我們將直接配置本地服務(wù)器,而不是通過(guò)docker,讓

    2023年04月26日
    瀏覽(22)
  • 基于阿里云物聯(lián)網(wǎng)平臺(tái)的Android物聯(lián)網(wǎng)軟件框架(快速開發(fā))

    基于阿里云物聯(lián)網(wǎng)平臺(tái)的Android物聯(lián)網(wǎng)軟件框架(快速開發(fā))

    提示:該工程是連接阿里云物聯(lián)網(wǎng)平臺(tái)的模板代碼,將MQTT連接、JSON數(shù)據(jù)的訂閱發(fā)布等操作封裝,并且能夠迅速將獲取到的數(shù)據(jù)顯示到手機(jī)界面上。使用了Servier進(jìn)行網(wǎng)絡(luò)連接的邏輯操作,并且使用自定義控件,綁定對(duì)用標(biāo)識(shí)符的數(shù)據(jù)對(duì)象,實(shí)現(xiàn)了數(shù)據(jù)自動(dòng)實(shí)時(shí)更新等操作,并

    2024年02月06日
    瀏覽(29)
  • Android企業(yè)級(jí)實(shí)戰(zhàn)-界面篇-2,android音頻開發(fā)

    Android企業(yè)級(jí)實(shí)戰(zhàn)-界面篇-2,android音頻開發(fā)

    ?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"? RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android” android:id=“@id/user_profile_layout” android:layout_width=“fill_parent” android:layout_height=“100.0dip” android:clickable=“true” android:clipChildren=“false” ImageView android:id=“@id/profile_cover” android:layout_width=“

    2024年04月27日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包