干,认识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,一经查实,立即删除!

相关文章

画图板-- 中点算法画圆

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

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

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

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

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

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

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

last_kmsg和ram console

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

字符串类

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

github网页

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

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

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

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

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

51单片机——硬件基础

单片机——硬件基础知识 宗旨:技术的学习是有限的,分享的精神是无限的。 1、单片机内部资源 STC89C52:8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源 (1)Flash(硬盘)——程…

马上工作了,想问下要注意哪些问题?

这是一位读者在知识星球提问的,涉及的内容很多,但是这些问题,我觉得很多人都需要注意,分享出来让大家看,也希望留言说下自己的看法。1一、 offer情况 1. 已签三方 2. 公司是国内靠前的芯片原厂,深圳&#x…

CSS绘图

1. 自适应的椭圆 背景知识:border-radius属性的基本用法 使用border-radius制作一个圆很简单,只要给任何正方形元素设置固定宽高及一半长度以上的border-radius,就可以得到圆形 1234background: #fb3;width: 200px;height: 200px;border-radi…

51单片机——定时器

单片机——定时器 宗旨:技术的学习是有限的,分享的精神是无限的。 1、定时器和计数器 时钟周期:单片机时序中的最小单位,集体计算的放法就是时钟源分之一 机器周期:单片机完成一个操作的最短时间,12个时钟…

当年要是这样搞,我的C++也不至于这样!

C一直被称作永不过时的开发语言,比如游戏、服务器、人工智能等领域都必须用到C!虽然网上有很多教程和资料,但仍有很多人说C难学,究其原因是没有找到正确的学习方法!GoogleTest框架一直广泛应用于C/C项目测试 &#xff…

ABP之创建实体

ABP框架是一个非常庞大的框架,里面的东西有很多,那么如果我需要使用ABP进行项目的开发,具体的使用流程是怎样的呢?接下来将以一个简单的电影票管理“系统”为例子具体的实现一下。 一. 实体的创建 实体是属于领域层的,…

三亚野生植物园

近来朋友外出旅游颇多,大家分享快乐和美景的同时,文字往来也丰富。我的三亚行也该落幕了,休整得差不多了,重整行装,再踏旅途……诸君逍遥游芙蓉叶残桂满岩,粤女梦起游天姥。白塔青湖鸣沙丘,渡海峨眉牵白鹿。…

10张图22段代码,万字长文带你搞懂虚拟内存模型和malloc内部原理

成功是急不来的。不计较眼前得失,将注意力真正着眼于正在做的事情本身,持续付出努力,才能一步步向前迈进,逐渐达到理想的目标。不着急,才能从容不迫,结果自会水到渠成。大家好,我是程序喵&#…

51单片机——中断

单片机——中断 宗旨:技术的学习是有限的,分享的精神是无限的。 1、中断:放下手中的事情去处理另一种事情。 2、定时器中断 定时器是单片机模块的一个资源,确确实实存在的一个模块,中断是单片机的一种运行机制。不是一…

转!!ftp的主动模式(port)与被动模式(PASV)

转自 http://www.phpweblog.net/killjin/archive/2008/01/06/2653.htmlftp中主动模式(port)与被动模式(PASV)目录 开场白 基础 主动FTP 主动FTP的例子 被动FTP 被动FTP的例子 总结 参考资料 附录 1: 配置常见FTP服务器 开场白 处理防火墙和其他网络连接问题时最常见的…

深入MTK平台bootloader启动分析笔记

bootloader到kernel启动总逻辑流程图ARM架构中,EL0/EL1是必须实现,EL2/EL3是选配,ELx跟层级对应关系:EL0 -- appEL1 -- Linux kernel 、lkEL2 -- hypervisor(虚拟化)EL3 -- ARM trust firmware 、pre-loade…