Android音频分析
1 安卓音频系统框架
Ø Multimedia framework:
多媒体框架负责封装了播放/录音类、连接安卓音频解码库进行音频软件解码以及连接高通OpenMaxIL接口。上层APP直接调用Multimedia framework的接口来进行音频的播放和录音。
Ø AudioService
注冊安卓广播事件,获取广播事件,如蓝牙耳机插拔、USB音频设备插拔等。并调用Audio System接口来实现音频控制。
Ø AudioSystem
该类中包括了音频的基础定义,包括音频流(stream)类型,路由(Routing)类型、音频输入输出设备(device)的定义、音频设备声明(device states)以及一些音频接口函数。
Ø Audio Flinger(AF):
AudioFlinger是安卓音频的两大服务之中的一个,还有一个是AudioPolicyService,这两个服务均由mediaserver实例化(main_mediaserver.cpp)。AudioFlinger直接与HAL层通讯,全部的音频操作都须要经过AudioFlinger来控制。
主要有下面功能:
1. 通过libaudio库的接口来管理全部的音频输入/输出设备;
2. 实现PCM数据的混音/输入/输出;
3. 播放时音量控制
Ø Audio Policy Manager(APM):
APM主要用于音频流的路由策略。以及用户场景的切换。终于也是和AF通讯。有AF与HAL通讯控制。
AudioPolicyService.java 也会通过AudioSystem中的接口(如AudioSystem::get_audio_flinger())来获取AF实例。音量的控制也是调用AudioSystem中的接口(如AudioSystem::setVoiceVolume(data->mVolume))来控制,终于AS也是调用AF的接口来实现。
Ø AudioTrack(AT):
用于播放音频的类,通过audio_track_cblk_t 与AF共享内存,传递音频数据。
Ø AudioRecord:
用于录音的类。
2 详细分析
2.1 AudioTrack(AT)分析
java层:frameworksasemediajavaandroidmedia AudioTrack.java
JNI层: frameworksasecorejniandroid_media_AudioTrack.cpp
库:frameworksavmedialibmediaAudioTrack.cpp
三个文件的关系:java层AudioTrack.java调用JNI层android_media_AudioTrack.cppnative函数。JNI层详细功能再调用库AudioTrack.cpp中函数来实现。
s
总的来说,audiotrack.java提供给APP用于播放音频的类。通过JNI与c++文件通信完毕详细的播放功能。
audiotrack.java主要提供下面几个方法:
getMinBufferSize():依据採样率。声道数,採样位数(採样精度)(分别相应三个形參)来计算须要的最小buffer缓冲区。
AudioTrack():构造函数,构造一个播放类;
paly():開始播放音频;
write():往AudioTrack中写入音频数据;
stop():停止播放;
pause():暂停播放。
release():释放底层的资源。
AudioTrack播放音频数据时有两种方式,一种是静态模式(MODE_STATIC),还有一种是流模式(MODE_STREAM)。
Ø static
静态模式就是数据一次性交付给接收方。优点是简单高效,仅仅须要进行一次操作就完毕了数据的传递;缺点当然也非常明显,无法胜任数据量较大的音频回放。因而通常仅仅用于播放铃声、系统提醒等对内存小的操作。
Ø streaming
流模式和网络上播放视频是类似的,即数据是依照一定规律不断地传递给接收方的。
理论上它可用于不论什么音频播放的场景,只是我们一般在下面情况下採用:
Ø 音频文件过大
Ø 音频属性要求高。比方採样率高、深度大的数据
Ø 音频数据是实时产生的。这样的情况就仅仅能用流模式了
AudioTrack的构造函数中有一个变量用来指定buffer的大小bufferSizeInBytes。
AudioTrack在Native层会对这个变量的值进行有效性推断。首先。它至少要等于或者大于getMinBufferSize返回的值,然后它必须是frame大小的整数倍。(frame=声道数*採样位数/8)
举例说明,MODE_STREAM模式下,在JAVA层构造AudioTrack时,bufferSizeInBytes的大小设定为9600,在Native层调用Write方法拷贝数据至Hardware进行回放,每次拷贝的大小为320.则须要复制到30次,声卡才发出声音。
即须要将数据填满缓冲区才进行播放。(320*30=9600)
See also:
Android深入浅出之Audio 第一部分 AudioTrack分析 |
||
深入剖析Android音频之AudioTrack |
||
Android Audio System 之中的一个:AudioTrack怎样与AudioFlinger交换音频数据 |
2.2 AudioFlinger(AF)
负责向下訪问AudioHardwareInterface,实现音频PCM数据的混音/输入/输出以及音量调节;是底层和安卓层的桥梁。
文件位置: frameworksavservicesaudioflinger AudioFlinger.cpp
See also:
Android Audio System 之二:AudioFlinger |
|
Android Audio System 之中的一个:AudioTrack怎样与AudioFlinger交换音频数据 |
|
Android深入浅出之Audio 第二部分 AudioFlinger分析 |
受用的评论:參见http://blog.csdn.net/droidphone/article/details/5951999
依照评论的理解,当手机里打开两个播放器的同一时候播放音乐,它们(不同的音乐)是同一个MixThread中的两个不同的AudioTrack(音轨),并混音输出。
2.3 AudioPolicyService(APS)
AudioPolicyService主要完毕下面任务:
- JAVA应用层通过JNI,经由IAudioPolicyService接口,訪问AudioPolicyService提供的服务
- 输入输出设备的连接状态
- 系统的音频策略(strategy)的切换
- 音量/音频參数的设置
AudioPolicyManager
AudioPolicyService的非常大一部分管理工作都是在AudioPolicyManager中完毕的。包含音量管理,音频策略(strategy)管理,输入输出设备管理。
See also:
Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager |
|
Android音频系统之AudioPolicyService |
|
Android源代码分析:AudioPolicy |
http://www.360doc.com/content/13/0815/14/11338643_307326622.shtml |