当前位置: 首页 > news >正文

Android 音频框架 基于android 12

文章目录

      • 前言
      • 音频服务audioserver
      • 音频数据链路
      • hal 提供什么样的作用

前言

  • Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件,每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理,让人看的云里雾里。网上相应的分析文章也很多,有些就贴大段的代码 是很不容易理解的。
  • 本系列就遵循从整体到局部, 从简单到复杂来分析。很多时候可能是带着问题来看文章。而写博客的目的 一是记录分析的过程,从迷茫 混乱到清晰 有序的关键概念和流程的理解。二是对系统或者框架思想的一个整体理解,为解决问题打下基础。
  • 总体的一个理解:借用android 官网的一张图, 从应用层开始,所有封装中的音频数据经过解码后为pcm数据(或者音频的裸数据),这个数据就拷贝到framework层,framework根据设备和配置文件中定义的路由情况,将应用层指定的数据送到对应的设备进行输出。
    在这里插入图片描述

本篇文章的目标包括以下几点

  1. 从开机出发理解android audioservice 中audioflinger、audiopolicy提供怎样的服务。
  2. 从播放出发理解android的音频数据如何一路送到硬件。
  3. 从vendor.auio-hal出发理解hal层提供了怎样的服务。

音频服务audioserver

  • 首先从开机启动的音频相关服务audioserver开始

    • 开机init.rc文件中和音频有关的service audioserver其包括android 音频框架两个最重要的服务audioflinger 和audiopolicy。当然这两个服务之间并没有相互隔离的很开,有些函数会在这两个服务直接相互调用。
  • audioflinger的作用:

    • 跟HAL层的接口进行交互的地方, 包括load具体的某个module的实现,open相应的stream、往stream中写数据。
    • 为每个open的stream 创建相对应的线程,并维护线程和dev之间的关系,创建线程的时机是在成功open stream之后。
    • 维护和暴露给外部接口相对应的track,对外部track写到stream的数据进行处理包括mix、格式转换、采样率转换、音效处理、音量处理等等。
    • 创建patch,为音频输入和输出直接创建通路和线程, 使输入的数据直接输出到输出设备,而不需要通过应用层。
    • 根据配置track的模式、生成不同的线程,对数据进行不同的处理 主要有三种分别为direct(track的数据直接写到hal)、mix(经过混音 格式转换等处理)、offload (不经过解码数据直接写到dsp中。
  • audiopolicy的作用:

    • 载入音频audio_policy_configuration.xml配置文件,并将配置文件中的moules、module、port、profile、routes抽象成代码中的各种概念比如modules、device、port等等。并在解析到attach device后 去调用audioflinger的openOutput stream打开设备.
    • 保存路由的信息、这里面包括xml定义的 和 通过外部注册到policy的mix。
    • track 启动播放的时候 会调用audiopolicy的接口getoutputfromattr 通过attr获取输出的设备。获取设备后同时可以找到对应的线程,这样往track写的数据 就会写到hal。

音频数据链路

  • 简单的来讲 外部通过解码或者未解码的数据 buffer 写到track(这个track 可以是应用层也可以是framework层,应用层的调用到mediaPlayerservice 中的AudioOutput 其继承了AudioSink,audioSink是外部用的),

  • 从前面的分析可以往这个track写数据最终都会要通过output device对应的线程里面去写的。可以看出这两个是属于不同的进程。一个是mediaserver 一个是audioserver,其数据交互是通过匿名共享内存来实现。 这个共享内存在audioflinger创建track的时候分配的。在mediaserver 往track写数据的时候,会把数据拷贝到这个共享内存中,然后audioflinger 把数据从共享内存中拷贝出来 经过一系列处理写到hal中。

hal 提供什么样的作用

hal的功能有定义的一系列的接口,主要就是打开声卡设备、然后往声卡设备里面写数据。hal提供给外部audioFlinger的主要接口是openDevice 和open_output_stream。不同vendor实现的方式不一样,目前看到的大部分的实现是基于tinyalsa提供的接口来实现对声卡控件的操作和声卡的读写。

  • open_output_stream

    实现是创建了stream_out结构体,并赋值实现stream_out结构体中的不同函数指针。并将这个结构体返回给外部调用。这个会转换为外部的结构体 AudioStreamOut。 这个结构体会传递到audioFlinger 创建MixerThread中,后续应用调用audiotrack的write 函数会调用到hal层的write函数hal层使用tinyalsa 或者alsa的写到内核驱动中。

  • out_write

    hal中只有在out_write里面才会真正的去打开底层的硬件 进行数据的写入。

总结:
总的来说, 外部 framework audioflinger 通过hal提供的接口创建出dev 和stream以用来获取hal层的能力,相关的接口实现在audio hal中有定义,然后audioFlinger 通过调用dev和stream的指针函数来操作hal,主要的接口有打开设备 打开流 写数据 读数据等等。

相关文章:

Android 音频框架 基于android 12

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件,每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…...

项目实践:类平面抓取点计算(占位,后面补充)

文章目录 文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_...

中央空调秒变智能 青岛中弘P15面板式空调网关初体验

在智能家居逐步渗透进千家万户的今天,如何将中央空调融入到智能化场景,以实现场景联动、提升家居生活的智能化和科技化程度,中弘给出了新的答案。本期智哪儿就带大家测评一下青岛中弘P15面板式空调网关,一起看看它的价值所在。 高…...

vue create -p dcloudio/uni-preset-vue my-project创建文件报错443

因为使用vue3viteuniappvant4报错,uniapp暂不支持vant4,所以所用vue2uniappvant2 下载uni-preset-vue-master 放到E:\Auniapp\uni-preset-vue-master 在终端命令行创建uniapp vue create -p E:\Auniapp\uni-preset-vue-master my-project...

本地电脑搭建Plex私人影音云盘教程,内网穿透实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语6 总结 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特…...

CI/CD 持续集成 持续交付

CI(Continuous integration)持续集成 参考:https://www.jianshu.com/p/2132949ff84a 持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。 持续集成的目的,是让…...

《Go 语言第一课》课程学习笔记(十一)

控制结构 if 的“快乐路径”原则 针对程序的分支结构,Go 提供了 if 和 switch-case 两种语句形式;而针对循环结构,Go 只保留了 for 这一种循环语句形式。 if 语句 if 语句是 Go 语言中提供的一种分支控制结构,它也是 Go 中最常…...

C++--完全背包问题

1.【模板】完全背包_牛客题霸_牛客网 你有一个背包,最多能容纳的体积是V。 现在有n种物品,每种物品有任意多个,第i种物品的体积为vivi​ ,价值为wiwi​。 (1)求这个背包至多能装多大价值的物品? &#xff0…...

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL(Python Imaging Library)模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能: import wx:导入 wx…...

为什么建议同时学多门编程语言

晨读一本名叫《4点起床》的书,书中有一段描述与最近学习编制语言时自己的感受完全一致。算是一个小经验,分享给大家。 书中有一章的标题为《同时学六国语言记起来比较快》,其中有两段描述如下: 为什么我推荐大家同时学不同的语言…...

langchain agent

zero-shot-react-description 代码 from langchain.agents import initialize_agent from langchain.llms import OpenAI from langchain.tools import BaseTool import os os.environ[OPENAI_API_KEY]"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"# 搜索…...

Zabbix下载安装及SNMP Get使用

帮助文档:6. Zabbix Appliance 一、zabbix下载安装 1、获取Zabbix Appliance镜像 Download Zabbix appliance 2、使用该镜像创建虚拟机 3、打开虚拟机控制台自动安装,等待安装完成即可 默认配置 系统/数据库:root:zabbix Zabbix 前端&am…...

freee Programming Contest 2023(AtCoder Beginner Contest 310)

文章目录 A - Order Something Else(模拟)B - Strictly Superior(模拟)C - Reversible(模拟)D - Peaceful Teams(DFS状压)E - NAND repeatedly(普通dp)F - Make 10 Again(状态压缩概率dp&#x…...

恒运资本:概念股是什么意思

概念股是指在特定的经济布景、方针环境、职业远景或社会热点等方面具有某种特别的发展远景和投资价值的股票。在投资者心目中,概念股的危险较大,可是或许带来高于商场平均水平的收益率。那么,概念股到底是什么意思?在本文中&#…...

十九、状态模式

一、什么是状态模式 状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色: 环境类&#xff08…...

MySQL用navicat工具对表进行筛选查找

这个操作其实很简单,但是对于没操作的人来说,就是不会呀。所以小编出这一个详细图解,希望能够帮助到大家。话不多说看图。 第一步: 点进一张表,点击筛选。 第二步: 点击添加 第三步: 选择要…...

音视频 ffplay简单过滤器

视频旋转 ffplay -i test.mp4 -vf transpose1视频反转 ffplay test.mp4 -vf hflip ffplay test.mp4 -vf vflip视频旋转和反转 ffplay test.mp4 -vf hflip,transpose1音频变速播放 ffplay -i test.mp4 -af atempo2视频变速播放 ffplay -i test.mp4 -vf setptsPTS/2音视频同…...

索引 事务 存储引擎

################索引##################### 一、索引的概念 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 ●使用索引后可以不用扫描全表来…...

MySQL— 基础语法大全及操作演示!!!(事务)

MySQL—— 基础语法大全及操作演示(事务) 六、事务6.1 事务简介6.2 事务操作6.2.1 未控制事务6.2.2 控制事务一6.2.3 控制事务二 6.3 事务四大特性6.4 并发事务问题6.5 事务隔离级别 MySQL— 基础语法大全及操作演示!!&#xff01…...

xsschallenge1~13通关详细教程

文章目录 XSS 挑战靶场通关level1level2level3level4level5level6level7level8level9level10level11level12level13 XSS 挑战靶场通关 level1 通过观察发现这个用户信息可以修改 那么我们直接输入攻击代码 <script>alert(/wuhu/)</script>弹框如下&#xff1a; …...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...