Android11 AudioTrack和Track建立联系

应用程序创建AudioTrack时,导致AudioFlinger在播放线程中,创建Track和其对应。那它们之间是通过什么来建立联系传递数据的?答案是共享内存。
创建Track时,导致其父类TrackBase的构造函数被调用

//frameworks/av/services/audioflinger/Tracks.cpp
AudioFlinger::ThreadBase::TrackBase::TrackBase(/*省略*/){//省略size_t size = sizeof(audio_track_cblk_t);//大小为audio_track_cblk_tif (buffer == NULL && alloc == ALLOC_CBLK) {//如果客户端没有申请过共享内存//省略size += bufferSize;//大小要加上buffer的大小}/*开始申请了*/if (client != 0) {mCblkMemory = client->heap()->allocate(size);if (mCblkMemory == 0 ||(mCblk = static_cast<audio_track_cblk_t *>(mCblkMemory->unsecurePointer())) == NULL) {//省略return;}} else {mCblk = (audio_track_cblk_t *) malloc(size);//省略}if (mCblk != NULL) {new(mCblk) audio_track_cblk_t();switch (alloc) {//省略case ALLOC_CBLK:// clear all buffersif (buffer == NULL) {//由AudioFlinger申请的共享内存mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);//要加上audio_track_cblk_t,才是指向的真实buffermemset(mBuffer, 0, bufferSize);} else {mBuffer = buffer;//由客户端申请的内存,mBuffer 直接指向它}break;}}
}

可以看出,共享内存可以由客户端申请,也可以由AudioFlinger申请。
客户端已经申请了buffer:
AudioFlinger这边,只会申请audio_track_cblk_t头部信息,不会再去申请buffer了,而是直接将mBuffer 指向客户端申请的buffer

客户端没有申请buffer:
AudioFlinger这边除了申请audio_track_cblk_t外,还会去申请buffer,并且将mBuffer 指向自己申请的这块buffer

管理共享内存

共享内存创建好之后,客户端和AudioFlinger都需要管理这块内存。AudioFlinger通过mServerProxy来管理

//frameworks/av/services/audioflinger/Tracks.cpp
if (sharedBuffer == 0) {mAudioTrackServerProxy = new AudioTrackServerProxy(mCblk, mBuffer, frameCount,mFrameSize, !isExternalTrack(), sampleRate);} else {mAudioTrackServerProxy = new StaticAudioTrackServerProxy(mCblk, mBuffer, frameCount,mFrameSize, sampleRate);}mServerProxy = mAudioTrackServerProxy;

对于是客户端创建的内存,使用 StaticAudioTrackServerProxy 来管理,对于AudioFlinger创建的内存,使用AudioTrackServerProxy来管理。

客户端通过mProxy来管理

//frameworks/av/media/libaudioclient/AudioTrack.cpp
//省略
sp<IMemory> iMem = track->getCblk();//获取内存地址,包含了audio_track_cblk_t头部地址
void *iMemPointer = iMem->unsecurePointer();//指向它audio_track_cblk_t* cblk = static_cast<audio_track_cblk_t*>(iMemPointer);
mCblk = cblk;void* buffers;
if (mSharedBuffer == 0) {//AudioFlinger申请的内存buffers = cblk + 1;//指向buffer
} else {buffers = mSharedBuffer->unsecurePointer();
}// update proxyif (mSharedBuffer == 0) {mStaticProxy.clear();mProxy = new AudioTrackClientProxy(cblk, buffers, mFrameCount, mFrameSize);} else {mStaticProxy = new StaticAudioTrackClientProxy(cblk, buffers, mFrameCount, mFrameSize);mProxy = mStaticProxy;}

对于是客户端创建的内存,客户端使用 StaticAudioTrackClientProxy来管理,对于AudioFlinger创建的内存,使用AudioTrackClientProxy来管理。

总结
AudioTrack和Track之间通过共享内存来建立联系,这个内存可以由客户端的AudioTrack创建,也可以由AudioFlinger的Track创建。但是audio_track_cblk_t一定是由Track创建的。客户端和AudioFlinger分别通过mProxy 和mServerProxy 来管理这块内存。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化时代还需要传统智慧图书馆吗

尽管以电子阅览室代表的数字化时代带来了许多便利和创新&#xff0c;但传统智慧图书馆依然具有重要的价值和意义。以下是一些原因&#xff1a; 1. 保存历史文化&#xff1a;传统智慧图书馆是保存历史文化遗产的重要载体&#xff0c;收藏了许多珍贵的古籍、手稿和纸质图书&#…

Prop 和 State 有什么区别?

Prop (属性) 和 State (状态) 是 React 中两个非常重要的概念,它们之间有以下几个主要区别: 来源:Prop 是父组件传递给子组件的数据。State 是组件内部维护的数据。可变性:Prop 是不可变的(immutable)。一旦父组件传递给子组件,子组件就无法直接修改 prop。State 是可变的(mut…

基于 Amazon EC2 快速部署 Stable Diffusion WebUI + chilloutmax 模型

自2023年以来&#xff0c;AI绘图已经从兴趣娱乐逐渐步入实际应用&#xff0c;在众多的模型中&#xff0c;作为闪耀的一颗明星&#xff0c;Stable diffusion已经成为当前最多人使用且效果最好的开源AI绘图软件之一。Stable Diffusion Web UI 是由AUTOMATIC1111 开发的基于 Stabl…

力扣2090.半径为k的子数组平均值

力扣2090.半径为k的子数组平均值 accumulate函数&#xff1a;求一段和(起始迭代器&#xff0c;终止迭代器&#xff0c;初始值) class Solution {public:vector<int> getAverages(vector<int>& nums, int k) {int n nums.size();vector<int> res(n,-1…

Java密码复杂度实现

在Java中实现密码复杂度验证&#xff0c;通常需要考虑以下几个因素&#xff1a; 密码长度&#xff1b; 包含大写字母&#xff1b; 包含小写字母&#xff1b; 包含数字&#xff1b; 包含特殊字符&#xff08;可选&#xff09;。 以下是一个简单的Java类&#xff0c;用于验…

江苏服务器租用的优势有哪些?

随着互联网科技的快速发展&#xff0c;网络行业也逐渐开始兴起&#xff0c;而网络服务则离不开服务器的使用&#xff0c;那么江苏服务器租用对于其它地区来说都哪些优势呢&#xff1f; 江苏省是经济发展比较迅速的地区&#xff0c;所以江苏的企业对于网络方面的发展也是十分快速…

vue-cl-service不同环境运行/build配置

概述 在项目开发过程中&#xff0c;同一个项目在开发、测试、灰度、生产可能需要不同的配置信息&#xff0c;所以如果能根据环境的不同来设置参数很重要。 vue项目的vue-cl-service插件也支持不同环境的不同参数配置和打包。 实现 新建不同环境配置文件 vue项目中的配置文件以…

面向对象程序设计之从C到C++的初步了解

1. C语言 1. C的发展 C是从C语言发展演变而来的&#xff0c;首先是一个更好的C引入了类的机制&#xff0c;最初的C被称为“带类的C”1983年正式取名为C 从1989年开始C语言的标准化工作 于1994年制定了ANSIC标准草案 于1998年11月被国际标准化组织(ISO)批准为国际标准&#xf…

QT的窗口坐标和全局坐标

1、定义解释 窗口坐标&#xff1a;创建的窗口的坐标&#xff0c;以窗口左上角点为原点&#xff0c;横向往右为x轴正向&#xff0c;竖向往下为y轴正向。 全局坐标系&#xff1a;电脑屏幕的坐标系&#xff0c;以电脑屏幕左上角点为原点&#xff0c;横向往右为x轴正向&#xff0…

Ubuntu系统安装

目录 安装准备 安装步骤 虚拟机配置 系统安装 安装准备 Ubuntu系统镜像&#xff0c;虚拟机环境 虚拟机环境 使用的虚拟机软件为VMware Workstation 系统镜像 阿里镜像站&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com)https://developer.aliyun.com…

记一次使用mysql存储过程时,游标取值为空问题

call modify_collation(num,count_num) > 1146 - Table test.table_name doesnt exist > 时间: 0.009s 我在使用mysql存储过程时&#xff0c;打印时游标取值为空&#xff0c;报错找不到表。我的过程语句是这样的&#xff1a; drop procedure if exists modify_collation…

【电源专题】一体成型电感为什么需要注意耐压问题

对于电感,我们在电路上使用的很多,如升压、降压、滤波等电路中基本上使用到了电感。电感的种类有很多,电感从不同的角度会有不同的分类。如可以根据否屏蔽、工艺类型、磁性材料类型等可分为多类,这在文章:【分立元件】电感器(inductor)——简介中有做了一些简单的介绍。…

【Qt】之【项目】整理可参考学习的git项目链接(持续更新)

Tcp 通信相关 IM即时通讯设计 高并发聊天服务&#xff1a;服务器 qt客户端&#xff08;附源码&#xff09; - DeRoy - 博客园 未使用protobuf通讯协议格式 github&#xff1a;GitHub - ADeRoy/chat_room: IM即时通讯设计 高并发聊天服务&#xff1a;服务器 qt客户端 QT编…

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…

python使用反射创建对象问题

在python中没有发现类似j ava可以使用全限定类名创建对象的方法。 例如&#xff1a;java可以使用Class.forName(全限定类名)这样就可以简单的创建一个对象了。 python中也可以使用反射方式创建对象&#xff0c;稍微比较复杂。 第一步&#xff1a;导入py文件模块 # test_valida…

THS6011启动控制台后无法使用https访问控制台(by yz+lqw)

原因&#xff1a; 6011相对于6010版本&#xff0c;多了一个ssl的开关&#xff0c;下图是6010版本的参考配置&#xff1a; 而6011版本下的conf目录下的http.yaml&#xff0c;里面的ssl开关&#xff0c;默认是关闭的&#xff0c;也就是enable:false. 所以需要把enable&#xf…

构建LangChain应用程序的示例代码:9、使用Anthropic API生成结构化输出的工具教程

使用Anthropic API生成结构化输出的工具 Anthropic API最近增加了工具使用功能。 这对于生成结构化输出非常有用。 ! pip install -U langchain-anthropic可选配置&#xff1a; import osos.environ[LANGCHAIN_TRACING_V2] true # 启用追踪 os.environ[LANGCHAIN_API_KEY…

echarts-series的x,y轴的规则

series的data与x,y轴的匹配规则 如果series的data为[1,2,3,4,5,6] 1.如果x,y轴都是类目轴&#xff0c;且data没有与x,y轴的值匹配上&#xff0c;则无效。 2.如果x,y轴都为类目,data中能够跟类目轴上的字符串对应上&#xff0c;轴&#xff0c;有效。 3.如果都为value.,则按数值…

实验四:基于System-Verilog的FPGA设计与仿真

实验四&#xff1a;基于System-Verilog的FPGA设计与仿真 实验目的&#xff1a; 学习和掌握System Verilog基本语法&#xff0c;在DE2-115开发板上重新设计之前做过的Verilog练习&#xff0c;如流水灯、全加器或者VGA显示、超声波测距 等&#xff0c;并完成 testbench 仿真。 …

定时开放防火墙端口,并自动关闭

限时开放端口脚本 manage_port.sh 使用说明 简介 manage_port.sh 是一个用于在 Linux 系统上临时开放并随后关闭指定端口的脚本。该脚本接受端口号和时间&#xff08;以分钟为单位&#xff09;作为参数&#xff0c;并根据系统自动检测使用 ufw 或 firewalld 防火墙来管理端口…