您的位置:首页 > 移动开发 > Android开发

在Android5.0上Audio Patch和Patch Panel的一些分析

2015-08-14 14:59 1486 查看
好久没写博客了,最近整理了下画的流程图和描述图,这次是关于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: