1 /* 2 * Copyright 2017 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 java.util.ArrayList; 20 import java.util.HashMap; 21 import java.util.List; 22 import java.util.Locale; 23 24 /** 25 * Container for the properties of a Stream. 26 * 27 * This can be used to build a stream, or as a base class for a Stream, 28 * or as a way to report the properties of a Stream. 29 */ 30 31 public class StreamConfiguration { 32 public static final int UNSPECIFIED = 0; 33 34 // These must match order in Spinner and in native code and in AAudio.h 35 public static final int NATIVE_API_UNSPECIFIED = 0; 36 public static final int NATIVE_API_OPENSLES = 1; 37 public static final int NATIVE_API_AAUDIO = 2; 38 39 public static final int SHARING_MODE_EXCLUSIVE = 0; // must match AAUDIO 40 public static final int SHARING_MODE_SHARED = 1; // must match AAUDIO 41 42 public static final int AUDIO_FORMAT_PCM_16 = 1; // must match AAUDIO 43 public static final int AUDIO_FORMAT_PCM_FLOAT = 2; // must match AAUDIO 44 public static final int AUDIO_FORMAT_PCM_24 = 3; // must match AAUDIO 45 public static final int AUDIO_FORMAT_PCM_32 = 4; // must match AAUDIO 46 public static final int AUDIO_FORMAT_IEC61937 = 5; // must match AAUDIO 47 48 public static final int DIRECTION_OUTPUT = 0; // must match AAUDIO 49 public static final int DIRECTION_INPUT = 1; // must match AAUDIO 50 51 public static final int SESSION_ID_NONE = -1; // must match AAUDIO 52 public static final int SESSION_ID_ALLOCATE = 0; // must match AAUDIO 53 54 public static final int PERFORMANCE_MODE_NONE = 10; // must match AAUDIO 55 public static final int PERFORMANCE_MODE_POWER_SAVING = 11; // must match AAUDIO 56 public static final int PERFORMANCE_MODE_LOW_LATENCY = 12; // must match AAUDIO 57 public static final int PERFORMANCE_MODE_POWER_SAVING_OFFLOAD = 13; // must match AAUDIO 58 59 public static final int RATE_CONVERSION_QUALITY_NONE = 0; // must match Oboe 60 public static final int RATE_CONVERSION_QUALITY_FASTEST = 1; // must match Oboe 61 public static final int RATE_CONVERSION_QUALITY_LOW = 2; // must match Oboe 62 public static final int RATE_CONVERSION_QUALITY_MEDIUM = 3; // must match Oboe 63 public static final int RATE_CONVERSION_QUALITY_HIGH = 4; // must match Oboe 64 public static final int RATE_CONVERSION_QUALITY_BEST = 5; // must match Oboe 65 66 public static final int STREAM_STATE_STARTING = 3; // must match Oboe 67 public static final int STREAM_STATE_STARTED = 4; // must match Oboe 68 69 public static final int INPUT_PRESET_GENERIC = 1; // must match Oboe 70 public static final int INPUT_PRESET_CAMCORDER = 5; // must match Oboe 71 public static final int INPUT_PRESET_VOICE_RECOGNITION = 6; // must match Oboe 72 public static final int INPUT_PRESET_VOICE_COMMUNICATION = 7; // must match Oboe 73 public static final int INPUT_PRESET_UNPROCESSED = 9; // must match Oboe 74 public static final int INPUT_PRESET_VOICE_PERFORMANCE = 10; // must match Oboe 75 76 public static final int SPATIALIZATION_BEHAVIOR_AUTO = 1; // must match Oboe 77 public static final int SPATIALIZATION_BEHAVIOR_NEVER = 2; // must match Oboe 78 79 public static final int ERROR_BASE = -900; // must match Oboe 80 public static final int ERROR_DISCONNECTED = -899; // must match Oboe 81 public static final int ERROR_ILLEGAL_ARGUMENT = -898; // must match Oboe 82 public static final int ERROR_INTERNAL = -896; // must match Oboe 83 public static final int ERROR_INVALID_STATE = -895; // must match Oboe 84 public static final int ERROR_INVALID_HANDLE = -892; // must match Oboe 85 public static final int ERROR_UNIMPLEMENTED = -890; // must match Oboe 86 public static final int ERROR_UNAVAILABLE = -889; // must match Oboe 87 public static final int ERROR_NO_FREE_HANDLES = -888; // must match Oboe 88 public static final int ERROR_NO_MEMORY = -887; // must match Oboe 89 public static final int ERROR_NULL = -886; // must match Oboe 90 public static final int ERROR_TIMEOUT = -885; // must match Oboe 91 public static final int ERROR_WOULD_BLOCK = -884; // must match Oboe 92 public static final int ERROR_INVALID_FORMAT = -883; // must match Oboe 93 public static final int ERROR_OUT_OF_RANGE = -882; // must match Oboe 94 public static final int ERROR_NO_SERVICE = -881; // must match Oboe 95 public static final int ERROR_INVALID_RATE = -880; // must match Oboe 96 public static final int ERROR_CLOSED = -869; // must match Oboe 97 public static final int ERROR_OK = 0; // must match Oboe 98 99 public static final int USAGE_MEDIA = 1; 100 public static final int USAGE_VOICE_COMMUNICATION = 2; 101 public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3; 102 public static final int USAGE_ALARM = 4; 103 public static final int USAGE_NOTIFICATION = 5; 104 public static final int USAGE_NOTIFICATION_RINGTONE = 6; 105 public static final int USAGE_NOTIFICATION_EVENT = 10; 106 public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; 107 public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; 108 public static final int USAGE_ASSISTANCE_SONIFICATION = 13; 109 public static final int USAGE_GAME = 14; 110 public static final int USAGE_ASSISTANT = 16; 111 112 public static final int CONTENT_TYPE_SPEECH = 1; 113 public static final int CONTENT_TYPE_MUSIC = 2; 114 public static final int CONTENT_TYPE_MOVIE = 3; 115 public static final int CONTENT_TYPE_SONIFICATION = 4; 116 117 public static final int CHANNEL_FRONT_LEFT = 1 << 0; 118 public static final int CHANNEL_FRONT_RIGHT = 1 << 1; 119 public static final int CHANNEL_FRONT_CENTER = 1 << 2; 120 public static final int CHANNEL_LOW_FREQUENCY = 1 << 3; 121 public static final int CHANNEL_BACK_LEFT = 1 << 4; 122 public static final int CHANNEL_BACK_RIGHT = 1 << 5; 123 public static final int CHANNEL_FRONT_LEFT_OF_CENTER = 1 << 6; 124 public static final int CHANNEL_FRONT_RIGHT_OF_CENTER = 1 << 7; 125 public static final int CHANNEL_BACK_CENTER = 1 << 8; 126 public static final int CHANNEL_SIDE_LEFT = 1 << 9; 127 public static final int CHANNEL_SIDE_RIGHT = 1 << 10; 128 public static final int CHANNEL_TOP_CENTER = 1 << 11; 129 public static final int CHANNEL_TOP_FRONT_LEFT = 1 << 12; 130 public static final int CHANNEL_TOP_FRONT_CENTER = 1 << 13; 131 public static final int CHANNEL_TOP_FRONT_RIGHT = 1 << 14; 132 public static final int CHANNEL_TOP_BACK_LEFT = 1 << 15; 133 public static final int CHANNEL_TOP_BACK_CENTER = 1 << 16; 134 public static final int CHANNEL_TOP_BACK_RIGHT = 1 << 17; 135 public static final int CHANNEL_TOP_SIDE_LEFT = 1 << 18; 136 public static final int CHANNEL_TOP_SIDE_RIGHT = 1 << 19; 137 public static final int CHANNEL_BOTTOM_FRONT_LEFT = 1 << 20; 138 public static final int CHANNEL_BOTTOM_FRONT_CENTER = 1 << 21; 139 public static final int CHANNEL_BOTTOM_FRONT_RIGHT = 1 << 22; 140 public static final int CHANNEL_LOW_FREQUENCY_2 = 1 << 23; 141 public static final int CHANNEL_FRONT_WIDE_LEFT = 1 << 24; 142 public static final int CHANNEL_FRONT_WIDE_RIGHT = 1 << 25; 143 144 public static final int CHANNEL_MONO = CHANNEL_FRONT_LEFT; 145 public static final int CHANNEL_STEREO = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT; 146 public static final int CHANNEL_2POINT1 = CHANNEL_FRONT_LEFT | 147 CHANNEL_FRONT_RIGHT | 148 CHANNEL_LOW_FREQUENCY; 149 public static final int CHANNEL_TRI = CHANNEL_FRONT_LEFT | 150 CHANNEL_FRONT_RIGHT | 151 CHANNEL_FRONT_CENTER; 152 public static final int CHANNEL_TRI_BACK = CHANNEL_FRONT_LEFT | 153 CHANNEL_FRONT_RIGHT | 154 CHANNEL_BACK_CENTER; 155 public static final int CHANNEL_3POINT1 = CHANNEL_FRONT_LEFT | 156 CHANNEL_FRONT_RIGHT | 157 CHANNEL_FRONT_CENTER | 158 CHANNEL_LOW_FREQUENCY; 159 public static final int CHANNEL_2POINT0POINT2 = CHANNEL_FRONT_LEFT | 160 CHANNEL_FRONT_RIGHT | 161 CHANNEL_TOP_SIDE_LEFT | 162 CHANNEL_TOP_SIDE_RIGHT; 163 public static final int CHANNEL_2POINT1POINT2 = CHANNEL_2POINT0POINT2 | CHANNEL_LOW_FREQUENCY; 164 public static final int CHANNEL_3POINT0POINT2 = CHANNEL_FRONT_LEFT | 165 CHANNEL_FRONT_RIGHT | 166 CHANNEL_FRONT_CENTER | 167 CHANNEL_TOP_SIDE_LEFT | 168 CHANNEL_TOP_SIDE_RIGHT; 169 public static final int CHANNEL_3POINT1POINT2 = CHANNEL_3POINT0POINT2 | CHANNEL_LOW_FREQUENCY; 170 public static final int CHANNEL_QUAD = CHANNEL_FRONT_LEFT | 171 CHANNEL_FRONT_RIGHT | 172 CHANNEL_BACK_LEFT | 173 CHANNEL_BACK_RIGHT; 174 public static final int CHANNEL_QUAD_SIDE = CHANNEL_FRONT_LEFT | 175 CHANNEL_FRONT_RIGHT | 176 CHANNEL_SIDE_LEFT | 177 CHANNEL_SIDE_RIGHT; 178 public static final int CHANNEL_SURROUND = CHANNEL_FRONT_LEFT | 179 CHANNEL_FRONT_RIGHT | 180 CHANNEL_FRONT_CENTER | 181 CHANNEL_BACK_CENTER; 182 public static final int CHANNEL_PENTA = CHANNEL_QUAD | CHANNEL_FRONT_CENTER; 183 // aka 5POINT1_BACK 184 public static final int CHANNEL_5POINT1 = CHANNEL_FRONT_LEFT | 185 CHANNEL_FRONT_RIGHT | 186 CHANNEL_FRONT_CENTER | 187 CHANNEL_LOW_FREQUENCY | 188 CHANNEL_BACK_LEFT | 189 CHANNEL_BACK_RIGHT; 190 public static final int CHANNEL_5POINT1_SIDE = CHANNEL_FRONT_LEFT | 191 CHANNEL_FRONT_RIGHT | 192 CHANNEL_FRONT_CENTER | 193 CHANNEL_LOW_FREQUENCY | 194 CHANNEL_SIDE_LEFT | 195 CHANNEL_SIDE_RIGHT; 196 public static final int CHANNEL_6POINT1 = CHANNEL_FRONT_LEFT | 197 CHANNEL_FRONT_RIGHT | 198 CHANNEL_FRONT_CENTER | 199 CHANNEL_LOW_FREQUENCY | 200 CHANNEL_BACK_LEFT | 201 CHANNEL_BACK_RIGHT | 202 CHANNEL_BACK_CENTER; 203 public static final int CHANNEL_7POINT1 = CHANNEL_5POINT1 | 204 CHANNEL_SIDE_LEFT | 205 CHANNEL_SIDE_RIGHT; 206 public static final int CHANNEL_5POINT1POINT2 = CHANNEL_5POINT1 | 207 CHANNEL_TOP_SIDE_LEFT | 208 CHANNEL_TOP_SIDE_RIGHT; 209 public static final int CHANNEL_5POINT1POINT4 = CHANNEL_5POINT1 | 210 CHANNEL_TOP_FRONT_LEFT | 211 CHANNEL_TOP_FRONT_RIGHT | 212 CHANNEL_TOP_BACK_LEFT | 213 CHANNEL_TOP_BACK_RIGHT; 214 public static final int CHANNEL_7POINT1POINT2 = CHANNEL_7POINT1 | 215 CHANNEL_TOP_SIDE_LEFT | 216 CHANNEL_TOP_SIDE_RIGHT; 217 public static final int CHANNEL_7POINT1POINT4 = CHANNEL_7POINT1 | 218 CHANNEL_TOP_FRONT_LEFT | 219 CHANNEL_TOP_FRONT_RIGHT | 220 CHANNEL_TOP_BACK_LEFT | 221 CHANNEL_TOP_BACK_RIGHT; 222 public static final int CHANNEL_9POINT1POINT4 = CHANNEL_7POINT1POINT4 | 223 CHANNEL_FRONT_WIDE_LEFT | 224 CHANNEL_FRONT_WIDE_RIGHT; 225 public static final int CHANNEL_9POINT1POINT6 = CHANNEL_9POINT1POINT4 | 226 CHANNEL_TOP_SIDE_LEFT | 227 CHANNEL_TOP_SIDE_RIGHT; 228 public static final int CHANNEL_FRONT_BACK = CHANNEL_FRONT_CENTER | CHANNEL_BACK_CENTER; 229 230 public static final int[] usages = { 231 USAGE_MEDIA, 232 USAGE_VOICE_COMMUNICATION, 233 USAGE_VOICE_COMMUNICATION_SIGNALLING, 234 USAGE_ALARM, 235 USAGE_NOTIFICATION, 236 USAGE_NOTIFICATION_RINGTONE, 237 USAGE_NOTIFICATION_EVENT, 238 USAGE_ASSISTANCE_ACCESSIBILITY, 239 USAGE_ASSISTANCE_NAVIGATION_GUIDANCE, 240 USAGE_ASSISTANCE_SONIFICATION, 241 USAGE_GAME, 242 USAGE_ASSISTANT}; 243 244 public static final int[] contentTypes = { 245 CONTENT_TYPE_SPEECH, 246 CONTENT_TYPE_MUSIC, 247 CONTENT_TYPE_MOVIE, 248 CONTENT_TYPE_SONIFICATION}; 249 250 public static final int[] channelMasks = { 251 CHANNEL_MONO, 252 CHANNEL_STEREO, 253 CHANNEL_2POINT1, 254 CHANNEL_TRI, 255 CHANNEL_TRI_BACK, 256 CHANNEL_3POINT1, 257 CHANNEL_2POINT0POINT2, 258 CHANNEL_2POINT1POINT2, 259 CHANNEL_3POINT0POINT2, 260 CHANNEL_3POINT1POINT2, 261 CHANNEL_QUAD, 262 CHANNEL_QUAD_SIDE, 263 CHANNEL_SURROUND, 264 CHANNEL_PENTA, 265 CHANNEL_5POINT1, 266 CHANNEL_5POINT1_SIDE, 267 CHANNEL_6POINT1, 268 CHANNEL_7POINT1, 269 CHANNEL_5POINT1POINT2, 270 CHANNEL_5POINT1POINT4, 271 CHANNEL_7POINT1POINT2, 272 CHANNEL_7POINT1POINT4, 273 CHANNEL_9POINT1POINT4, 274 CHANNEL_9POINT1POINT6, 275 CHANNEL_FRONT_BACK 276 }; 277 278 private static HashMap<String,Integer> mUsageStringToIntegerMap; 279 private static HashMap<String,Integer> mContentTypeStringToIntegerMap; 280 private static HashMap<String,Integer> mChannelMaskStringToIntegerMap; 281 private static List<String> mChannelMaskStrings = new ArrayList<>(); 282 283 private int mNativeApi; 284 private int mBufferCapacityInFrames; 285 private int mChannelCount; 286 private int mDeviceId; 287 private int mSessionId; 288 private int mDirection; // does not get reset 289 private int mFormat; 290 private int mSampleRate; 291 private int mSharingMode; 292 private int mPerformanceMode; 293 private boolean mFormatConversionAllowed; 294 private boolean mChannelConversionAllowed; 295 private int mRateConversionQuality; 296 private int mInputPreset; 297 private int mUsage; 298 private int mContentType; 299 private int mFramesPerBurst; 300 private boolean mMMap; 301 private int mChannelMask; 302 private int mHardwareChannelCount; 303 private int mHardwareSampleRate; 304 private int mHardwareFormat; 305 private int mSpatializationBehavior; 306 StreamConfiguration()307 public StreamConfiguration() { 308 reset(); 309 } 310 311 static { 312 // Build map for Usage string-to-int conversion. 313 mUsageStringToIntegerMap = new HashMap<String,Integer>(); convertUsageToText(UNSPECIFIED)314 mUsageStringToIntegerMap.put(convertUsageToText(UNSPECIFIED), UNSPECIFIED); 315 for (int usage : usages) { convertUsageToText(usage)316 mUsageStringToIntegerMap.put(convertUsageToText(usage), usage); 317 } 318 319 // Build map for Content Type string-to-int conversion. 320 mContentTypeStringToIntegerMap = new HashMap<String,Integer>(); convertContentTypeToText(UNSPECIFIED)321 mContentTypeStringToIntegerMap.put(convertContentTypeToText(UNSPECIFIED), UNSPECIFIED); 322 for (int contentType : contentTypes) { convertContentTypeToText(contentType)323 mContentTypeStringToIntegerMap.put(convertContentTypeToText(contentType), contentType); 324 } 325 326 // Build map for Channel Mask string-to-int conversion. 327 mChannelMaskStringToIntegerMap = new HashMap<String, Integer>(); 328 String channelMaskStr = convertChannelMaskToText(UNSPECIFIED); mChannelMaskStringToIntegerMap.put(channelMaskStr, UNSPECIFIED)329 mChannelMaskStringToIntegerMap.put(channelMaskStr, UNSPECIFIED); 330 mChannelMaskStrings.add(channelMaskStr); 331 for (int channelMask : channelMasks) { 332 channelMaskStr = convertChannelMaskToText(channelMask); mChannelMaskStringToIntegerMap.put(channelMaskStr, channelMask)333 mChannelMaskStringToIntegerMap.put(channelMaskStr, channelMask); 334 mChannelMaskStrings.add(channelMaskStr); 335 } 336 } 337 reset()338 public void reset() { 339 mNativeApi = NATIVE_API_UNSPECIFIED; 340 mBufferCapacityInFrames = UNSPECIFIED; 341 mChannelCount = UNSPECIFIED; 342 mChannelMask = UNSPECIFIED; 343 mDeviceId = UNSPECIFIED; 344 mSessionId = -1; 345 mFormat = AUDIO_FORMAT_PCM_FLOAT; 346 mSampleRate = UNSPECIFIED; 347 mSharingMode = SHARING_MODE_EXCLUSIVE; 348 mPerformanceMode = PERFORMANCE_MODE_LOW_LATENCY; 349 mInputPreset = INPUT_PRESET_VOICE_RECOGNITION; 350 mUsage = UNSPECIFIED; 351 mContentType = UNSPECIFIED; 352 mFormatConversionAllowed = false; 353 mChannelConversionAllowed = false; 354 mRateConversionQuality = RATE_CONVERSION_QUALITY_NONE; 355 mMMap = NativeEngine.isMMapSupported(); 356 mHardwareChannelCount = UNSPECIFIED; 357 mHardwareSampleRate = UNSPECIFIED; 358 mHardwareFormat = UNSPECIFIED; 359 mSpatializationBehavior = UNSPECIFIED; 360 } 361 getFramesPerBurst()362 public int getFramesPerBurst() { 363 return mFramesPerBurst; 364 } 365 setFramesPerBurst(int framesPerBurst)366 public void setFramesPerBurst(int framesPerBurst) { 367 this.mFramesPerBurst = framesPerBurst; 368 } 369 getBufferCapacityInFrames()370 public int getBufferCapacityInFrames() { 371 return mBufferCapacityInFrames; 372 } 373 setBufferCapacityInFrames(int bufferCapacityInFrames)374 public void setBufferCapacityInFrames(int bufferCapacityInFrames) { 375 this.mBufferCapacityInFrames = bufferCapacityInFrames; 376 } 377 getFormat()378 public int getFormat() { 379 return mFormat; 380 } 381 setFormat(int format)382 public void setFormat(int format) { 383 this.mFormat = format; 384 } 385 getDirection()386 public int getDirection() { 387 return mDirection; 388 } 389 setDirection(int direction)390 public void setDirection(int direction) { 391 this.mDirection = direction; 392 } 393 getPerformanceMode()394 public int getPerformanceMode() { 395 return mPerformanceMode; 396 } 397 setPerformanceMode(int performanceMode)398 public void setPerformanceMode(int performanceMode) { 399 this.mPerformanceMode = performanceMode; 400 } 401 convertPerformanceModeToText(int performanceMode)402 static String convertPerformanceModeToText(int performanceMode) { 403 switch(performanceMode) { 404 case PERFORMANCE_MODE_NONE: 405 return "NO"; 406 case PERFORMANCE_MODE_POWER_SAVING: 407 return "PS"; 408 case PERFORMANCE_MODE_LOW_LATENCY: 409 return "LL"; 410 case PERFORMANCE_MODE_POWER_SAVING_OFFLOAD: 411 return "PSO"; 412 default: 413 return "??"; 414 } 415 } 416 getInputPreset()417 public int getInputPreset() { return mInputPreset; } setInputPreset(int inputPreset)418 public void setInputPreset(int inputPreset) { 419 this.mInputPreset = inputPreset; 420 } 421 getSpatializationBehavior()422 public int getSpatializationBehavior() { return mSpatializationBehavior; } setSpatializationBehavior(int spatializationBehavior)423 public void setSpatializationBehavior(int spatializationBehavior) { 424 this.mSpatializationBehavior = spatializationBehavior; 425 } 426 getUsage()427 public int getUsage() { return mUsage; } setUsage(int usage)428 public void setUsage(int usage) { 429 this.mUsage = usage; 430 } 431 getContentType()432 public int getContentType() { return mContentType; } setContentType(int contentType)433 public void setContentType(int contentType) { 434 this.mContentType = contentType; 435 } 436 convertUsageToText(int usage)437 static String convertUsageToText(int usage) { 438 switch(usage) { 439 case UNSPECIFIED: 440 return "Unspecified"; 441 case USAGE_MEDIA: 442 return "Media"; 443 case USAGE_VOICE_COMMUNICATION: 444 return "VoiceComm"; 445 case USAGE_VOICE_COMMUNICATION_SIGNALLING: 446 return "VoiceCommSig"; 447 case USAGE_ALARM: 448 return "Alarm"; 449 case USAGE_NOTIFICATION: 450 return "Notification"; 451 case USAGE_NOTIFICATION_RINGTONE: 452 return "Ringtone"; 453 case USAGE_NOTIFICATION_EVENT: 454 return "Event"; 455 case USAGE_ASSISTANCE_ACCESSIBILITY: 456 return "Accessability"; 457 case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: 458 return "Navigation"; 459 case USAGE_ASSISTANCE_SONIFICATION: 460 return "Sonification"; 461 case USAGE_GAME: 462 return "Game"; 463 case USAGE_ASSISTANT: 464 return "Assistant"; 465 default: 466 return "?=" + usage; 467 } 468 } 469 convertTextToUsage(String text)470 public static int convertTextToUsage(String text) { 471 return mUsageStringToIntegerMap.get(text); 472 } 473 convertContentTypeToText(int contentType)474 static String convertContentTypeToText(int contentType) { 475 switch(contentType) { 476 case UNSPECIFIED: 477 return "Unspecified"; 478 case CONTENT_TYPE_SPEECH: 479 return "Speech"; 480 case CONTENT_TYPE_MUSIC: 481 return "Music"; 482 case CONTENT_TYPE_MOVIE: 483 return "Movie"; 484 case CONTENT_TYPE_SONIFICATION: 485 return "Sonification"; 486 default: 487 return "?=" + contentType; 488 } 489 } 490 convertTextToContentType(String text)491 public static int convertTextToContentType(String text) { 492 return mContentTypeStringToIntegerMap.get(text); 493 } 494 getSharingMode()495 public int getSharingMode() { 496 return mSharingMode; 497 } 498 setSharingMode(int sharingMode)499 public void setSharingMode(int sharingMode) { 500 this.mSharingMode = sharingMode; 501 } 502 convertSharingModeToText(int sharingMode)503 static String convertSharingModeToText(int sharingMode) { 504 switch(sharingMode) { 505 case SHARING_MODE_SHARED: 506 return "SH"; 507 case SHARING_MODE_EXCLUSIVE: 508 return "EX"; 509 default: 510 return "??"; 511 } 512 } 513 convertFormatToText(int format)514 public static String convertFormatToText(int format) { 515 switch(format) { 516 case UNSPECIFIED: 517 return "Unspecified"; 518 case AUDIO_FORMAT_PCM_16: 519 return "I16"; 520 case AUDIO_FORMAT_PCM_24: 521 return "I24"; 522 case AUDIO_FORMAT_PCM_32: 523 return "I32"; 524 case AUDIO_FORMAT_PCM_FLOAT: 525 return "Float"; 526 case AUDIO_FORMAT_IEC61937: 527 return "IEC61937"; 528 default: 529 return "Invalid"; 530 } 531 } 532 convertNativeApiToText(int api)533 public static String convertNativeApiToText(int api) { 534 switch(api) { 535 case NATIVE_API_UNSPECIFIED: 536 return "Unspec"; 537 case NATIVE_API_AAUDIO: 538 return "AAudio"; 539 case NATIVE_API_OPENSLES: 540 return "OpenSL"; 541 default: 542 return "Invalid"; 543 } 544 } 545 convertChannelMaskToText(int channelMask)546 public static String convertChannelMaskToText(int channelMask) { 547 switch (channelMask) { 548 case UNSPECIFIED: 549 return "Unspecified"; 550 case CHANNEL_MONO: 551 return "Mono"; 552 case CHANNEL_STEREO: 553 return "Stereo"; 554 case CHANNEL_2POINT1: 555 return "2.1"; 556 case CHANNEL_TRI: 557 return "Tri"; 558 case CHANNEL_TRI_BACK: 559 return "TriBack"; 560 case CHANNEL_3POINT1: 561 return "3.1"; 562 case CHANNEL_2POINT0POINT2: 563 return "2.0.2"; 564 case CHANNEL_2POINT1POINT2: 565 return "2.1.2"; 566 case CHANNEL_3POINT0POINT2: 567 return "3.0.2"; 568 case CHANNEL_3POINT1POINT2: 569 return "3.1.2"; 570 case CHANNEL_QUAD: 571 return "Quad"; 572 case CHANNEL_QUAD_SIDE: 573 return "QuadSide"; 574 case CHANNEL_SURROUND: 575 return "Surround"; 576 case CHANNEL_PENTA: 577 return "Penta"; 578 case CHANNEL_5POINT1: 579 return "5.1"; 580 case CHANNEL_5POINT1_SIDE: 581 return "5.1Side"; 582 case CHANNEL_6POINT1: 583 return "6.1"; 584 case CHANNEL_7POINT1: 585 return "7.1"; 586 case CHANNEL_5POINT1POINT2: 587 return "5.1.2"; 588 case CHANNEL_5POINT1POINT4: 589 return "5.1.4"; 590 case CHANNEL_7POINT1POINT2: 591 return "7.1.2"; 592 case CHANNEL_7POINT1POINT4: 593 return "7.1.4"; 594 case CHANNEL_9POINT1POINT4: 595 return "9.1.4"; 596 case CHANNEL_9POINT1POINT6: 597 return "9.1.6"; 598 case CHANNEL_FRONT_BACK: 599 return "FrontBack"; 600 default: 601 return "?=" + Integer.toHexString(channelMask); 602 } 603 } 604 convertRateConversionQualityToText(int quality)605 static String convertRateConversionQualityToText(int quality) { 606 switch(quality) { 607 case RATE_CONVERSION_QUALITY_NONE: 608 return "None"; 609 case RATE_CONVERSION_QUALITY_FASTEST: 610 return "Fastest"; 611 case RATE_CONVERSION_QUALITY_LOW: 612 return "Low"; 613 case RATE_CONVERSION_QUALITY_MEDIUM: 614 return "Medium"; 615 case RATE_CONVERSION_QUALITY_HIGH: 616 return "High"; 617 case RATE_CONVERSION_QUALITY_BEST: 618 return "Best"; 619 default: 620 return "?=" + quality; 621 } 622 } 623 convertTextToChannelMask(String text)624 public static int convertTextToChannelMask(String text) { 625 return mChannelMaskStringToIntegerMap.get(text); 626 } 627 628 dump()629 public String dump() { 630 String prefix = (getDirection() == DIRECTION_INPUT) ? "in" : "out"; 631 StringBuffer message = new StringBuffer(); 632 message.append(String.format(Locale.getDefault(), "%s.channels = %d\n", prefix, mChannelCount)); 633 message.append(String.format(Locale.getDefault(), "%s.perf = %s\n", prefix, 634 convertPerformanceModeToText(mPerformanceMode).toLowerCase(Locale.getDefault()))); 635 if (getDirection() == DIRECTION_INPUT) { 636 message.append(String.format(Locale.getDefault(), "%s.preset = %s\n", prefix, 637 convertInputPresetToText(mInputPreset).toLowerCase(Locale.getDefault()))); 638 } else { 639 message.append(String.format(Locale.getDefault(), "%s.usage = %s\n", prefix, 640 convertUsageToText(mUsage).toLowerCase(Locale.getDefault()))); 641 message.append(String.format(Locale.getDefault(), "%s.contentType = %s\n", prefix, 642 convertContentTypeToText(mContentType).toLowerCase(Locale.getDefault()))); 643 } 644 message.append(String.format(Locale.getDefault(), "%s.sharing = %s\n", prefix, 645 convertSharingModeToText(mSharingMode).toLowerCase(Locale.getDefault()))); 646 message.append(String.format(Locale.getDefault(), "%s.api = %s\n", prefix, 647 convertNativeApiToText(getNativeApi()).toLowerCase(Locale.getDefault()))); 648 message.append(String.format(Locale.getDefault(), "%s.rate = %d\n", prefix, mSampleRate)); 649 message.append(String.format(Locale.getDefault(), "%s.device = %d\n", prefix, mDeviceId)); 650 message.append(String.format(Locale.getDefault(), "%s.mmap = %s\n", prefix, isMMap() ? "yes" : "no")); 651 message.append(String.format(Locale.getDefault(), "%s.rate.conversion.quality = %d\n", prefix, mRateConversionQuality)); 652 message.append(String.format(Locale.getDefault(), "%s.hardware.channels = %d\n", prefix, mHardwareChannelCount)); 653 message.append(String.format(Locale.getDefault(), "%s.hardware.sampleRate = %d\n", prefix, mHardwareSampleRate)); 654 message.append(String.format(Locale.getDefault(), "%s.hardware.format = %s\n", prefix, 655 convertFormatToText(mHardwareFormat).toLowerCase(Locale.getDefault()))); 656 message.append(String.format(Locale.getDefault(), "%s.spatializationBehavior = %s\n", prefix, 657 convertSpatializationBehaviorToText(mSpatializationBehavior).toLowerCase(Locale.getDefault()))); 658 return message.toString(); 659 } 660 661 // text must match menu values 662 public static final String NAME_INPUT_PRESET_GENERIC = "Generic"; 663 public static final String NAME_INPUT_PRESET_CAMCORDER = "Camcorder"; 664 public static final String NAME_INPUT_PRESET_VOICE_RECOGNITION = "VoiceRec"; 665 public static final String NAME_INPUT_PRESET_VOICE_COMMUNICATION = "VoiceComm"; 666 public static final String NAME_INPUT_PRESET_UNPROCESSED = "Unprocessed"; 667 public static final String NAME_INPUT_PRESET_VOICE_PERFORMANCE = "Performance"; 668 convertInputPresetToText(int inputPreset)669 public static String convertInputPresetToText(int inputPreset) { 670 switch(inputPreset) { 671 case INPUT_PRESET_GENERIC: 672 return NAME_INPUT_PRESET_GENERIC; 673 case INPUT_PRESET_CAMCORDER: 674 return NAME_INPUT_PRESET_CAMCORDER; 675 case INPUT_PRESET_VOICE_RECOGNITION: 676 return NAME_INPUT_PRESET_VOICE_RECOGNITION; 677 case INPUT_PRESET_VOICE_COMMUNICATION: 678 return NAME_INPUT_PRESET_VOICE_COMMUNICATION; 679 case INPUT_PRESET_UNPROCESSED: 680 return NAME_INPUT_PRESET_UNPROCESSED; 681 case INPUT_PRESET_VOICE_PERFORMANCE: 682 return NAME_INPUT_PRESET_VOICE_PERFORMANCE; 683 default: 684 return "Invalid"; 685 } 686 } 687 matchInputPreset(String text, int preset)688 private static boolean matchInputPreset(String text, int preset) { 689 return convertInputPresetToText(preset).toLowerCase(Locale.getDefault()).equals(text); 690 } 691 692 /** 693 * Case insensitive. 694 * @param text 695 * @return inputPreset, eg. INPUT_PRESET_CAMCORDER 696 */ convertTextToInputPreset(String text)697 public static int convertTextToInputPreset(String text) { 698 text = text.toLowerCase(Locale.getDefault()); 699 if (matchInputPreset(text, INPUT_PRESET_GENERIC)) { 700 return INPUT_PRESET_GENERIC; 701 } else if (matchInputPreset(text, INPUT_PRESET_CAMCORDER)) { 702 return INPUT_PRESET_CAMCORDER; 703 } else if (matchInputPreset(text, INPUT_PRESET_VOICE_RECOGNITION)) { 704 return INPUT_PRESET_VOICE_RECOGNITION; 705 } else if (matchInputPreset(text, INPUT_PRESET_VOICE_COMMUNICATION)) { 706 return INPUT_PRESET_VOICE_COMMUNICATION; 707 } else if (matchInputPreset(text, INPUT_PRESET_UNPROCESSED)) { 708 return INPUT_PRESET_UNPROCESSED; 709 } else if (matchInputPreset(text, INPUT_PRESET_VOICE_PERFORMANCE)) { 710 return INPUT_PRESET_VOICE_PERFORMANCE; 711 } 712 return -1; 713 } 714 715 // text must match menu values 716 public static final String NAME_SPATIALIZATION_BEHAVIOR_UNSPECIFIED = "Unspecified"; 717 public static final String NAME_SPATIALIZATION_BEHAVIOR_AUTO = "Auto"; 718 public static final String NAME_SPATIALIZATION_BEHAVIOR_NEVER = "Never"; 719 convertSpatializationBehaviorToText(int spatializationBehavior)720 public static String convertSpatializationBehaviorToText(int spatializationBehavior) { 721 switch(spatializationBehavior) { 722 case UNSPECIFIED: 723 return NAME_SPATIALIZATION_BEHAVIOR_UNSPECIFIED; 724 case SPATIALIZATION_BEHAVIOR_AUTO: 725 return NAME_SPATIALIZATION_BEHAVIOR_AUTO; 726 case SPATIALIZATION_BEHAVIOR_NEVER: 727 return NAME_SPATIALIZATION_BEHAVIOR_NEVER; 728 default: 729 return "Invalid"; 730 } 731 } 732 matchSpatializationBehavior(String text, int spatializationBehavior)733 private static boolean matchSpatializationBehavior(String text, int spatializationBehavior) { 734 return convertSpatializationBehaviorToText(spatializationBehavior).toLowerCase(Locale.getDefault()).equals(text); 735 } 736 737 /** 738 * Case insensitive. 739 * @param text 740 * @return spatializationBehavior, eg. SPATIALIZATION_BEHAVIOR_NEVER 741 */ convertTextToSpatializationBehavior(String text)742 public static int convertTextToSpatializationBehavior(String text) { 743 text = text.toLowerCase(Locale.getDefault()); 744 if (matchSpatializationBehavior(text, UNSPECIFIED)) { 745 return UNSPECIFIED; 746 } else if (matchSpatializationBehavior(text, SPATIALIZATION_BEHAVIOR_AUTO)) { 747 return SPATIALIZATION_BEHAVIOR_AUTO; 748 } else if (matchSpatializationBehavior(text, SPATIALIZATION_BEHAVIOR_NEVER)) { 749 return SPATIALIZATION_BEHAVIOR_NEVER; 750 } 751 return -1; 752 } 753 getChannelCount()754 public int getChannelCount() { 755 return mChannelCount; 756 } 757 setChannelCount(int channelCount)758 public void setChannelCount(int channelCount) { 759 this.mChannelCount = channelCount; 760 } 761 getSampleRate()762 public int getSampleRate() { 763 return mSampleRate; 764 } 765 setSampleRate(int sampleRate)766 public void setSampleRate(int sampleRate) { 767 this.mSampleRate = sampleRate; 768 } 769 getDeviceId()770 public int getDeviceId() { 771 return mDeviceId; 772 } 773 setDeviceId(int deviceId)774 public void setDeviceId(int deviceId) { 775 this.mDeviceId = deviceId; 776 } 777 getSessionId()778 public int getSessionId() { 779 return mSessionId; 780 } 781 setSessionId(int sessionId)782 public void setSessionId(int sessionId) { 783 mSessionId = sessionId; 784 } 785 isMMap()786 public boolean isMMap() { 787 return mMMap; 788 } 789 setMMap(boolean b)790 public void setMMap(boolean b) { mMMap = b; } 791 getNativeApi()792 public int getNativeApi() { 793 return mNativeApi; 794 } 795 setNativeApi(int nativeApi)796 public void setNativeApi(int nativeApi) { 797 mNativeApi = nativeApi; 798 } 799 setChannelConversionAllowed(boolean b)800 public void setChannelConversionAllowed(boolean b) { mChannelConversionAllowed = b; } 801 getChannelConversionAllowed()802 public boolean getChannelConversionAllowed() { 803 return mChannelConversionAllowed; 804 } 805 setFormatConversionAllowed(boolean b)806 public void setFormatConversionAllowed(boolean b) { 807 mFormatConversionAllowed = b; 808 } 809 getFormatConversionAllowed()810 public boolean getFormatConversionAllowed() { 811 return mFormatConversionAllowed; 812 } 813 setRateConversionQuality(int quality)814 public void setRateConversionQuality(int quality) { mRateConversionQuality = quality; } 815 getRateConversionQuality()816 public int getRateConversionQuality() { 817 return mRateConversionQuality; 818 } 819 getChannelMask()820 public int getChannelMask() { 821 return mChannelMask; 822 } 823 setChannelMask(int channelMask)824 public void setChannelMask(int channelMask) { 825 this.mChannelMask = channelMask; 826 } 827 getAllChannelMasks()828 public static List<String> getAllChannelMasks() { 829 return mChannelMaskStrings; 830 } 831 getHardwareChannelCount()832 public int getHardwareChannelCount() { 833 return mHardwareChannelCount; 834 } 835 setHardwareChannelCount(int hardwareChannelCount)836 public void setHardwareChannelCount(int hardwareChannelCount) { 837 this.mHardwareChannelCount = hardwareChannelCount; 838 } 839 getHardwareSampleRate()840 public int getHardwareSampleRate() { 841 return mHardwareSampleRate; 842 } 843 setHardwareSampleRate(int hardwareSampleRate)844 public void setHardwareSampleRate(int hardwareSampleRate) { 845 this.mHardwareSampleRate = hardwareSampleRate; 846 } 847 getHardwareFormat()848 public int getHardwareFormat() { 849 return mHardwareFormat; 850 } 851 setHardwareFormat(int hardwareFormat)852 public void setHardwareFormat(int hardwareFormat) { 853 this.mHardwareFormat = hardwareFormat; 854 } 855 convertErrorToText(int error)856 static String convertErrorToText(int error) { 857 switch (error) { 858 case ERROR_BASE: 859 return "ErrorBase"; 860 case ERROR_DISCONNECTED: 861 return "ErrorDisconnected"; 862 case ERROR_ILLEGAL_ARGUMENT: 863 return "ErrorIllegalArgument"; 864 case ERROR_INTERNAL: 865 return "ErrorInternal"; 866 case ERROR_INVALID_STATE: 867 return "ErrorInvalidState"; 868 case ERROR_INVALID_HANDLE: 869 return "ErrorInvalidHandle"; 870 case ERROR_UNIMPLEMENTED: 871 return "ErrorUnimplemented"; 872 case ERROR_UNAVAILABLE: 873 return "ErrorUnavailable"; 874 case ERROR_NO_FREE_HANDLES: 875 return "ErrorNoFreeHandles"; 876 case ERROR_NO_MEMORY: 877 return "ErrorNoMemory"; 878 case ERROR_NULL: 879 return "ErrorNull"; 880 case ERROR_TIMEOUT: 881 return "ErrorTimeout"; 882 case ERROR_WOULD_BLOCK: 883 return "ErrorWouldBlock"; 884 case ERROR_INVALID_FORMAT: 885 return "ErrorInvalidFormat"; 886 case ERROR_OUT_OF_RANGE: 887 return "ErrorOutOfRange"; 888 case ERROR_NO_SERVICE: 889 return "ErrorNoService"; 890 case ERROR_INVALID_RATE: 891 return "ErrorInvalidRate"; 892 case ERROR_CLOSED: 893 return "ErrorClosed"; 894 case ERROR_OK: 895 return "ErrorOk"; 896 default: 897 return "?=" + error; 898 } 899 } 900 } 901