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