一、Audio音频架构简介女同 91
二、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:需要基层竣事的总管接口
吉吉影音avAudioTrack.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之间的关系
图片
本站仅提供存储职业,通盘内容均由用户发布,如发现存害或侵权内容,请点击举报。