[RK3288][Android6.0] 调试笔记 --- Audio之分离DTMF tones
来源:互联网 发布:协方差矩阵怎么求 编辑:程序博客网 时间:2024/06/03 16:00
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
Android的原始设计会将若干stream type最终归成一类,比如STREAM_DTMF、 STREAM_MUSIC、STREAM_TTS都属于STREAM_MUSIC,STREAM_SYSTEM、STREAM_SYSTEM_ENFORCED、STREAM_RING最终归类成STREAM_RING,也就说细分只是针对app,归类会根据情景模式划分,因此针对不同的platform,比如用的是TV、BOX,那么对应的划分也是不同的。这部分在AudioService.java中体现,分别有三个alias,
STREAM_VOLUME_ALIAS_VOICE, STREAM_VOLUME_ALIAS_TELEVISION以及STREAM_VOLUME_ALIAS_DEFAULT。
当前需求是要将dtmf独立分来出来作为单独一个stream通道,目标是不受其他stream影响,下面是代码改动,其他stream要分离出来也可以用同样的方法。
--- a/services/core/java/com/android/server/audio/AudioService.java+++ b/services/core/java/com/android/server/audio/AudioService.java@@ -330,7 +330,8 @@ public class AudioService extends IAudioService.Stub { AudioSystem.STREAM_RING, // STREAM_NOTIFICATION AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED- AudioSystem.STREAM_RING, // STREAM_DTMF+ //Kris+ AudioSystem.STREAM_DTMF, // STREAM_DTMF AudioSystem.STREAM_MUSIC // STREAM_TTS }; private int[] mStreamVolumeAlias;@@ -1350,7 +1351,10 @@ public class AudioService extends IAudioService.Stub { private void onSetStreamVolume(int streamType, int index, int flags, int device, String caller) { final int stream = mStreamVolumeAlias[streamType];- setStreamVolumeInt(stream, index, device, false, caller);+ /*Kris, 20160106, seperate DTMF stream. {*/+ // setStreamVolumeInt(stream, index, device, false, caller);+ setStreamVolumeInt(streamType, index, device, false, caller);+ /*Kris, 20160106, seperate DTMF stream. }*/ // setting volume on ui sounds stream type also controls silent mode if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || (stream == getUiSoundsStreamType())) {@@ -1362,7 +1366,10 @@ public class AudioService extends IAudioService.Stub { } else { newRingerMode = AudioManager.RINGER_MODE_NORMAL; }- setRingerMode(newRingerMode, TAG + ".onSetStreamVolume", false /*external*/);+ /*Kris, 20160106, seperate DTMF stream. {*/+ //setRingerMode(newRingerMode, TAG + ".onSetStreamVolume", false /*external*/);+ setRingerMode(AudioManager.RINGER_MODE_NORMAL, TAG + ".onSetStreamVolume", false /*external*/);+ /*Kris, 20160106, seperate DTMF stream. }*/ } // setting non-zero volume for a muted stream unmutes the stream and vice versa mStreamStates[stream].mute(index == 0);@@ -3821,7 +3828,9 @@ public class AudioService extends IAudioService.Stub { } } mIndexMap.put(device, index);-+ /* Kris, 20151111, mask StreamVolumeAlias. {*/+ return true;+ /* changed = oldIndex != index; if (changed) { // Apply change to all streams using this one as alias@@ -3859,8 +3868,11 @@ public class AudioService extends IAudioService.Stub { mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE_ALIAS, mStreamVolumeAlias[mStreamType]); sendBroadcastToAll(mVolumeChanged);- }+ return changed;+ */+ /* Kris, 20151111, mask StreamVolumeAlias. }*/+ } } public int getIndex(int device) {@@ -4044,7 +4056,8 @@ public class AudioService extends IAudioService.Stub { synchronized (VolumeStreamState.class) { // Apply volume streamState.applyDeviceVolume_syncVSS(device);-+ /* Kris, 20160106, mask StreamVolumeAlias. {*/+ /* // Apply change to all streams using this one as alias int numStreamTypes = AudioSystem.getNumStreamTypes(); for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {@@ -4060,7 +4073,9 @@ public class AudioService extends IAudioService.Stub { mStreamStates[streamType].applyDeviceVolume_syncVSS(streamDevice); } }- }+ */+ /* Kris, 20160106, mask StreamVolumeAlias. }*/+ } // Post a persist volume msg sendMsg(mAudioHandler, MSG_PERSIST_VOLUME,@@ -4345,7 +4360,9 @@ public class AudioService extends IAudioService.Stub { break; case MSG_SET_ALL_VOLUMES:- setAllVolumes((VolumeStreamState) msg.obj);+ /*Kris, 20160106, seperate DTMF stream. {*/+ // setAllVolumes((VolumeStreamState) msg.obj);+ /*Kris, 20160106, seperate DTMF stream. }*/ break; case MSG_PERSIST_VOLUME:@@ -896,8 +896,12 @@ public class AudioService extends IAudioService.Stub { 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);+ for (int i = 0; i < numStreamTypes; i++) {+ //Kris,170719, fix isssue that seperating dtmf stream will cause crash.+ if (i == 8)+ streams[i] = new VolumeStreamState("volume_dtmf", i);+ else+ streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i); } checkAllFixedVolumeDevices();@@ -945,6 +949,9 @@ public class AudioService extends IAudioService.Stub { } }+ //Kris,170719, fix isssue that seperating dtmf stream will cause crash.+ dtmfStreamAlias = AudioSystem.STREAM_DTMF;+ mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias; if (updateVolumes) { mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias],
阅读全文
1 0
- [RK3288][Android6.0] 调试笔记 --- Audio之分离DTMF tones
- [RK3288][Android6.0] 调试笔记 --- Audio分离DTMF tone引起的异常
- [RK3288][Android6.0] 调试笔记 --- Audio录音PCM数据抓取
- [RK3288][Android6.0] 调试笔记 --- Audio驱动层判断录音数据是否异常
- [RK3288][Android6.0] 调试笔记 --- Audio的Voice Call无法静音问题
- [RK3288][Android6.0] 移植笔记 --- RT5640 Audio Codec添加
- [RK3288][Android6.0] 调试笔记 --- 调试串口的更换
- [RK3288][Android6.0] 调试笔记 --- 移除锁屏功能
- [RK3288][Android6.0] 调试笔记 --- Su添加密码登陆功能
- [RK3288][Android6.0] 调试笔记 --- 伪电池驱动添加
- [RK3288][Android6.0] 调试笔记 --- 普通串口的添加
- [RK3288][Android6.0] 调试笔记 --- PreviewCallback获取NV12格式数据
- [RK3288][Android6.0] 调试笔记 --- 替换系统签名
- [RK3288][Android6.0] 调试笔记 --- 设置中文为默认输入法
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED
- [RK3288][Android6.0] 调试笔记 --- apk安装添加黑名单
- [RK3288][Android6.0] 调试笔记 --- 实时录音会有呲呲噪音问题
- [RK3288][Android6.0] 调试笔记 --- I2C通信失败问题
- Jquery基础样式
- Python正则表达式
- java中时间戳转成日期格式
- CSS布局模型
- POj 1273 Drainage Ditches (最大流 Dinic + ISAP 模板)
- [RK3288][Android6.0] 调试笔记 --- Audio之分离DTMF tones
- 深入剖析ConcurrentHashMap(1)
- linux自定义或编写脚本
- java代码块
- 判断和输出素数——普通方法(C语言)
- Android中post请求AsyncTask延时
- Android_获取手机记事本
- Error selecting key or setting result to parameter object. Cause
- Cable master 切电缆