干,认识Audio框架还因此发现一个雷



我们最近出了一个问题,我们点击播放音乐,然后再点击停止播放的时候,喇叭还会输出一段杂音后喇叭才会停止输出

经过排查发现,在代码里面就做了这个功能

代码在AudioFlinger.h 里

frameworks/av/services/audioflinger/AudioFlinger.h

为啥有这个功能?

我咨询了一个大佬,是这样回复的

这个操作应该是做来解决一直开关导致的po音的 看看有没有数据帧的callback在停的时候有没有再被调用,你关了3S秒是有可能有popo音的

再声明下,这个 3s 的时间是Google默认设定的时间,如果是做音频的同学,可以关注一下这个特性,而且是自己的产品的话,需要根据自己的要求进行修改。

来一张audio框架图片

Audio代码位置

AudioTrack.java
framework/base/media/java/com/android/media/AudioTrack.javaandroid_media_track.cpp
framework/base/core/jni/android_media_track.cppMemoryHeapBase
framework/base/libs/binder/MemoryHeapBase.cppMemoryBase.h
framework/base/include/binder/MemoryBase.hAudioTrack.cpp
framework/base/libmedia/AudioTrack.cppaudio_track_cblk_t声明
framework/base/include/private/media/AudioTrackShared.haudio_track_cblk_t定义
framework/base/media/libmedia/AudioTrack.cppMain_MediaServer.cpp
framework/base/media/mediaserver/Main_MediaServer.cppAudioFlinger.cpp
framework/base/libs/audioFlinger/AudioFlinger.cppAudioHardwareInterface.h 不同厂商的HAL位置会不同
hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.hAudioMixer.cpp
framework/base/libs/audioflinger/AudioMixer.cppAudioSystem.h
framework/base/include/media/AudioSystem.hAudioSystem.cpp
framework/base/media/libmedia/AudioSystem.cppAudioPolicyInterface.h
hardware/libhardware_legacy/include/hardware_legacyAudioPolicyManagerBase.cpp
framework/base/libs/audioflinger/AudioPolicyManagerBase.cppAudioService.java
framework/base/media/java/com/android/media/AudioService.javaAndroid_media_AudioSystem.cpp
framework/base/core/Jni/Android_media_AudioSystem.cpp

主要要关注audioflinger和audiopolicy这两个服务

再看看一些调用关系的图片

AudioTrack

AudioTrack属于Audio系统对外提供的API接口类,在java层和native层都有对应类。

AudioFlinger 

AudioFlinger是audio的核心,AudioTrack的数据需要经过AudioFlinger进行混音等处理,这里的数据最终会写入到Audio 的HAL层。

audioFlinger和audiopolicy实例化

AudioFlinger::instantiate();
AudioPolicyService::instantiate();

AudioPolicy

AudioFlinger控制的是输入和输出,AudioPolicyService控制着整个音频系统,所以AudioPolicy创建完成后,音频系统也就开始工作了。

我们在很多地方看到有资料说的,AudioPolicy是音频系统的策略管理系统,也就是这个意思。

推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

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

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

相关文章

画图板-- 中点算法画圆

为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。圆心位于原点的圆有四条对称轴…

插入排序法

插入排序法 宗旨:技术的学习是有限的,分享的精神是无限的。 构思: 1.读入欲排序的数值 2.使用插入排序法 (1)依序将数值插入 (2)插入前和已排好好序的每一个数值比较 (3&#…

Linux 内核如何描述一个进程?

哈喽,我是吴同学,继续记录我的学习心得。一、关于写文章许多知识,书上或者网络上都有,就算这两个地方都没有,代码里也会有答案。但有时恰恰是 资料太多,反而让人难以检索出有用的信息。面对同样的资料&…

供应商关系管理SRM为企业的节流增贡献

在供应链下游的需求链上,企业为了增加市场份额、提高销售收入,更为重视面向客户的管理和信息化管理方面的投入,纷纷引入客户关系管理CRM的管理理念和信息化系统,在“客户第一”的经营策略下借助IT技术的手段来提高对客户的服务水平…

C小项目——电子词典

C语言项目——查字典 宗旨:技术的学习是有限的,分享的精神是无限的。 【项目需求描述】 一、单词查询 给定文本文件“dict.txt”,该文件用于存储词库。词库为“英-汉”,“汉-英”双语词典,每个单词和其解释的格式固…

线性表的顺序存储的基本操作

插入&#xff1a; #include<stdio.h> #define N 100 typedef struct s {int elem[N];int last; }Seqlist; int Locate(Seqlist l,int e)//查找 {int i0;while(i<l.last&&l.elem[i]!e)i;if(i<l.last)return i1;elsereturn 0; } int DelList(Seqlist *l,int …

canvas生成二维码(2)

不同的插件实现相同的效果&#xff0c;用起来更简洁一些&#xff0c;引用插件qrcode.js 创建一个新的QRCode对象&#xff0c;利用动漫节点和data数据进行复制&#xff0c;实现生成图片img的二维码&#xff1a; 详细见下方代码&#xff1a; <!DOCTYPE html PUBLIC "-//W…

UART/I2C/SPI/1-wire四大通信接口的神解释

1、 裘千丈轻功水上漂之UART射雕英雄传中的裘千丈说&#xff0c;UART就是我的轻功水上漂过河。想从河上过&#xff08;通信&#xff09;&#xff0c;提前布暗桩&#xff0c;行走时步伐按桩距固定&#xff08;波特率提前确定&#xff09;&#xff0c;步幅太大或太小都会落水。为…

动漫迷看的一点动漫

个人看过的动漫 (注&#xff1a;排名不分先后) 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、魔法科高中的劣等生&#xff1a;国立魔法大学附属第一高校——通称“魔法科高校”&#xff0c;是由成绩优秀的“一科生”&#xff0c;和作为一科生替补的…

last_kmsg和ram console

相关文章Android 7.1使用脚本保存LOGCAT和KMSG日志到文件首先&#xff0c;在kernel里面通过printk吐log的时候会是下面的一个过程&#xff1a;printk会将信息格式化到kernel log buffer里面去。然后将这些格式化信息送到console去&#xff0c;在我们的系统里面有两个console&am…

字符串类

1.String类 常用方法&#xff1a; 参考&#xff1a;http://wenku.baidu.com/link?urltz-3Dpwj-JSJQdG6vSo0J1L1G9oJS4eQJjYgogieIzgjdNNLmj-U9EpWhOnVthz4egAKv0SNmLkqzNz2WsiZ2EmPGMu2UXhB6yy-E4yvMQ3 NB&#xff1a; 这里的”s1s2“是地址相等,而是s1.equals(s2)是内容相等…

github网页

GitHub主页创建仓库想必大家都有自己的Github账号吧&#xff0c;没有的可以到GitHub官网注册账号&#xff0c;注册完后&#xff0c;我们来下一步&#xff0c;在我们的GitHub上面右上角的New repository来创建一个仓库。 仓库名必须遵守相应格式&#xff1a;your_username.githu…

企业应该如何选型ERP?

企业应该如何选型ERP呢?!其实说起这个话题, 是源于我们公司所在的镇里,镇长带着两个企业的企业家,到我们公司指名让我给他们讲讲. 俗称:取经我是乐意的,因为做了这么久的顾问了,感觉不像是顾问了,倒成了传教士了. 总喜欢说上两句.然后把自已的观点或看法,希望传给别人,然后影…

有用的Copy-On-write,写时复制

写时复制和写时拷贝是一个意思写时复制是一种策略&#xff0c;并不是Linux独有的&#xff0c;如果你正在设计某个系统架构&#xff0c;也可以参考这种思想。写时复制的英文解释如下Copy-on-write (sometimes referred to as "COW") is an optimization strategy used…

lambda应用

def test(a, b, func):result func(a, b)print(result)test(10, 15, lambda x, y: x y) #codingutf-8 #python2需要加上codingutf-8def test(a, b, func):result func(a, b)return result #python2中的方式 #func_new input("请输入一个匿名函数:")#python3中的方…

51单片机学习

单片机学习 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 学习使用单片机就是理解单片机硬件结构&#xff0c;在汇编或C语言中学会各种功能的初始化设置&#xff0c;以及实现各种功能的程序编制。 第一步&#xff1a;数字I/O的使用 使用按钮输入信…

数据库操作,内外联查询,分组查询,嵌套查询,交叉查询,多表查询,语句小结...

为了大家更容易理解我举出的SQL语句&#xff0c;本文假定已经建立了一个学生成绩管理数据库&#xff0c;全文均以学生成绩的管理为例来描述。 1.在查询结果中显示列名&#xff1a; a.用as关键字&#xff1a;select name as 姓名 from students order by age b.直接表示&#x…

雷军:如果程序人生的话,这条路太漫长

这篇文章是在雷总个人博客看到的&#xff0c;里面聊到了他作为程序员的一些经历、初衷以及思考。写的不错&#xff0c;便转来给大家看看。-- 如果程序人生的话&#xff0c;这条路太漫长我并非天生喜欢写程序&#xff0c;上高中时也没有想过程序员的生活。我学电脑非常偶然&…

跨年操作--new Date()

//时间在2017/12/31 17&#xff1a;00 --- 2018/1/1 06:00区间&#xff0c;提示用户无法操作公告。 //time.js (function(){ var date new Date(); //当前年份 var year date.getFullYear(); //当前月份 var month date.getMonth()1; //当前日 var day date.getDate(); //当…

List接口

List接口是collection接口的子接口&#xff0c;对collection进行了简单的扩充&#xff0c;添加了利用索引&#xff08;“位置序”&#xff09;作为参数或者返回类型的方法。List中存放的对象都有一个整数型的型号&#xff0c;记录该对象在容器中的位置&#xff0c;可以根据序号…