在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
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
相关文章推荐
- Android-ViewPager+Fragment数据更新问题
- android 暂停和继续第三方应用的语音播放
- Android笔记(六) Android中的组件
- 【Android】四大组件(1)Activity详解
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(27) 看看我的手机里都有什么传感器
- android开发(28) 做个 指南针 应用
- android开发(29) 自定义曲线,可拖动,无限加载
- android开发(25) - 推送的实现,使用百度云推送
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- Android的SQLite如何判断一列是否存在
- arcgis for android 学习 - (8) 空间查询 - 点击某点,选中该点所在单位区域。
- android开发(23)使用DownloadManager下载文件
- android开发(24)使用SQLiteOpenHelper的onUpgrade实现数据库版本升级
- android开发(16) 遍历所有的已经安装的应用程序,启动其他的应用程序
- android开发(17) 扫描二维码 - 调用第三方APK来实现二维码扫描,参考自 开源项目zxing
- android开发(18) 调用手机的麦克风录音,并播放。
- android开发(19) 调用手机的摄像头录像,并播放。
- android开发(20) 使用adb建立pc和android设备之间的连接。usb连接方式。
- android开发(21)蜂鸣提示音和震动提示的实现。