Android 4.1 Audio系统变化说明

Android 4.1,英文代号简称JB。在国人眼里,JB这个词还和动物有点关系。Google如此频繁修改Android,终于推出了一个可以被大家整天JB JB挂在嘴上的版本。以后我的文章也可以一面用JB表示版本号,一面用JB表示毛主席常说的”战略上的鄙视了“。请大家根据上下文揣摩我写下JB一词的心情。

今天将稍深入得介绍一下JB 4.1在Audio系统做的翻天覆地的改动。这里先啰嗦几句:就像80后经常抱怨自己晚生了几年一样,马上就会有很多码农抱怨接触Android太晚了。为何?JB Audio系统的难度相对4.0, 2.3, 2.2已经非常非常大了。99%的情况下,在你没有看到这个NB(这不是脏话,4.1 Audio系统中就有一个类叫NBAIO,篮球控不要搞错成NBA了,原意是Non-block Audio I/O。看到了吧,非阻塞I/O,各位自问下,有多少人对这个东西有深刻理解?)东西演化的基础上,不太可能能看懂JB Audio系统。所以,建议这99%中的没有见识过Audio演化历史的屌丝同学们,先仔细研究(以前我仅仅建议大家看看,现在提高要求为仔细研究)《深入理解Android 卷I》Audio系统。BTW,此书在某个章节里特意提醒过大家要去研究下各种I/O模型,不知道有几个人屌过我了。

本文将分几个部分,事前没有打草稿,所以会有点乱。

先从Java层AudioTrack类说起

一 AudioTrack Java类变化说明

声道数上,以前只有单声道(MONO)和立体声(STEREO),现在拓展到最NB八声道(7.1 HiFi啊)。参数名为CHANNEL_OUT_7POINT1_SURROUND。看到这个参数,我下巴咣当就掉下来了。这玩意,一时半会我还弄不明白是个什么道理。有知晓的屌丝码农们不妨告诉大家。 当然,最终的输出还是双声道。多声道(大于2)的时候会使用downmixer处理(下变换处理,同学们可搜索之) 其他的变化也有,但不大了。我这里先挑一些吸引眼球的。BTW,放心,不会像那个泷泽萝拉首秀片子一样只让大家看见大鼻孔的。

二 AudioTrack JNI层变化说明

这一层包括JNI层和AudioTrack本身

JNI层变化不大。 Audio Native核心代码移到了framework/av下。对,你没看错。真的是av。这就是JB Audio一个比较大的变化。Audio Native核心代码全部移到了frameworks/AV目录下。 AudioTrack增加了一个变量,用于控制使用它的进程的调度优先级(前文说错了,这里确实设置的是nicer值)。如果处于播放状态的话,将设置进程调度优先级为ANDROID_PRIORITY_AUDIO。就像你们看到马赛克时一定会嘟喃一样。我这里也要特别啰嗦几句。在单核CPU的情况下,设置优先级是比较愚蠢的(ANDROID_PRIORITY_AUDIO的值为-16,优先级极高,单核设置个这么高的怪物,不知道其他app还怎么玩。如果你不知道我在说什么,先看看这篇文章吧, )。但现在2核,4核已经比较常见了,这里就可以来玩玩调度方面的事情。对屌丝码农的真正考验是:多核并行编程,linux os的原理,需要各位屌丝同学努力掌握。Audio已经不那么能轻易被你们任意蹂躏了。另外,低端手机,求求你们别移植4.1了,这个真的不是低端能玩的。 AudioTrack升级为父亲了。JB为它定义了一个莫名其妙的的TimedAudioTrack子类。这个类在编解码的aah_rtp(我现在还不知道aah是什么)里边用到了。从注释上看,该类是一个带时间戳(有时间戳,就可以做同步了)的音频输出接口。详细理解的话,就需要结合具体应用场景去分析了(主要是rtp这一块)。搞编解码的同学们,抓紧了! 另外一个超级复杂的变化,是Audio定义了几个输出flag(见audio.h的audio_output_flags_t枚举定义)。根据注释,该值有两个作用,一个是AT的使用者可以指明自己想使用怎样的outputDevice。另外一个是设备厂商可以通过它声明自己支持的输出设备(看来,设备初始化的时候,又增添了参数读取和配置这方面的工作)。不过,从该枚举的定义来看,我还看不出它和硬件有什么关系。它定义的值如下:

typedef enum {

AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes

AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track

// to one output stream: no software mixer

AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of

// the device. It is unique and must be

// present. It is opened by default and

// receives routing, audio mode and volume

// controls related to voice calls.

AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 《==什么叫fast track?太难理解了!目前,java层的audiotrack只会使用第一个标志。

// defined elsewhere

AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8 // use deep audio buffers 《==deep buffer是个什么玩意?这个马赛克是不是太大了点?现在完全看不清楚啊??!

} audio_output_flags_t;

AudioTrack其他变化不大。AudioTrack.cpp总共才1600多行,so easy!

OK,上面有好几个马赛克,平常看看日本大片的时候也就撸过去了,但分析Audio可不行。把去马赛克的希望寄托在下一步AudioFlinger的分析上吧!

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pxwsd.html