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 = NativeEngine.isMMapSupported(); 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_OUT_USAGE = "out_usage"; 50 public static final String VALUE_USAGE_MEDIA = "media"; 51 public static final String VALUE_USAGE_VOICE_COMMUNICATION = "voice_communication"; 52 public static final String VALUE_USAGE_ALARM = "alarm"; 53 public static final String VALUE_USAGE_NOTIFICATION = "notification"; 54 public static final String VALUE_USAGE_GAME = "game"; 55 56 public static final String KEY_IN_API = "in_api"; 57 public static final String KEY_OUT_API = "out_api"; 58 public static final String VALUE_API_AAUDIO = "aaudio"; 59 public static final String VALUE_API_OPENSLES = "opensles"; 60 61 public static final String KEY_FILE_NAME = "file"; 62 public static final String KEY_BUFFER_BURSTS = "buffer_bursts"; 63 public static final String KEY_BACKGROUND = "background"; 64 public static final String KEY_VOLUME = "volume"; 65 66 public static final String KEY_VOLUME_TYPE = "volume_type"; 67 public static final float VALUE_VOLUME_INVALID = -1.0f; 68 public static final String VALUE_VOLUME_TYPE_ACCESSIBILITY = "accessibility"; 69 public static final String VALUE_VOLUME_TYPE_ALARM = "alarm"; 70 public static final String VALUE_VOLUME_TYPE_DTMF = "dtmf"; 71 public static final String VALUE_VOLUME_TYPE_MUSIC = "music"; 72 public static final String VALUE_VOLUME_TYPE_NOTIFICATION = "notification"; 73 public static final String VALUE_VOLUME_TYPE_RING = "ring"; 74 public static final String VALUE_VOLUME_TYPE_SYSTEM = "system"; 75 public static final String VALUE_VOLUME_TYPE_VOICE_CALL = "voice_call"; 76 77 public static final String KEY_IN_CHANNEL_MASK = "in_channel_mask"; 78 public static final String KEY_OUT_CHANNEL_MASK = "out_channel_mask"; 79 public static final String VALUE_CHANNEL_MONO = "mono"; 80 public static final String VALUE_CHANNEL_STEREO = "stereo"; 81 public static final String VALUE_CHANNEL_2POINT1 = "2.1"; 82 public static final String VALUE_CHANNEL_TRI = "tri"; 83 public static final String VALUE_CHANNEL_TRI_BACK = "triBack"; 84 public static final String VALUE_CHANNEL_TRI_BACK_LOWERCASE = "triback"; 85 public static final String VALUE_CHANNEL_3POINT1 = "3.1"; 86 public static final String VALUE_CHANNEL_2POINT0POINT2 = "2.0.2"; 87 public static final String VALUE_CHANNEL_2POINT1POINT2 = "2.1.2"; 88 public static final String VALUE_CHANNEL_3POINT0POINT2 = "3.0.2"; 89 public static final String VALUE_CHANNEL_3POINT1POINT2 = "3.1.2"; 90 public static final String VALUE_CHANNEL_QUAD = "quad"; 91 public static final String VALUE_CHANNEL_QUAD_SIDE = "quadSide"; 92 public static final String VALUE_CHANNEL_QUAD_SIDE_LOWERCASE = "quadside"; 93 public static final String VALUE_CHANNEL_SURROUND = "surround"; 94 public static final String VALUE_CHANNEL_PENTA = "penta"; 95 public static final String VALUE_CHANNEL_5POINT1 = "5.1"; 96 public static final String VALUE_CHANNEL_5POINT1_SIDE = "5.1Side"; 97 public static final String VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE = "5.1side"; 98 public static final String VALUE_CHANNEL_6POINT1 = "6.1"; 99 public static final String VALUE_CHANNEL_7POINT1 = "7.1"; 100 public static final String VALUE_CHANNEL_5POINT1POINT2 = "5.1.2"; 101 public static final String VALUE_CHANNEL_5POINT1POINT4 = "5.1.4"; 102 public static final String VALUE_CHANNEL_7POINT1POINT2 = "7.1.2"; 103 public static final String VALUE_CHANNEL_7POINT1POINT4 = "7.1.4"; 104 public static final String VALUE_CHANNEL_9POINT1POINT4 = "9.1.4"; 105 public static final String VALUE_CHANNEL_9POINT1POINT6 = "9.1.6"; 106 public static final String VALUE_CHANNEL_FRONT_BACK = "frontBack"; 107 public static final String VALUE_CHANNEL_FRONT_BACK_LOWERCASE = "frontback"; 108 109 public static final String KEY_SIGNAL_TYPE = "signal_type"; 110 public static final String VALUE_SIGNAL_SINE = "sine"; 111 public static final String VALUE_SIGNAL_SAWTOOTH = "sawtooth"; 112 public static final String VALUE_SIGNAL_FREQ_SWEEP = "freq_sweep"; 113 public static final String VALUE_SIGNAL_PITCH_SWEEP = "pitch_sweep"; 114 public static final String VALUE_SIGNAL_WHITE_NOISE = "white_noise"; 115 116 public static final String KEY_DURATION = "duration"; 117 public static final int VALUE_DEFAULT_DURATION = 10; 118 getApiFromText(String text)119 public static int getApiFromText(String text) { 120 if (VALUE_API_AAUDIO.equals(text)) { 121 return StreamConfiguration.NATIVE_API_AAUDIO; 122 } else if (VALUE_API_OPENSLES.equals(text)) { 123 return StreamConfiguration.NATIVE_API_OPENSLES; 124 } else { 125 return StreamConfiguration.NATIVE_API_UNSPECIFIED; 126 } 127 } 128 getPerfFromText(String text)129 public static int getPerfFromText(String text) { 130 if (VALUE_PERF_NONE.equals(text)) { 131 return StreamConfiguration.PERFORMANCE_MODE_NONE; 132 } else if (VALUE_PERF_POWERSAVE.equals(text)) { 133 return StreamConfiguration.PERFORMANCE_MODE_POWER_SAVING; 134 } else if (VALUE_PERF_LOW_LATENCY.equals(text)) { 135 return StreamConfiguration.PERFORMANCE_MODE_LOW_LATENCY; 136 } else { 137 throw new IllegalArgumentException("perf mode invalid: " + text); 138 } 139 } 140 getSharingFromText(String text)141 public static int getSharingFromText(String text) { 142 if (VALUE_SHARING_SHARED.equals(text)) { 143 return StreamConfiguration.SHARING_MODE_SHARED; 144 } else { 145 return StreamConfiguration.SHARING_MODE_EXCLUSIVE; 146 } 147 } getUsageFromText(String text)148 public static int getUsageFromText(String text) { 149 if (VALUE_USAGE_GAME.equals(text)) { 150 return StreamConfiguration.USAGE_GAME; 151 } else if (VALUE_USAGE_VOICE_COMMUNICATION.equals(text)) { 152 return StreamConfiguration.USAGE_VOICE_COMMUNICATION; 153 } else if (VALUE_USAGE_MEDIA.equals(text)) { 154 return StreamConfiguration.USAGE_MEDIA; 155 } else if (VALUE_USAGE_ALARM.equals(text)) { 156 return StreamConfiguration.USAGE_ALARM; 157 } else if (VALUE_USAGE_NOTIFICATION.equals(text)) { 158 return StreamConfiguration.USAGE_NOTIFICATION; 159 } else { 160 return StreamConfiguration.UNSPECIFIED; 161 } 162 } 163 configureStreamsFromBundle(Bundle bundle, StreamConfiguration requestedInConfig, StreamConfiguration requestedOutConfig)164 public static void configureStreamsFromBundle(Bundle bundle, 165 StreamConfiguration requestedInConfig, 166 StreamConfiguration requestedOutConfig) { 167 configureInputStreamFromBundle(bundle, requestedInConfig); 168 configureOutputStreamFromBundle(bundle, requestedOutConfig); 169 } 170 getNormalizedVolumeFromBundle(Bundle bundle)171 public static float getNormalizedVolumeFromBundle(Bundle bundle) { 172 return bundle.getFloat(KEY_VOLUME, VALUE_VOLUME_INVALID); 173 } 174 175 /** 176 * @param bundle 177 * @return AudioManager.STREAM type or throw IllegalArgumentException 178 */ getVolumeStreamTypeFromBundle(Bundle bundle)179 public static int getVolumeStreamTypeFromBundle(Bundle bundle) { 180 String typeText = bundle.getString(KEY_VOLUME_TYPE, VALUE_VOLUME_TYPE_MUSIC); 181 switch (typeText) { 182 case VALUE_VOLUME_TYPE_ACCESSIBILITY: 183 return AudioManager.STREAM_ACCESSIBILITY; 184 case VALUE_VOLUME_TYPE_ALARM: 185 return AudioManager.STREAM_ALARM; 186 case VALUE_VOLUME_TYPE_DTMF: 187 return AudioManager.STREAM_DTMF; 188 case VALUE_VOLUME_TYPE_MUSIC: 189 return AudioManager.STREAM_MUSIC; 190 case VALUE_VOLUME_TYPE_NOTIFICATION: 191 return AudioManager.STREAM_NOTIFICATION; 192 case VALUE_VOLUME_TYPE_RING: 193 return AudioManager.STREAM_RING; 194 case VALUE_VOLUME_TYPE_SYSTEM: 195 return AudioManager.STREAM_SYSTEM; 196 case VALUE_VOLUME_TYPE_VOICE_CALL: 197 return AudioManager.STREAM_VOICE_CALL; 198 default: 199 throw new IllegalArgumentException(KEY_VOLUME_TYPE + " invalid: " + typeText); 200 } 201 } 202 getChannelMaskFromBundle(Bundle bundle, String channelMaskKey)203 public static int getChannelMaskFromBundle(Bundle bundle, String channelMaskKey) { 204 String channelMaskText = bundle.getString(channelMaskKey); 205 if (channelMaskText == null) { 206 return StreamConfiguration.UNSPECIFIED; 207 } 208 switch (channelMaskText) { 209 case VALUE_CHANNEL_MONO: 210 return StreamConfiguration.CHANNEL_MONO; 211 case VALUE_CHANNEL_STEREO: 212 return StreamConfiguration.CHANNEL_STEREO; 213 case VALUE_CHANNEL_2POINT1: 214 return StreamConfiguration.CHANNEL_2POINT1; 215 case VALUE_CHANNEL_TRI: 216 return StreamConfiguration.CHANNEL_TRI; 217 case VALUE_CHANNEL_TRI_BACK: 218 case VALUE_CHANNEL_TRI_BACK_LOWERCASE: 219 return StreamConfiguration.CHANNEL_TRI_BACK; 220 case VALUE_CHANNEL_3POINT1: 221 return StreamConfiguration.CHANNEL_3POINT1; 222 case VALUE_CHANNEL_2POINT0POINT2: 223 return StreamConfiguration.CHANNEL_2POINT0POINT2; 224 case VALUE_CHANNEL_2POINT1POINT2: 225 return StreamConfiguration.CHANNEL_2POINT1POINT2; 226 case VALUE_CHANNEL_3POINT0POINT2: 227 return StreamConfiguration.CHANNEL_3POINT0POINT2; 228 case VALUE_CHANNEL_3POINT1POINT2: 229 return StreamConfiguration.CHANNEL_3POINT1POINT2; 230 case VALUE_CHANNEL_QUAD: 231 return StreamConfiguration.CHANNEL_QUAD; 232 case VALUE_CHANNEL_QUAD_SIDE: 233 case VALUE_CHANNEL_QUAD_SIDE_LOWERCASE: 234 return StreamConfiguration.CHANNEL_QUAD_SIDE; 235 case VALUE_CHANNEL_SURROUND: 236 return StreamConfiguration.CHANNEL_SURROUND; 237 case VALUE_CHANNEL_PENTA: 238 return StreamConfiguration.CHANNEL_PENTA; 239 case VALUE_CHANNEL_5POINT1: 240 return StreamConfiguration.CHANNEL_5POINT1; 241 case VALUE_CHANNEL_5POINT1_SIDE: 242 case VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE: 243 return StreamConfiguration.CHANNEL_5POINT1_SIDE; 244 case VALUE_CHANNEL_6POINT1: 245 return StreamConfiguration.CHANNEL_6POINT1; 246 case VALUE_CHANNEL_7POINT1: 247 return StreamConfiguration.CHANNEL_7POINT1; 248 case VALUE_CHANNEL_5POINT1POINT2: 249 return StreamConfiguration.CHANNEL_5POINT1POINT2; 250 case VALUE_CHANNEL_5POINT1POINT4: 251 return StreamConfiguration.CHANNEL_5POINT1POINT4; 252 case VALUE_CHANNEL_7POINT1POINT2: 253 return StreamConfiguration.CHANNEL_7POINT1POINT2; 254 case VALUE_CHANNEL_7POINT1POINT4: 255 return StreamConfiguration.CHANNEL_7POINT1POINT4; 256 case VALUE_CHANNEL_9POINT1POINT4: 257 return StreamConfiguration.CHANNEL_9POINT1POINT4; 258 case VALUE_CHANNEL_9POINT1POINT6: 259 return StreamConfiguration.CHANNEL_9POINT1POINT6; 260 case VALUE_CHANNEL_FRONT_BACK: 261 case VALUE_CHANNEL_FRONT_BACK_LOWERCASE: 262 return StreamConfiguration.CHANNEL_FRONT_BACK; 263 default: 264 throw new IllegalArgumentException( 265 channelMaskKey + " invalid: " + channelMaskText); 266 } 267 } 268 configureOutputStreamFromBundle(Bundle bundle, StreamConfiguration requestedOutConfig)269 public static void configureOutputStreamFromBundle(Bundle bundle, 270 StreamConfiguration requestedOutConfig) { 271 int audioApi; 272 String text; 273 274 requestedOutConfig.reset(); 275 276 int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE); 277 requestedOutConfig.setSampleRate(sampleRate); 278 279 text = bundle.getString(KEY_OUT_API, VALUE_UNSPECIFIED); 280 audioApi = getApiFromText(text); 281 requestedOutConfig.setNativeApi(audioApi); 282 283 int outChannels = bundle.getInt(KEY_OUT_CHANNELS, VALUE_DEFAULT_CHANNELS); 284 int channelMask = getChannelMaskFromBundle(bundle, KEY_OUT_CHANNEL_MASK); 285 // Respect channel mask when it is specified. 286 if (channelMask != StreamConfiguration.UNSPECIFIED) { 287 requestedOutConfig.setChannelMask(channelMask); 288 } else { 289 requestedOutConfig.setChannelCount(outChannels); 290 } 291 292 boolean outMMAP = bundle.getBoolean(KEY_OUT_USE_MMAP, VALUE_DEFAULT_USE_MMAP); 293 requestedOutConfig.setMMap(outMMAP); 294 295 text = bundle.getString(KEY_OUT_PERF, VALUE_PERF_LOW_LATENCY); 296 int perfMode = getPerfFromText(text); 297 requestedOutConfig.setPerformanceMode(perfMode); 298 299 text = bundle.getString(KEY_OUT_SHARING, VALUE_SHARING_EXCLUSIVE); 300 int sharingMode = getSharingFromText(text); 301 requestedOutConfig.setSharingMode(sharingMode); 302 303 text = bundle.getString(KEY_OUT_USAGE, VALUE_USAGE_MEDIA); 304 int usage = getUsageFromText(text); 305 requestedOutConfig.setUsage(usage); 306 307 308 } 309 configureInputStreamFromBundle(Bundle bundle, StreamConfiguration requestedInConfig)310 public static void configureInputStreamFromBundle(Bundle bundle, 311 StreamConfiguration requestedInConfig) { 312 int audioApi; 313 String text; 314 315 requestedInConfig.reset(); 316 317 int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE); 318 requestedInConfig.setSampleRate(sampleRate); 319 320 text = bundle.getString(KEY_IN_API, VALUE_UNSPECIFIED); 321 audioApi = getApiFromText(text); 322 requestedInConfig.setNativeApi(audioApi); 323 324 int inChannels = bundle.getInt(KEY_IN_CHANNELS, VALUE_DEFAULT_CHANNELS); 325 int channelMask = getChannelMaskFromBundle(bundle, KEY_IN_CHANNEL_MASK); 326 // Respect channel mask when it is specified. 327 if (channelMask != StreamConfiguration.UNSPECIFIED) { 328 requestedInConfig.setChannelMask(channelMask); 329 } else { 330 requestedInConfig.setChannelCount(inChannels); 331 } 332 333 boolean inMMAP = bundle.getBoolean(KEY_IN_USE_MMAP, VALUE_DEFAULT_USE_MMAP); 334 requestedInConfig.setMMap(inMMAP); 335 336 text = bundle.getString(KEY_IN_PERF, VALUE_PERF_LOW_LATENCY); 337 int perfMode = getPerfFromText(text); 338 requestedInConfig.setPerformanceMode(perfMode); 339 340 text = bundle.getString(KEY_IN_SHARING, VALUE_SHARING_EXCLUSIVE); 341 int sharingMode = getSharingFromText(text); 342 requestedInConfig.setSharingMode(sharingMode); 343 344 String defaultText = StreamConfiguration.convertInputPresetToText( 345 StreamConfiguration.INPUT_PRESET_VOICE_RECOGNITION); 346 text = bundle.getString(KEY_IN_PRESET, defaultText); 347 int inputPreset = StreamConfiguration.convertTextToInputPreset(text); 348 if (inputPreset < 0) throw new IllegalArgumentException(KEY_IN_PRESET + " invalid: " + text); 349 requestedInConfig.setInputPreset(inputPreset); 350 } 351 getSignalTypeFromBundle(Bundle bundle)352 public static int getSignalTypeFromBundle(Bundle bundle) { 353 String signalTypeText = bundle.getString(KEY_SIGNAL_TYPE); 354 if (signalTypeText == null) { 355 return 0; 356 } 357 switch (signalTypeText) { 358 case VALUE_SIGNAL_SINE: 359 return 0; 360 case VALUE_SIGNAL_SAWTOOTH: 361 return 1; 362 case VALUE_SIGNAL_FREQ_SWEEP: 363 return 2; 364 case VALUE_SIGNAL_PITCH_SWEEP: 365 return 3; 366 case VALUE_SIGNAL_WHITE_NOISE: 367 return 4; 368 default: 369 throw new IllegalArgumentException( 370 KEY_SIGNAL_TYPE + " invalid: " + signalTypeText); 371 } 372 } 373 getDurationSeconds(Bundle bundle)374 public static int getDurationSeconds(Bundle bundle) { 375 return bundle.getInt(KEY_DURATION, VALUE_DEFAULT_DURATION); 376 } 377 } 378