一、Audio音频架构简介美国十次啦宜春院
二、Android Audio系统框架
三、Audio架构以及各层的代码分散图
四、音频框架在Android系统中的进一步细化
五、创建声卡和注册声卡
六、Android Audio系统的结构
七、Audio音频旨趣先容
八、Audio音频计谋制定与计谋施行的调用经过
九、Android AudioPolicyService做事启动过程
十、Android系统中总共的音频接口耕作保存到AudioFlinger的成员变量mAudioHwDevs中
十一、audio_policy.conf同期界说了多个audio接口
十二、通过AudioFlinger的loadHwModule加载各audio接口对应的库文献已毕调用PlaybackThread播放线程或RecordThread灌音线程
十三、AudioFlinger的openInput()方法调用经过分析
十四、AudioFlinger的openOutput()方法的调用经过分析
十五、Audio系统为了能往常播放音频数据,需要创建轮廓的音频输出接口对象,绽开音频输出过程
十六、绽开音频输入的经过
十七、绽开音频输出后,在AudioFlinger与AudioPolicyService中的阐扬神志
十八、绽开音频输入后,在AudioFlinger与AudioPolicyService中的阐扬神志
十九、AudioPolicyService加载完系统界说的总共音频接口,并生成相应的数据对象
二十、AudioPolicyService与AudioTrack和AudioFlinger的联系
二十一、AudioPolicyService注册名为做事的经过
二十二、AudioTrack构造过程
二十三、AudioTrack和AudioFlinger的联系
二十四、audio_policy与AudioPolicyService、AudioPolicyCompatClient之间的联系
图片
一、Audio音频架构简介
APP
通盘音频体系的最表层
Framework
MediaPlayer和MediaRecorder、AudioTrack和AudioRecorder,Android系统为戒指音频系统提供了AudioManager、AudioService及AudioSystem类,这些齐是framework为便利表层诈欺设备所筹画的
Libraries
系统做事AudioFlinger和AudioPolicyService(比如:ServiceManager、LocationManagerService、ActivityManagerService等等),音频体系中另一个伏击的系统做事是MediaPlayerService
HAL
硬件轮廓层是AudioFlinger平直拜谒的对象,这评释了两个问题,一方面AudioFlinger并回击直调用底层的驱动措施;另一方面,AudioFlinger表层(包括和它归并层的MediaPlayerService)的模块只需要与它进行交互就不错已毕音频接洽的功能了。因而咱们不错以为AudioFlinger是Android音频系统中真的的“休止板”,岂论底下如何变化,表层的已毕齐不错保抓兼容。音频方面的硬件轮廓层主要分为两部分,即AudioFlinger和AudioPolicyService。骨子上后者并不是一个真的的耕作,仅仅选用编造耕作的形态来让厂商不错浅陋地定制出我方的计谋,轮廓层的任务是将AudioFlinger/AudioPolicyService真的地与硬件耕作关联起来
往常Android系统中的Audio系统依赖于ALSA-lib,但后期就变为了tinyalsa,这么的转移不应该对表层形成破损。因而Audio HAL提供了斡旋的接口来界说它与AudioFlinger/AudioPolicyService之间的通讯形态,这便是audio_hw_device、audio_stream_in及audio_stream_out等等存在的指标,这些Struct数据类型里面大多仅仅函数指针的界说,是一些“壳”。当AudioFlinger/AudioPolicyService启动化时,它们会去寻找系统中最匹配的已毕(这些已毕驻留在以audio.primary.*,audio.a2dp.*为名的多样库中)来填充这些“壳”
贯串Android音频系统的本事分为两条萍踪
以库为萍踪,比如:AudioPolicyService和AudioFlinger齐是在libaudioflinger库中,而AudioTrack、AudioRecorder等一系列已毕则在libmedia库中
以进度为萍踪,库并不代表一个进度,进度则依赖于库来运行。固然有的类是在归并个库中已毕的,但并不代表它们会在归并个进度中被调用。比如AudioFlinger和AudioPolicyService齐驻留于名为mediaserver的系统进度中,而AudioTrack/AudioRecorder和MediaPlayer/MediaRecorder不异骨子上仅仅诈欺进度的一部分,它们通过binder做事来与其它系统进度通讯
二、Android Audio系统框架
图片
三、Audio架构以及各层的代码分散图
图片
四、音频框架在Android系统中的进一步细化
图片
五、创建声卡和注册声卡
图片
六、Android Audio系统的结构
图片
七、Audio音频旨趣先容
AudioFlinger、AudioPolicyService和AudioTrack/AudioRecorder抛开MediaPlayer、MediaRecorder这些与诈欺设备平直关联的部分,通盘音频系统的核心便是由这三者构建而成的。其中前两个齐是System Service,驻留在mediaserver进度中,不休地处理AudioTrack/AudioRecorder的申请。音频的回放和录制从大的经过上看齐是相似的,是以咱们侧重于对AudioTrack的分析
把总共媒体接洽的native层做事(包括AudioFlinger,MediaPlayerService,CameraService和AudioPolicyService)启动起来,编译生成的mediaserver将被烧录到耕作的/system/bin/mediaserver旅途,然后由系统启动时的init进度启动
Audio系统的结构
libmedia.so提供Audio接口,这些Audio接口既进取层开放,也向土产货代码开放
libaudiofilnger.so提供Audio接口已毕
Audio硬件轮廓层提供到硬件的接口,供AudioFlinger调用
Audio使用JNI和JAVA对表层提供接口
media库中的Audio框架部分
Android 的Audio的核心框架在media库中提供,其中对上头主要已毕AudioSystem、AudioTrack和AudioRecorder三个类。提供了IAudioFlinger类接口,在这个类中,不错取得IAudioTrack和IAudioRecorder两个接口,分歧用于声息的播放和录制。AudioTrack和AudioRecorder分歧通过调用IAudioTrack和IAudioRecorder来已毕
三上悠亚 肛交Audio系统的头文献
旅途为:frameworks/base/include/media/
AudioSystem.h
IAudioFlinger.h
AudioTrack.h
IAudioTrack.h
AudioRecorder.h
IAudioRecorder.h
Ixxx的接口通过AudioFlinger来已毕,其他接口通过JNI进取层提供接口
Audio系统的头文献在frameworks/base/include/media/目次中,主要的头文献如下
AudioSystem.h:media库的Audio部分对表层的总管接口
IAudioFlinger.h:需要基层已毕的总管接口
AudioTrack.h:放音部分对上接口
IAudioTrack.h:放音部分需要基层已毕的接口
AudioRecorder.h:灌音部分对上接口
IAudioRecorder.h:灌音部分需要基层已毕的接口
IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h这三个接口通过基层的收受来已毕(即:AudioFlinger)
AudioFlinger.h,AudioTrack.h和AudioRecorder.h是对表层提供的接口,它们既供土产货措施调用(举例:声息的播放器、录制器等),也不错通过JNI向Java层提供接口
AudioTrack和AudioRecorder齐具有start,stop和pause等接口。前者具有write接口,用于声息的播放,后者具有read接口,用于声息的录制
AudioSystem用于Audio系统的戒指使命,主要包含一些set和get接口,是一个对表层的类
AudioFlinger是Audio系统的核心,来自AudioTrack的数据,最终在这里得到处理并被写入Audio HAL层
MediaPlayer在framework层已经会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放,是以是MediaPlayer包含了AudioTrack。使用AudioTrack播放音乐
MediaPlayer提供了更完满的封装和气象戒指,比拟MediaPlayer,AudioTrack更为爽朗、高效,骨子上MediaPlayerService的里面已毕便是使用了AudioTrack把总共媒体接洽的native层做事(包括AudioFlinger,MediaPlayerService,CameraService和AudioPolicyService)启动起来,编译生成的mediaserver将被烧录到耕作的/system/bin/mediaserver旅途,然后由系统启动时的init进度启动
两种Audio Hardware HAL接口界说
legacy:hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h
非legacy:hardware/libhardware/include/hardware/audio.h
前者是2.3及之前的音频耕作接口界说,后者是4.0的接口界说,为了兼容往常的筹画,4.0已毕一个中间层:hardware/libhardware_legacy/audio/audio_hw_hal.cpp,结构与其他的audio_hw.c大同小异,辞别在于open方法事实上legacy也要封装成非legacy中的audio.h,着实的说需要一个接洽legacy interface和not legacy interface的中间层,这里的audio_hw_hal.cpp就充任这么的一个扮装了
hardware/libhardware/modules/audio/
createAudioHardware()函数
external/tinyalsa/
mixer.c 类alsa-lib的control,作用音频部件开关、音量转移等
pcm.c 类alsa-lib的pcm,作用音频pcm数据回放录制
上头的hardware/libhardware_legacy/audio/、hardware/libhardware/modules/audio/、device/samsung/tuna/audio/是同层的。之一是legacy audio,用于兼容2.2时期的alsa_sound;之二是stub audio接口;之三是Samsung Tuna的音频轮廓层已毕。调用头绪:AudioFlinger -> audio_hw -> tinyalsa
Audio硬件轮廓层的已毕在各个系统中可能是不同的,需要使用代码去收受相应的类并已毕它们,算作Android系统土产货框架层和驱动措施接口AudioFlinger收受了libmedia.so(Audio土产货框架类)里面的接口,表层调用的仅仅libmedia.so部分的接口,但骨子上调用的内容是libaudioflinger.so,使用JNI和Java对表层提供接口,JNI部分通过调用libmedia.so库提供的接口来已毕
Audio硬件轮廓层提供到硬件的接口,供AudioFlinger调用,Audio的硬件轮廓层骨子上是各个平台设备过程中需要主要蔼然和沉寂完成的部分,因为Android中的Audio系统不触及编解码要道,只认真表层系统和底层Audio硬件的交互,是以时时以PCM算作输入/输出神志
IAudioFlinger类接口通过该类不错取得IAudioTrack和IAudioRecorder两个接口,分歧用于声息的播放和录制,AudioTrack和AudioRecorder分歧通过调用IAudioTrack和IAudioRecorder来已毕
硬件轮廓层主要已毕了AudioStreamInALSA和AudioStreamOutALSA两个类,这两个类又会调用该文献下的 ALSAStreamOps类的方法。AudioStreamInALSA是灌音部分调用的旅途。在AudioStreamInALSA的构造函数中会对alsa进行一些启动化参数成立,
AudioStreamInALSA的read方法是最主要的方法,audioflinger层的read调用便是对 AudioStreamInALSA的read的调用。由于
灌音部分出现单声谈和双声谈数据传输的问题,修改read方法如下,即可已毕了灌音功能往常, 幸免了在编码的本事修改数据时其他编码仍弗成使命的时弊
八、Audio音频计谋制定与计谋施行的调用经过
图片
AudioPolicyService是计谋的制定者,AudioFlinger则是计谋的施行者
AudioTrack是AudioFlinger的客户端,AudioFlinger是Android系统中Audio惩办的核心
在Android中AudioPolicyService最终齐会调用到AudioFlinger中去,因为AudioFlinger骨子创建并惩办了硬件耕作
AudioFlinger类是代表通盘AudioFlinger做事的类,其余总共的使命类齐是通过里面类的形态在其中界说的
九、Android AudioPolicyService做事启动过程
AudioPolicyService完成的使命
加载audio_policy.default.so库得到audio_policy_module模块
通过audio_policy_module模块绽开audio_policy_device耕作
通过audio_policy_device耕作创建audio_policy
hw_get_module函数加载硬件轮廓层模块的过程
audio_policy已毕在audio_policy_hal.cpp中,audio_policy_service_ops已毕在AudioPolicyService.cpp中。create_audio_policy()函数便是创建并启动化一个legacy_audio_policy对象,AudioPolicyCompatClient是对audio_policy_service_ops的封装类,对外提供audio_policy_service_ops数据结构中界说的接口
Android AudioPolicyService做事启动过程
援用AudioPolicyCompatClient对象,这么音频惩办器AudioPolicyManager就不错使用audio_policy_service_ops中的接口
优先加载/vendor/etc/audio_policy.conf竖立文献,要是该竖立文献不存在,则加载/system/etc/audio_policy.conf竖立文献,要是该文献已经不存在,则通过函数defaultAudioPolicyConfig()来成立默许音频接口
成立多样音频流对应的音量转移点
通过称号绽开对应的音频接口硬件轮廓库
绽开mAttachedOutputDevices对应的输出
将输出IOProfile封装为AudioOutputDescriptor对象
成立现时音频接口的默许输出耕作
绽开输出,在AudioFlinger中创建PlaybackThread线程,并复返该线程的id
成立不错使用的输出耕算作mAttachedOutputDevices
将输出描摹符对象AudioOutputDescriptor及创建的PlaybackThread线程id以键值对神志保存
成立默许输出耕作
AudioPolicyManagerBase对象构造过程中主要完成以下几个要领
loadAudioPolicyConfig(AUDIO_POLICY_CONFIG_FILE)加载audio_policy.conf竖立文献
initializeVolumeCurves()启动化多样音频流对应的音量转移点
加载audio policy硬件轮廓库:mpClientInterface->loadHwModule(mHwModules[i]->mName)
绽开attached_output_devices输出mpClientInterface->openOutput();
保存输出耕作描摹符对象addOutput(output, outputDesc);
十、Android系统中总共的音频接口耕作保存到AudioFlinger的成员变量mAudioHwDevs中
图片
audio_policy.conf文献
从audio_policy.conf文献中不错发现,系统包含了primary、a2dp、usb等音频接口,对应着系统中的audio.<primary/a2dp/usb>.<device>.so。每个音频接口中又包含了几许个outputs & inputs,而且每个output or input又包含了几许个devices,且还有采样频率,声谈数等信息。这些devices信息、采样频率信息 & 声谈信息等齐会保存在各自module的IOProfile中。按上文中audio_policy.conf竖立文献所描摹,系统临了会生成6个modules(eg.primary,a2dp,hdmi,r_submix,hs_usb & usb)以及7个outputs
十一、audio_policy.conf同期界说了多个audio接口
图片
不同的Android居品在音频的筹画上时时是存在各异的,而这些各异不错通过Audio的竖立文献audio_policy.conf来取得。在Android系统中音频竖立文献存放旅途有两处,存放地址不错从AudioPolicyManagerBase.cpp文献中获取
在AudioPolicyManager.cpp文献中不错知谈系统会最初加载vendor/etc目次下的configure文献,再加载system/etc目次下的configure文献。若这两者加载齐发生诞妄的话,系统会加载default竖立文献,并定名为primary module
通过loadGlobalConfig(root)函数来读取这些全局竖立信息,通过loadHwModules()函数来加载系统竖立的总共audio接口(加载音频接口),由于audio_policy.conf不错界说多个音频接口,因此该函数轮回调用loadHwModule()来判辨每个音频接口参数信息。Android界说HwModule类来描摹每一个audio接口参数,界说IOProfile类来描摹输入输出模式竖立
/system/etc/audio_policy.conf
/vendor/etc/audio_policy.conf
加载audio_module模块
AudioPolicyManager通过读取audio_policy.conf竖立文献,不错知谈系统现时支柱哪些音频接口以及attached的输入输出耕作、默许输出耕作。接下来就需要加载这些音频接口的硬件轮廓库
AudioPolicyClientInterface提供了加载音频接口硬件轮廓库的接口函数,AudioPolicyCompatClient通过代理audio_policy_service_ops已毕AudioPolicyClientInterface接口
AudioPolicyCompatClient将音频模块加载使命交给audio_policy_service_ops,AudioPolicyService又将其转交给AudioFlinger
当AudioPolicyManagerBase构造时,它会凭据用户提供的audio_policy.conf来分析系统中有哪些audio接口(primary,a2dp以及usb),然后通过AudioFlinger::loadHwModule加载各audio接口对应的库文献,并纪律绽开其中的output(openOutput)和input(openInput)
绽开音频输出时创建一个audio_stream_out通谈,并创建AudioStreamOut对象以及新建PlaybackThread播放线程
绽开音频输入时创建一个audio_stream_in通谈,并创建AudioStreamIn对象以及创建RecordThread灌音线程
audio_policy.conf文献界说了两种音频竖立信息
现时系统支柱的音频输入输出耕作及默许输入输出耕作,这些信息是通过global_configuration竖立项来成立,在global_configuration中界说了三种音频耕作信息
attached_output_devices:已蚁集的输出耕作
default_output_device:默许输出耕作
attached_input_devices:已蚁集的输入耕作
系统支柱的音频接口信息
audio_policy.conf界说了系统支柱的总共音频接口参数信息,比如primary、a2dp、usb等
每种音频接口包含输入输出,每种输入输出又包含多种输入输出竖立,每种输入输出竖立又支柱多种音频耕作。AudioPolicyManagerBase最初加载/vendor/etc/audio_policy.conf,要是该文献不存在,则加载/system/etc/audio_policy.conf
audio_policy.conf同期界说了多个audio 接口,每一个audio接口包含几许output和input,而每个output和input又同期支柱多种输入输出模式,每种输入输出模式又支柱几许种耕作
十二、通过AudioFlinger的loadHwModule加载各audio接口对应的库文献已毕调用PlaybackThread播放线程或RecordThread灌音线程
图片
十三、AudioFlinger的openInput()方法调用经过分析
图片
十四、AudioFlinger的openOutput()方法的调用经过分析
图片
十五、Audio系统为了能往常播放音频数据,需要创建轮廓的音频输出接口对象,绽开音频输出过程
图片
十六、绽开音频输入的经过
图片
十七、绽开音频输出后,在AudioFlinger与AudioPolicyService中的阐扬神志
图片
十八、绽开音频输入后,在AudioFlinger与AudioPolicyService中的阐扬神志
图片
十九、AudioPolicyService加载完系统界说的总共音频接口,并生成相应的数据对象
图片
二十、AudioPolicyService与AudioTrack和AudioFlinger的联系
图片
二十一、AudioPolicyService注册名为做事的经过
图片
二十二、AudioTrack构造过程
图片
图片
图片
二十三、AudioTrack和AudioFlinger的联系
图片
二十四、audio_policy与AudioPolicyService、AudioPolicyCompatClient之间的联系
图片
本站仅提供存储做事,总共内容均由用户发布,如发现存害或侵权内容,请点击举报。