1 /* 2 * Copyright 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.mobileer.oboetester; 18 19 import android.content.Intent; 20 import android.media.AudioManager; 21 import android.os.Bundle; 22 23 public class IntentBasedTestSupport { 24 25 public static final String KEY_IN_SHARING = "in_sharing"; 26 public static final String KEY_OUT_SHARING = "out_sharing"; 27 public static final String VALUE_SHARING_EXCLUSIVE = "exclusive"; 28 public static final String VALUE_SHARING_SHARED = "shared"; 29 30 public static final String KEY_IN_PERF = "in_perf"; 31 public static final String KEY_OUT_PERF = "out_perf"; 32 public static final String VALUE_PERF_LOW_LATENCY = "lowlat"; 33 public static final String VALUE_PERF_POWERSAVE = "powersave"; 34 public static final String VALUE_PERF_NONE = "none"; 35 36 public static final String KEY_IN_CHANNELS = "in_channels"; 37 public static final String KEY_OUT_CHANNELS = "out_channels"; 38 public static final int VALUE_DEFAULT_CHANNELS = 2; 39 40 public static final String KEY_IN_USE_MMAP = "in_use_mmap"; 41 public static final String KEY_OUT_USE_MMAP = "out_use_mmap"; 42 public static final boolean VALUE_DEFAULT_USE_MMAP = true; 43 44 public static final String KEY_IN_PRESET = "in_preset"; 45 public static final String KEY_SAMPLE_RATE = "sample_rate"; 46 public static final int VALUE_DEFAULT_SAMPLE_RATE = 48000; 47 public static final String VALUE_UNSPECIFIED = "unspecified"; 48 49 public static final String KEY_IN_API = "in_api"; 50 public static final String KEY_OUT_API = "out_api"; 51 public static final String VALUE_API_AAUDIO = "aaudio"; 52 public static final String VALUE_API_OPENSLES = "opensles"; 53 54 public static final String KEY_FILE_NAME = "file"; 55 public static final String KEY_BUFFER_BURSTS = "buffer_bursts"; 56 public static final String KEY_BACKGROUND = "background"; 57 public static final String KEY_VOLUME = "volume"; 58 59 public static final String KEY_VOLUME_TYPE = "volume_type"; 60 public static final float VALUE_VOLUME_INVALID = -1.0f; 61 public static final String VALUE_VOLUME_TYPE_ACCESSIBILITY = "accessibility"; 62 public static final String VALUE_VOLUME_TYPE_ALARM = "alarm"; 63 public static final String VALUE_VOLUME_TYPE_DTMF = "dtmf"; 64 public static final String VALUE_VOLUME_TYPE_MUSIC = "music"; 65 public static final String VALUE_VOLUME_TYPE_NOTIFICATION = "notification"; 66 public static final String VALUE_VOLUME_TYPE_RING = "ring"; 67 public static final String VALUE_VOLUME_TYPE_SYSTEM = "system"; 68 public static final String VALUE_VOLUME_TYPE_VOICE_CALL = "voice_call"; 69 70 public static final String KEY_IN_CHANNEL_MASK = "in_channel_mask"; 71 public static final String KEY_OUT_CHANNEL_MASK = "out_channel_mask"; 72 public static final String VALUE_CHANNEL_MONO = "mono"; 73 public static final String VALUE_CHANNEL_STEREO = "stereo"; 74 public static final String VALUE_CHANNEL_2POINT1 = "2.1"; 75 public static final String VALUE_CHANNEL_TRI = "tri"; 76 public static final String VALUE_CHANNEL_TRI_BACK = "triBack"; 77 public static final String VALUE_CHANNEL_TRI_BACK_LOWERCASE = "triback"; 78 public static final String VALUE_CHANNEL_3POINT1 = "3.1"; 79 public static final String VALUE_CHANNEL_2POINT0POINT2 = "2.0.2"; 80 public static final String VALUE_CHANNEL_2POINT1POINT2 = "2.1.2"; 81 public static final String VALUE_CHANNEL_3POINT0POINT2 = "3.0.2"; 82 public static final String VALUE_CHANNEL_3POINT1POINT2 = "3.1.2"; 83 public static final String VALUE_CHANNEL_QUAD = "quad"; 84 public static final String VALUE_CHANNEL_QUAD_SIDE = "quadSide"; 85 public static final String VALUE_CHANNEL_QUAD_SIDE_LOWERCASE = "quadside"; 86 public static final String VALUE_CHANNEL_SURROUND = "surround"; 87 public static final String VALUE_CHANNEL_PENTA = "penta"; 88 public static final String VALUE_CHANNEL_5POINT1 = "5.1"; 89 public static final String VALUE_CHANNEL_5POINT1_SIDE = "5.1Side"; 90 public static final String VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE = "5.1side"; 91 public static final String VALUE_CHANNEL_6POINT1 = "6.1"; 92 public static final String VALUE_CHANNEL_7POINT1 = "7.1"; 93 public static final String VALUE_CHANNEL_5POINT1POINT2 = "5.1.2"; 94 public static final String VALUE_CHANNEL_5POINT1POINT4 = "5.1.4"; 95 public static final String VALUE_CHANNEL_7POINT1POINT2 = "7.1.2"; 96 public static final String VALUE_CHANNEL_7POINT1POINT4 = "7.1.4"; 97 public static final String VALUE_CHANNEL_9POINT1POINT4 = "9.1.4"; 98 public static final String VALUE_CHANNEL_9POINT1POINT6 = "9.1.6"; 99 public static final String VALUE_CHANNEL_FRONT_BACK = "frontBack"; 100 public static final String VALUE_CHANNEL_FRONT_BACK_LOWERCASE = "frontback"; 101 102 public static final String KEY_SIGNAL_TYPE = "signal_type"; 103 public static final String VALUE_SIGNAL_SINE = "sine"; 104 public static final String VALUE_SIGNAL_SAWTOOTH = "sawtooth"; 105 public static final String VALUE_SIGNAL_FREQ_SWEEP = "freq_sweep"; 106 public static final String VALUE_SIGNAL_PITCH_SWEEP = "pitch_sweep"; 107 public static final String VALUE_SIGNAL_WHITE_NOISE = "white_noise"; 108 109 public static final String KEY_DURATION = "duration"; 110 public static final int VALUE_DEFAULT_DURATION = 10; 111 getApiFromText(String text)112 public static int getApiFromText(String text) { 113 if (VALUE_API_AAUDIO.equals(text)) { 114 return StreamConfiguration.NATIVE_API_AAUDIO; 115 } else if (VALUE_API_OPENSLES.equals(text)) { 116 return StreamConfiguration.NATIVE_API_OPENSLES; 117 } else { 118 return StreamConfiguration.NATIVE_API_UNSPECIFIED; 119 } 120 } 121 getPerfFromText(String text)122 public static int getPerfFromText(String text) { 123 if (VALUE_PERF_NONE.equals(text)) { 124 return StreamConfiguration.PERFORMANCE_MODE_NONE; 125 } else if (VALUE_PERF_POWERSAVE.equals(text)) { 126 return StreamConfiguration.PERFORMANCE_MODE_POWER_SAVING; 127 } else if (VALUE_PERF_LOW_LATENCY.equals(text)) { 128 return StreamConfiguration.PERFORMANCE_MODE_LOW_LATENCY; 129 } else { 130 throw new IllegalArgumentException("perf mode invalid: " + text); 131 } 132 } 133 getSharingFromText(String text)134 public static int getSharingFromText(String text) { 135 if (VALUE_SHARING_SHARED.equals(text)) { 136 return StreamConfiguration.SHARING_MODE_SHARED; 137 } else { 138 return StreamConfiguration.SHARING_MODE_EXCLUSIVE; 139 } 140 } 141 configureStreamsFromBundle(Bundle bundle, StreamConfiguration requestedInConfig, StreamConfiguration requestedOutConfig)142 public static void configureStreamsFromBundle(Bundle bundle, 143 StreamConfiguration requestedInConfig, 144 StreamConfiguration requestedOutConfig) { 145 configureInputStreamFromBundle(bundle, requestedInConfig); 146 configureOutputStreamFromBundle(bundle, requestedOutConfig); 147 } 148 getNormalizedVolumeFromBundle(Bundle bundle)149 public static float getNormalizedVolumeFromBundle(Bundle bundle) { 150 return bundle.getFloat(KEY_VOLUME, VALUE_VOLUME_INVALID); 151 } 152 153 /** 154 * @param bundle 155 * @return AudioManager.STREAM type or throw IllegalArgumentException 156 */ getVolumeStreamTypeFromBundle(Bundle bundle)157 public static int getVolumeStreamTypeFromBundle(Bundle bundle) { 158 String typeText = bundle.getString(KEY_VOLUME_TYPE, VALUE_VOLUME_TYPE_MUSIC); 159 switch (typeText) { 160 case VALUE_VOLUME_TYPE_ACCESSIBILITY: 161 return AudioManager.STREAM_ACCESSIBILITY; 162 case VALUE_VOLUME_TYPE_ALARM: 163 return AudioManager.STREAM_ALARM; 164 case VALUE_VOLUME_TYPE_DTMF: 165 return AudioManager.STREAM_DTMF; 166 case VALUE_VOLUME_TYPE_MUSIC: 167 return AudioManager.STREAM_MUSIC; 168 case VALUE_VOLUME_TYPE_NOTIFICATION: 169 return AudioManager.STREAM_NOTIFICATION; 170 case VALUE_VOLUME_TYPE_RING: 171 return AudioManager.STREAM_RING; 172 case VALUE_VOLUME_TYPE_SYSTEM: 173 return AudioManager.STREAM_SYSTEM; 174 case VALUE_VOLUME_TYPE_VOICE_CALL: 175 return AudioManager.STREAM_VOICE_CALL; 176 default: 177 throw new IllegalArgumentException(KEY_VOLUME_TYPE + " invalid: " + typeText); 178 } 179 } 180 getChannelMaskFromBundle(Bundle bundle, String channelMaskKey)181 public static int getChannelMaskFromBundle(Bundle bundle, String channelMaskKey) { 182 String channelMaskText = bundle.getString(channelMaskKey); 183 if (channelMaskText == null) { 184 return StreamConfiguration.UNSPECIFIED; 185 } 186 switch (channelMaskText) { 187 case VALUE_CHANNEL_MONO: 188 return StreamConfiguration.CHANNEL_MONO; 189 case VALUE_CHANNEL_STEREO: 190 return StreamConfiguration.CHANNEL_STEREO; 191 case VALUE_CHANNEL_2POINT1: 192 return StreamConfiguration.CHANNEL_2POINT1; 193 case VALUE_CHANNEL_TRI: 194 return StreamConfiguration.CHANNEL_TRI; 195 case VALUE_CHANNEL_TRI_BACK: 196 case VALUE_CHANNEL_TRI_BACK_LOWERCASE: 197 return StreamConfiguration.CHANNEL_TRI_BACK; 198 case VALUE_CHANNEL_3POINT1: 199 return StreamConfiguration.CHANNEL_3POINT1; 200 case VALUE_CHANNEL_2POINT0POINT2: 201 return StreamConfiguration.CHANNEL_2POINT0POINT2; 202 case VALUE_CHANNEL_2POINT1POINT2: 203 return StreamConfiguration.CHANNEL_2POINT1POINT2; 204 case VALUE_CHANNEL_3POINT0POINT2: 205 return StreamConfiguration.CHANNEL_3POINT0POINT2; 206 case VALUE_CHANNEL_3POINT1POINT2: 207 return StreamConfiguration.CHANNEL_3POINT1POINT2; 208 case VALUE_CHANNEL_QUAD: 209 return StreamConfiguration.CHANNEL_QUAD; 210 case VALUE_CHANNEL_QUAD_SIDE: 211 case VALUE_CHANNEL_QUAD_SIDE_LOWERCASE: 212 return StreamConfiguration.CHANNEL_QUAD_SIDE; 213 case VALUE_CHANNEL_SURROUND: 214 return StreamConfiguration.CHANNEL_SURROUND; 215 case VALUE_CHANNEL_PENTA: 216 return StreamConfiguration.CHANNEL_PENTA; 217 case VALUE_CHANNEL_5POINT1: 218 return StreamConfiguration.CHANNEL_5POINT1; 219 case VALUE_CHANNEL_5POINT1_SIDE: 220 case VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE: 221 return StreamConfiguration.CHANNEL_5POINT1_SIDE; 222 case VALUE_CHANNEL_6POINT1: 223 return StreamConfiguration.CHANNEL_6POINT1; 224 case VALUE_CHANNEL_7POINT1: 225 return StreamConfiguration.CHANNEL_7POINT1; 226 case VALUE_CHANNEL_5POINT1POINT2: 227 return StreamConfiguration.CHANNEL_5POINT1POINT2; 228 case VALUE_CHANNEL_5POINT1POINT4: 229 return StreamConfiguration.CHANNEL_5POINT1POINT4; 230 case VALUE_CHANNEL_7POINT1POINT2: 231 return StreamConfiguration.CHANNEL_7POINT1POINT2; 232 case VALUE_CHANNEL_7POINT1POINT4: 233 return StreamConfiguration.CHANNEL_7POINT1POINT4; 234 case VALUE_CHANNEL_9POINT1POINT4: 235 return StreamConfiguration.CHANNEL_9POINT1POINT4; 236 case VALUE_CHANNEL_9POINT1POINT6: 237 return StreamConfiguration.CHANNEL_9POINT1POINT6; 238 case VALUE_CHANNEL_FRONT_BACK: 239 case VALUE_CHANNEL_FRONT_BACK_LOWERCASE: 240 return StreamConfiguration.CHANNEL_FRONT_BACK; 241 default: 242 throw new IllegalArgumentException( 243 channelMaskKey + " invalid: " + channelMaskText); 244 } 245 } 246 configureOutputStreamFromBundle(Bundle bundle, StreamConfiguration requestedOutConfig)247 public static void configureOutputStreamFromBundle(Bundle bundle, 248 StreamConfiguration requestedOutConfig) { 249 int audioApi; 250 String text; 251 252 requestedOutConfig.reset(); 253 254 int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE); 255 requestedOutConfig.setSampleRate(sampleRate); 256 257 text = bundle.getString(KEY_OUT_API, VALUE_UNSPECIFIED); 258 audioApi = getApiFromText(text); 259 requestedOutConfig.setNativeApi(audioApi); 260 261 int outChannels = bundle.getInt(KEY_OUT_CHANNELS, VALUE_DEFAULT_CHANNELS); 262 int channelMask = getChannelMaskFromBundle(bundle, KEY_OUT_CHANNEL_MASK); 263 // Respect channel mask when it is specified. 264 if (channelMask != StreamConfiguration.UNSPECIFIED) { 265 requestedOutConfig.setChannelMask(channelMask); 266 } else { 267 requestedOutConfig.setChannelCount(outChannels); 268 } 269 270 boolean outMMAP = bundle.getBoolean(KEY_OUT_USE_MMAP, VALUE_DEFAULT_USE_MMAP); 271 requestedOutConfig.setMMap(outMMAP); 272 273 text = bundle.getString(KEY_OUT_PERF, VALUE_PERF_LOW_LATENCY); 274 int perfMode = getPerfFromText(text); 275 requestedOutConfig.setPerformanceMode(perfMode); 276 277 text = bundle.getString(KEY_OUT_SHARING, VALUE_SHARING_EXCLUSIVE); 278 int sharingMode = getSharingFromText(text); 279 requestedOutConfig.setSharingMode(sharingMode); 280 281 } 282 configureInputStreamFromBundle(Bundle bundle, StreamConfiguration requestedInConfig)283 public static void configureInputStreamFromBundle(Bundle bundle, 284 StreamConfiguration requestedInConfig) { 285 int audioApi; 286 String text; 287 288 requestedInConfig.reset(); 289 290 int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE); 291 requestedInConfig.setSampleRate(sampleRate); 292 293 text = bundle.getString(KEY_IN_API, VALUE_UNSPECIFIED); 294 audioApi = getApiFromText(text); 295 requestedInConfig.setNativeApi(audioApi); 296 297 int inChannels = bundle.getInt(KEY_IN_CHANNELS, VALUE_DEFAULT_CHANNELS); 298 int channelMask = getChannelMaskFromBundle(bundle, KEY_IN_CHANNEL_MASK); 299 // Respect channel mask when it is specified. 300 if (channelMask != StreamConfiguration.UNSPECIFIED) { 301 requestedInConfig.setChannelMask(channelMask); 302 } else { 303 requestedInConfig.setChannelCount(inChannels); 304 } 305 306 boolean inMMAP = bundle.getBoolean(KEY_IN_USE_MMAP, VALUE_DEFAULT_USE_MMAP); 307 requestedInConfig.setMMap(inMMAP); 308 309 text = bundle.getString(KEY_IN_PERF, VALUE_PERF_LOW_LATENCY); 310 int perfMode = getPerfFromText(text); 311 requestedInConfig.setPerformanceMode(perfMode); 312 313 text = bundle.getString(KEY_IN_SHARING, VALUE_SHARING_EXCLUSIVE); 314 int sharingMode = getSharingFromText(text); 315 requestedInConfig.setSharingMode(sharingMode); 316 317 String defaultText = StreamConfiguration.convertInputPresetToText( 318 StreamConfiguration.INPUT_PRESET_VOICE_RECOGNITION); 319 text = bundle.getString(KEY_IN_PRESET, defaultText); 320 int inputPreset = StreamConfiguration.convertTextToInputPreset(text); 321 if (inputPreset < 0) throw new IllegalArgumentException(KEY_IN_PRESET + " invalid: " + text); 322 requestedInConfig.setInputPreset(inputPreset); 323 } 324 getSignalTypeFromBundle(Bundle bundle)325 public static int getSignalTypeFromBundle(Bundle bundle) { 326 String signalTypeText = bundle.getString(KEY_SIGNAL_TYPE); 327 if (signalTypeText == null) { 328 return 0; 329 } 330 switch (signalTypeText) { 331 case VALUE_SIGNAL_SINE: 332 return 0; 333 case VALUE_SIGNAL_SAWTOOTH: 334 return 1; 335 case VALUE_SIGNAL_FREQ_SWEEP: 336 return 2; 337 case VALUE_SIGNAL_PITCH_SWEEP: 338 return 3; 339 case VALUE_SIGNAL_WHITE_NOISE: 340 return 4; 341 default: 342 throw new IllegalArgumentException( 343 KEY_SIGNAL_TYPE + " invalid: " + signalTypeText); 344 } 345 } 346 getDurationSeconds(Bundle bundle)347 public static int getDurationSeconds(Bundle bundle) { 348 return bundle.getInt(KEY_DURATION, VALUE_DEFAULT_DURATION); 349 } 350 } 351