xref: /aosp_15_r20/external/oboe/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/StreamConfiguration.java (revision 05767d913155b055644481607e6fa1e35e2fe72c)
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