• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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