Android Audio system

首先看一下传输格式:

•PCM

–BCLK、FS、DR、DX

•IISS(Inter-IC Sound bus)

–I2S,是菲利浦公司提出的串行数字音频总线协议。目前很多音频芯片和MCU都提供了对IIS的支持。IIS总线只处理声音数据。其他信号(如控制信号)必须单独传输。
–IIS只使用了三根串行总线。
–提供分时复用功能的数据线 -IISDI  IISDO
–字段选择线(声道选择) -IISLRCK
–时钟信号线 –IISCLK
–因为可以传送多个声道的数据,所以显然更加适合Stereo Single,其实所谓的立体声,也就是多个声道可以发出不一样的声音)。

•AC97

–AC'97(Audio Codec 1997)是以Intel为首的五个PC厂商Intel、Creative Labs、NS、Analog Device与Yamaha共同提出的规格标准 。
 

再看一下Android系统的启动流程。在INIT1阶段会启动AudioFlinger服务。(还是上传不了图片)

Audio Flinger / Audio Policy Service两个重要的服务:

在Framework\base\media\MediaServer\Main_MediaServer.cpp中,
启动serviceManager之后,创建AF和APS

•AF:

创建一个HAL对象,HAL可以是ALSA/OSS标准

•APS:

–创建AudioCommandThread内部线程,完成音量控制,输入、输出切换
–APS同时创建AudioManagerBase,作为系统默认的音频管理
–在AMB中管理策略上的事情,同时会在AF的openOutput中创建混音线程

代码结构

Stagefright调用Awesomeplayer是实现音视频等功能。可以说是对awesomeplay的封装和进一步抽象。

•JAVA类路径:

–Frameworks/base/media/java/android/media/MediaPlayer.java

•JAVA本地调用(JNI)

–Frameworks/base/media/jni/android_media_MediaPlayer.cpp
•Libmedia_jni.so

•主要头文件

–Frameworks/base/include/media/

•多媒体底层库

–Frameworks/base/media/libmedia/
•Libmedia.so

•多媒体服务部分

–Frameworks/base/media/libmediaplayerservice/
•Libmediaplayerservice.so
•Libstagefright
–Frameworks/base/media/libstagefright/

code flow

bitstream(output)

•AudioPolicyService->openOutput -> AudioSystem -> AudioFlinger -> AudioFlinger::openOutput -> mAudioHardware->openOutputStream() -> AudioHardware::openOutputStream() ->AudioStreamOutMSM72xx* out->set(this,devices,format,channels,sampleRate) -> Write -> AudioStreamOutMSM72xx::write() -> /dev/msm_pcm_out
最后通过RPC/SMEM异步通知DSP处理,到DSP后一般都是闭源的了。

control data

ALSA API is provided specifically for Android releases to support device and stream management. This proprietary implementation is provided by Vendor.
一般soc厂商会提供基于ALSA的API出来。但是里面通常是闭源的。比如要支持5.1声道的话,需要看看Vendor支不支持了(尽管硬件可能支持)

 

 

 

 

 

你可能感兴趣的:(android)