[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 根据