当前位置: 代码迷 >> Android >> 在Android5.0上Audio Patch跟Patch Panel的一些分析
  详细解决方案

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

热度:100   发布时间:2016-04-27 23:28:35.0
在Android5.0上Audio Patch和Patch Panel的一些分析

好久没写博客了,最近整理了下画的流程图和描述图,这次是关于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

版权声明:本文为博主原创文章,未经博主允许不得转载。