好久没写博客了,最近整理了下画的流程图和描述图,这次是关于Android5.0里新加的Patch Panel,使用了Audio Patch机制来实现的,正所谓有图有真相,具体请看图。
Patch Panel的路径:frameworks/av/services/audioflinger/PatchPanel.cpp
- Patch Panel有关的结构:
一个Audio Patch用来表示一个或多个source端到一个或多个sink端。这个是从代码的注释翻译来的,大家可以把它比作大坝,可以有好几个入水口和出水口,每次储水和防水的入水口和出水口的数量可以不一样多,比如一个入水口和两个出水口。实际场景就是一个音频文件播放到喇叭和耳机里,或者两个麦克风录左右声道到一个音频文件里。
应用也可以直接用这个特性的,但是前提是先要有这个permission: android.permission.MODIFY_AUDIO_ROUTING
就像刚刚说的那样一个Audio Patch有多个source端和多个sink端,所以audio_patch的结构体里就有了两个array,这里每个端口都是一个audio_port。
这个port里都包含了基本需要的一些基本参数,包括stream和device的。大家看名字脑补下吧。
一些新的函数列一下:
每个audio_patch都会通过APS指定的参数在Audioflinger生成,然后通过Audioflinger调用被AudioHAL处理。
(红线是创建过程,蓝线是处理过程)
- Audio Patch的使用场景(1): Mix即stream播放到多个Devices即硬件
一般在setOutputDevice里使用,替换原来的setParameters方式。
流程图什么的:
- 使用场景(2):Device到Mix,即从一个硬件设备录音到一个音轨上。
LP5.0里新加了setIntputDevice来替换原来output里做的事情,这里会使用这个场景。
流程图:
- 使用场景(3):Device到Device,这个比较难理解,熟悉audio的人可以把它看做两个HAL通过Audioflinger互传数据,中间不走encoder什么的处理。
流程图:
这里要说一下两个device之间用的buffer(现在的Track在LP5.0已改,也包括了空间申请方式,以迎合这个使用场景),具体请看图,很久之前画的,时间长了我也感觉说不清楚了。
流程图:
- 咱们可以看个具体的实现来理解这个东西:使用USB设备来打电话
(前提是USB的线没连在你的codec上,而且电话的数据连在了你的codec上,有点绕口,具体看图)
当然这个是google自己干的,不是我胡编的使用场景 。。。我们伟大的eric大湿!
一些新的函数和变量:
画了很久勉强能看懂的示意图:
大意如下:
TX的数据从USB设备通过两个线程传到CP电话远端。
RX的数据从CP电话远端通过两个线程传到USB设备。
简约流程图:
- Audio Patch当然还能调音量:
而且APP也能直接调音量,每个音量调节也是一个audio_patch,然后HAL进行处理。
这个也是Google干的:
示意图(图里的MAP是我司非常牛逼非常强大宇宙第一的超高性能逆天绝无仅有的一款DSP处理器):
流程图:
不好意思,吹牛逼吹完了,没了 。。。END
版权声明:本文为博主原创文章,未经博主允许不得转载。