framework之Audio系统

本文深入解析Android音频系统的AudioTrack组件,包括AudioTrack的构造、缓冲区管理、数据流转,以及AudioFlinger如何处理AudioTrack的数据并写入HAL层。详细分析了audio_track_cblk_t在协调AudioTrack和AudioFlinger中的作用,同时探讨了AudioPolicyService在声音路由切换中的角色。此外,还介绍了AudioTrack的重点、声音路由实例切换过程以及DuplicatingThread在多路输出中的应用。
摘要由CSDN通过智能技术生成

Frame 帧数,1单位的Frame等于一个采样点的字数*声道数(r如PCM16,双声道的1个Frame为2*2=4字节),一般音频系统都是用它为单位来分配和管理的

AudioTrack:

AudioManager.STREAM_MUSIC 音频流的类型

8000采样频率,每秒8000个点

AudioFormat.CHANNEL_CONFIGUATION_STEREO 双声道

AudioFormat.ENCODING_PCN_16BIT 采样精度:一个采样点16bit,相当于2个字节

bufsize以帧为单位的缓冲区大小

AudioTrack.MODE_STREAM数据加载模式

Audio系统对外提供的API,构造AudioTrack的参数:最后一个参数为数据加载模式,有Mode_STREAM和MODE_STATIC,第一种需要把用户提供的数据

Buffer拷贝到AudioTrack的Buffer中,一定程度上会引起延时,第二种由于是静态的,可直接调用,但这时的Buffer不能太多,否则系统无法分配足够的内存来存储全部数据。

调用native层的native_setup函数,调用AudioTrackJniStorage,new 一个AudioTrack,调用无参的构造函数,再调用Set方法填充,更新AudioTrack的参数。

AudioTrack.getMinBufferSize():调用Native函数,通过JNI查询HAL层硬件的相关信息,比如该硬件支持的最高采样率,硬件内部缓冲的大小(以Frame为单位),会综合考虑硬件的情况,得出一个最小缓冲区的大小,一般分配的缓冲大小是它的整数倍。

AudioTrackJniStorage用到了Android对共享内存的封装类,MemoryHeapBase打开/dev/ashmem设备,mapfd(fd,size)创建共享内存。MemoryBase通过MemoryHeapBase构造,即两个类都可以共享这块内存。

调用AudioTrack的start函数,通过native调用

调用AudioTrack的write函数,然后stop,最后调用native的delete

AudioTrack的set方法,利用Binder机制,实现IAudioTrack,在IAudioTrack中有一块共享内存,头部是一个audio_track_cblk_t(CB)对象,协调和管理AudioTrack和AudioFlinger的步伐。AudioTrack支持两种数据输入方式,push方式:用户主动write写数据;pull方式:主动从用户那pull数据。

write:先obtainBuffer 从

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值