[RK3288][Android6.0] 调试笔记 --- Audio分离DTMF tone引起的异常
来源:互联网 发布:网页设计程序员工资 编辑:程序博客网 时间:2024/05/18 22:15
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
由于Audio原始设计DTMF stream最终转换成MUSIC stream, 现在想把DTMF独立出来单独使用,因此修改
STREAM_VOLUME_ALIAS_DEFAULT数组
private final int[] STREAM_VOLUME_ALIAS_DEFAULT = new int[] { AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL AudioSystem.STREAM_RING, // STREAM_SYSTEM AudioSystem.STREAM_RING, // STREAM_RING AudioSystem.STREAM_MUSIC, // STREAM_MUSIC AudioSystem.STREAM_ALARM, // STREAM_ALARM AudioSystem.STREAM_RING, // STREAM_NOTIFICATION AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED //把AudioSystem.STREAM_MUSIC替换成AudioSystem.STREAM_DTMF AudioSystem.STREAM_DTMF, // STREAM_DTMF AudioSystem.STREAM_MUSIC // STREAM_TTS };
private void updateStreamVolumeAlias(boolean updateVolumes, String caller) { int dtmfStreamAlias; switch (mPlatformType) { case AudioSystem.PLATFORM_VOICE: mStreamVolumeAlias = STREAM_VOLUME_ALIAS_VOICE; dtmfStreamAlias = AudioSystem.STREAM_RING; break; case AudioSystem.PLATFORM_TELEVISION: mStreamVolumeAlias = STREAM_VOLUME_ALIAS_TELEVISION; dtmfStreamAlias = AudioSystem.STREAM_MUSIC; break; default: mStreamVolumeAlias = STREAM_VOLUME_ALIAS_DEFAULT; dtmfStreamAlias = AudioSystem.STREAM_MUSIC; } //不管是什么平台,都设置成AudioSystem.STREAM_DTMF dtmfStreamAlias = AudioSystem.STREAM_DTMF; ......}
修改开机后发生了exception:
01-03 15:34:39.982 553 553 W SystemServer: ***********************************************01-03 15:34:39.983 553 553 E SystemServer: BOOT FAILURE starting Audio Service01-03 15:34:39.983 553 553 E SystemServer: java.lang.ArrayIndexOutOfBoundsException: length=7; index=801-03 15:34:39.983 553 553 E SystemServer: at com.android.server.audio.AudioService.createStreamStates(AudioService.java:903)01-03 15:34:39.983 553 553 E SystemServer: at com.android.server.audio.AudioService.<init>(AudioService.java:639)01-03 15:34:39.983 553 553 E SystemServer: at com.android.server.SystemServer.startOtherServices(SystemServer.java:874)01-03 15:34:39.983 553 553 E SystemServer: at com.android.server.SystemServer.run(SystemServer.java:279)01-03 15:34:39.983 553 553 E SystemServer: at com.android.server.SystemServer.main(SystemServer.java:171)01-03 15:34:39.983 553 553 E SystemServer: at java.lang.reflect.Method.invoke(Native Method)01-03 15:34:39.983 553 553 E SystemServer: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:772)01-03 15:34:39.983 553 553 E SystemServer: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:662)
是createStreamStates()引起:
private void createStreamStates() { int numStreamTypes = AudioSystem.getNumStreamTypes(); VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes]; for (int i = 0; i < numStreamTypes; i++) { //这行数组越界 streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i); }}
VOLUME_SETTINGS:
/** * The mapping of stream type (integer) to its setting. * * @removed Not used by anything since API 2. */public static final String[] VOLUME_SETTINGS = { VOLUME_VOICE, VOLUME_SYSTEM, VOLUME_RING, VOLUME_MUSIC, VOLUME_ALARM, VOLUME_NOTIFICATION, VOLUME_BLUETOOTH_SCO};
而AudioSystem.STREAM_DTMF对应的值是8, 越界了。
看注释,此数组已经被弃用了,估计不维护了,但是在createStreamStates()却引用了这个字符串数组,导致异常产生。
解决方法:
private void createStreamStates() { int numStreamTypes = AudioSystem.getNumStreamTypes(); VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes]; for (int i = 0; i < numStreamTypes; i++) { //判断如果是DTMF,就另外赋值 if (i == 8) streams[i] = new VolumeStreamState("volume_dtmf", i); else streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i); } checkAllFixedVolumeDevices(); checkAllAliasStreamVolumes(); checkMuteAffectedStreams(); }}
阅读全文
1 0
- [RK3288][Android6.0] 调试笔记 --- Audio分离DTMF tone引起的异常
- [RK3288][Android6.0] 调试笔记 --- Audio之分离DTMF tones
- [RK3288][Android6.0] 调试笔记 --- 空格引起的编译错误
- [RK3288][Android6.0] 调试笔记 --- Audio驱动层判断录音数据是否异常
- [RK3288][Android6.0] 调试笔记 --- Audio录音PCM数据抓取
- [RK3288][Android6.0] 调试笔记 --- Audio的Voice Call无法静音问题
- [RK3288][Android6.0] 调试笔记 --- 编码器输入源引起的码率增大问题
- [RK3288][Android6.0] 调试笔记 --- Activity多次调用finish()引起的Warning
- [RK3288][Android6.0] 调试笔记 --- 低电压引起的关机问题
- [RK3288][Android6.0] 调试笔记 --- 调试串口的更换
- [RK3288][Android6.0] 调试笔记 --- 普通串口的添加
- [RK3288][Android6.0] 调试笔记 --- 隐藏系统状态栏的方法
- [RK3288][Android6.0] 调试笔记 --- display数据帧的dump
- [RK3288][Android6.0] 调试笔记 --- ComponentName的使用
- [RK3288][Android6.0] 调试笔记 --- CPU使用的频率表
- [RK3288][Android6.0] 调试笔记 --- GPU DVFS的控制开关
- [RK3288][Android6.0] 调试笔记 --- RT5640的ctl name列表
- [RK3288][Android6.0] 移植笔记 --- RT5640 Audio Codec添加
- (虚)继承类的内存占用大小
- windows服务安装,动态配置服务信息
- django中的认证(含自定义认证)与登录
- HTML5 Plus 拍照或者相册选择图片上传
- Selectable.interactable -->设置UI可否被点击
- [RK3288][Android6.0] 调试笔记 --- Audio分离DTMF tone引起的异常
- LeetCode
- 使用ajax方法实现form表单的提交(附源码)
- VMware Workstation 12下安装Mac OS X系统。
- Android中 Context的用法
- 模拟实现一个Stack 要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 剑指offer29:数组中出现次数超过一半的数字
- 上传ipa错误以及解决方法记录:
- css选择器优先级计算以及伪元素与伪类区别