[RK3288][Android7.1] 修改最大可用音轨数据
Platform: Rockchip
OS: Android 7.1.2
Kernel: 4.4

需求:
在使用RK3288平台时,由于在使用音乐教学类应用时,需要同时使用到18个AudioTrack实例进行音频播放,因此需要在现有的最大14音轨的基础上进行权限放大。

实现:
通过连续实例化AudioTrack对像,当出现实例化失败时,跟踪错误信息打印发现在实例过程中,在从AudioFlinger中请求时,Flinger对每个Uid的最大Track实例限制在了14个,防止由于单个Uid占用全部Track实例而出现其余应用无法再申请实例的情况,导致无法播放音频

 E AudioFlinger: no more track names available
 E AudioFlinger: createTrack_l() initCheck failed -12; no control block?
 E AudioTrack: AudioFlinger could not create track, status: -12
 E AudioTrack-JNI: Error -12 initializing AudioTrack
 E android.media.AudioTrack: Error code -20 when initializing AudioTrack.
 I test: 当前可用音轨:14

因些直接修改7.1\frameworks\av\services\audioflinger\Threads.h中最大限制数量。
在这里插入图片描述
成功将最大音轨开放到最大18个

E AudioFlinger: no more track names available
E AudioFlinger: createTrack_l() initCheck failed -12; no control block?
E AudioTrack: AudioFlinger could not create track, status: -12
E AudioTrack-JNI: Error -12 initializing AudioTrack
E android.media.AudioTrack: Error code -20 when initializing AudioTrack.
I test: 当前可用音轨:18
                                    所以在单独编译 Android 内核之前,一定要整编 Android 源码。当我们修改了内核源码并单独编译 Android 内核时,kernel 和 resource 发生了改变,这时候需要指定一个 boot.img,然后将新编译的 kernel 和 resource 覆盖进去。因为 kernel 编译完后需要通过 Android 去打包成 boot.img,所以这里需要加上 A 参数,即编译 kernel 的时需要一起编译 Android 才能打包 boot.img。我们来解释以上命令是什么意思!
                                    Android 7.0 在设置中新增加了充电提示音的打开选项,但打开后,插上充电线也是听不到充电音。根据查看代码可知,其实该充电提示音是指无线充电提示音。
 PowerManagerService.java中updateIsPoweredLocked函数中,
if (dockedOnWirelessCharger) {
 mNotifier.onWirelessChargingSta...
                                    SoundPool的用法就不再提了,网上资料多,就说说在实际应用中可能会遇到的一些奇葩的问题,这些问题应该是和底层实现上有关系。
1、AudioFlinger could not  create track, status: -12 
   SoundPool即音效池,在创建的时候 maxStream这个参数代表能够同时播放的最大音效数,这里切忌合理使用,写的太大后会报AudioFlinger
                                    如果你音效多,也不要指望unload方法来清除掉一些音效后再load新的进去,虽然unload后音效卸载了,但是前面分给它在SoundPool里面的Id可没有释放掉,也就是说这个时候你load新的进去只会在后面继续累加,然后累加多了就超过256了,然后就就听不到声音,然后就没有然后了。一旦报了这个错,你就听不到声音了,呵呵。其他还有点什么呢,load需要一点点时间,load后不要马上unload,load —play–unload的做法并不可取,不要load太大的音效,它只会申请1M的内存空间。
                                    0-27 08:27:28.479 1364-1395/? E/AudioFlinger: createRecordTrack_l() initCheck failed -12; no control block?
10-27 08:27:28.480 2335-2526/com.google.android.googlequicksearchbox:search E/AudioRecord: Au
                                    AudioRecord 遇到的问题
AudioRecord: Could not get audio input for session xxx, record source xx, sample rate 16000, format ...
AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22.
android.media.AudioRecord: Err
                                    1. Android 音频框架概述Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出、音频流的控制、音频设备的管理、音量调节等,主要包括如下部分:
Audio Application Framework:音频应用框架 
AudioTrack:负责回放数据的输出,属 Android 应用框架 API 类
AudioRecord:负责录音数据的采集,属 Androi
Google 助理 + 普通应用
Google 助理属于特权应用,因为其预先安装在设备上并且拥有 RoleManager.ROLE_ASSISTANT 角色。拥有此角色的任何其他预安装应用都会受到类似处理。
Android 根据