• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.mobileer.oboetester;
18 
19 import android.content.Intent;
20 import android.media.AudioManager;
21 import android.os.Bundle;
22 
23 public class IntentBasedTestSupport {
24 
25     public static final String KEY_IN_SHARING = "in_sharing";
26     public static final String KEY_OUT_SHARING = "out_sharing";
27     public static final String VALUE_SHARING_EXCLUSIVE = "exclusive";
28     public static final String VALUE_SHARING_SHARED = "shared";
29 
30     public static final String KEY_IN_PERF = "in_perf";
31     public static final String KEY_OUT_PERF = "out_perf";
32     public static final String VALUE_PERF_LOW_LATENCY = "lowlat";
33     public static final String VALUE_PERF_POWERSAVE = "powersave";
34     public static final String VALUE_PERF_NONE = "none";
35 
36     public static final String KEY_IN_CHANNELS = "in_channels";
37     public static final String KEY_OUT_CHANNELS = "out_channels";
38     public static final int VALUE_DEFAULT_CHANNELS = 2;
39 
40     public static final String KEY_IN_USE_MMAP = "in_use_mmap";
41     public static final String KEY_OUT_USE_MMAP = "out_use_mmap";
42     public static final boolean VALUE_DEFAULT_USE_MMAP = true;
43 
44     public static final String KEY_IN_PRESET = "in_preset";
45     public static final String KEY_SAMPLE_RATE = "sample_rate";
46     public static final int VALUE_DEFAULT_SAMPLE_RATE = 48000;
47     public static final String VALUE_UNSPECIFIED = "unspecified";
48 
49     public static final String KEY_IN_API = "in_api";
50     public static final String KEY_OUT_API = "out_api";
51     public static final String VALUE_API_AAUDIO = "aaudio";
52     public static final String VALUE_API_OPENSLES = "opensles";
53 
54     public static final String KEY_FILE_NAME = "file";
55     public static final String KEY_BUFFER_BURSTS = "buffer_bursts";
56     public static final String KEY_BACKGROUND = "background";
57     public static final String KEY_VOLUME = "volume";
58 
59     public static final String KEY_VOLUME_TYPE = "volume_type";
60     public static final float VALUE_VOLUME_INVALID = -1.0f;
61     public static final String VALUE_VOLUME_TYPE_ACCESSIBILITY = "accessibility";
62     public static final String VALUE_VOLUME_TYPE_ALARM = "alarm";
63     public static final String VALUE_VOLUME_TYPE_DTMF = "dtmf";
64     public static final String VALUE_VOLUME_TYPE_MUSIC = "music";
65     public static final String VALUE_VOLUME_TYPE_NOTIFICATION = "notification";
66     public static final String VALUE_VOLUME_TYPE_RING = "ring";
67     public static final String VALUE_VOLUME_TYPE_SYSTEM = "system";
68     public static final String VALUE_VOLUME_TYPE_VOICE_CALL = "voice_call";
69 
70     public static final String KEY_IN_CHANNEL_MASK = "in_channel_mask";
71     public static final String KEY_OUT_CHANNEL_MASK = "out_channel_mask";
72     public static final String VALUE_CHANNEL_MONO = "mono";
73     public static final String VALUE_CHANNEL_STEREO = "stereo";
74     public static final String VALUE_CHANNEL_2POINT1 = "2.1";
75     public static final String VALUE_CHANNEL_TRI = "tri";
76     public static final String VALUE_CHANNEL_TRI_BACK = "triBack";
77     public static final String VALUE_CHANNEL_TRI_BACK_LOWERCASE = "triback";
78     public static final String VALUE_CHANNEL_3POINT1 = "3.1";
79     public static final String VALUE_CHANNEL_2POINT0POINT2 = "2.0.2";
80     public static final String VALUE_CHANNEL_2POINT1POINT2 = "2.1.2";
81     public static final String VALUE_CHANNEL_3POINT0POINT2 = "3.0.2";
82     public static final String VALUE_CHANNEL_3POINT1POINT2 = "3.1.2";
83     public static final String VALUE_CHANNEL_QUAD = "quad";
84     public static final String VALUE_CHANNEL_QUAD_SIDE = "quadSide";
85     public static final String VALUE_CHANNEL_QUAD_SIDE_LOWERCASE = "quadside";
86     public static final String VALUE_CHANNEL_SURROUND = "surround";
87     public static final String VALUE_CHANNEL_PENTA = "penta";
88     public static final String VALUE_CHANNEL_5POINT1 = "5.1";
89     public static final String VALUE_CHANNEL_5POINT1_SIDE = "5.1Side";
90     public static final String VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE = "5.1side";
91     public static final String VALUE_CHANNEL_6POINT1 = "6.1";
92     public static final String VALUE_CHANNEL_7POINT1 = "7.1";
93     public static final String VALUE_CHANNEL_5POINT1POINT2 = "5.1.2";
94     public static final String VALUE_CHANNEL_5POINT1POINT4 = "5.1.4";
95     public static final String VALUE_CHANNEL_7POINT1POINT2 = "7.1.2";
96     public static final String VALUE_CHANNEL_7POINT1POINT4 = "7.1.4";
97     public static final String VALUE_CHANNEL_9POINT1POINT4 = "9.1.4";
98     public static final String VALUE_CHANNEL_9POINT1POINT6 = "9.1.6";
99     public static final String VALUE_CHANNEL_FRONT_BACK = "frontBack";
100     public static final String VALUE_CHANNEL_FRONT_BACK_LOWERCASE = "frontback";
101 
102     public static final String KEY_SIGNAL_TYPE = "signal_type";
103     public static final String VALUE_SIGNAL_SINE = "sine";
104     public static final String VALUE_SIGNAL_SAWTOOTH = "sawtooth";
105     public static final String VALUE_SIGNAL_FREQ_SWEEP = "freq_sweep";
106     public static final String VALUE_SIGNAL_PITCH_SWEEP = "pitch_sweep";
107     public static final String VALUE_SIGNAL_WHITE_NOISE = "white_noise";
108 
109     public static final String KEY_DURATION = "duration";
110     public static final int VALUE_DEFAULT_DURATION = 10;
111 
getApiFromText(String text)112     public static int getApiFromText(String text) {
113         if (VALUE_API_AAUDIO.equals(text)) {
114             return StreamConfiguration.NATIVE_API_AAUDIO;
115         } else if (VALUE_API_OPENSLES.equals(text)) {
116             return StreamConfiguration.NATIVE_API_OPENSLES;
117         } else {
118             return StreamConfiguration.NATIVE_API_UNSPECIFIED;
119         }
120     }
121 
getPerfFromText(String text)122     public static int getPerfFromText(String text) {
123         if (VALUE_PERF_NONE.equals(text)) {
124             return StreamConfiguration.PERFORMANCE_MODE_NONE;
125         } else if (VALUE_PERF_POWERSAVE.equals(text)) {
126             return StreamConfiguration.PERFORMANCE_MODE_POWER_SAVING;
127         } else if (VALUE_PERF_LOW_LATENCY.equals(text)) {
128             return StreamConfiguration.PERFORMANCE_MODE_LOW_LATENCY;
129         } else {
130             throw new IllegalArgumentException("perf mode invalid: " + text);
131         }
132     }
133 
getSharingFromText(String text)134     public static int getSharingFromText(String text) {
135         if (VALUE_SHARING_SHARED.equals(text)) {
136             return StreamConfiguration.SHARING_MODE_SHARED;
137         } else {
138             return StreamConfiguration.SHARING_MODE_EXCLUSIVE;
139         }
140     }
141 
configureStreamsFromBundle(Bundle bundle, StreamConfiguration requestedInConfig, StreamConfiguration requestedOutConfig)142     public static void configureStreamsFromBundle(Bundle bundle,
143                                                   StreamConfiguration requestedInConfig,
144                                                   StreamConfiguration requestedOutConfig) {
145         configureInputStreamFromBundle(bundle, requestedInConfig);
146         configureOutputStreamFromBundle(bundle, requestedOutConfig);
147     }
148 
getNormalizedVolumeFromBundle(Bundle bundle)149     public static float getNormalizedVolumeFromBundle(Bundle bundle) {
150         return bundle.getFloat(KEY_VOLUME, VALUE_VOLUME_INVALID);
151     }
152 
153     /**
154      * @param bundle
155      * @return AudioManager.STREAM type or throw IllegalArgumentException
156      */
getVolumeStreamTypeFromBundle(Bundle bundle)157     public static int getVolumeStreamTypeFromBundle(Bundle bundle) {
158         String typeText = bundle.getString(KEY_VOLUME_TYPE, VALUE_VOLUME_TYPE_MUSIC);
159         switch (typeText) {
160             case VALUE_VOLUME_TYPE_ACCESSIBILITY:
161                 return AudioManager.STREAM_ACCESSIBILITY;
162             case VALUE_VOLUME_TYPE_ALARM:
163                 return AudioManager.STREAM_ALARM;
164             case VALUE_VOLUME_TYPE_DTMF:
165                 return AudioManager.STREAM_DTMF;
166             case VALUE_VOLUME_TYPE_MUSIC:
167                 return AudioManager.STREAM_MUSIC;
168             case VALUE_VOLUME_TYPE_NOTIFICATION:
169                 return AudioManager.STREAM_NOTIFICATION;
170             case VALUE_VOLUME_TYPE_RING:
171                 return AudioManager.STREAM_RING;
172             case VALUE_VOLUME_TYPE_SYSTEM:
173                 return AudioManager.STREAM_SYSTEM;
174             case VALUE_VOLUME_TYPE_VOICE_CALL:
175                 return AudioManager.STREAM_VOICE_CALL;
176             default:
177                throw new IllegalArgumentException(KEY_VOLUME_TYPE + " invalid: " + typeText);
178         }
179     }
180 
getChannelMaskFromBundle(Bundle bundle, String channelMaskKey)181     public static int getChannelMaskFromBundle(Bundle bundle, String channelMaskKey) {
182         String channelMaskText = bundle.getString(channelMaskKey);
183         if (channelMaskText == null) {
184             return StreamConfiguration.UNSPECIFIED;
185         }
186         switch (channelMaskText) {
187             case VALUE_CHANNEL_MONO:
188                 return StreamConfiguration.CHANNEL_MONO;
189             case VALUE_CHANNEL_STEREO:
190                 return StreamConfiguration.CHANNEL_STEREO;
191             case VALUE_CHANNEL_2POINT1:
192                 return StreamConfiguration.CHANNEL_2POINT1;
193             case VALUE_CHANNEL_TRI:
194                 return StreamConfiguration.CHANNEL_TRI;
195             case VALUE_CHANNEL_TRI_BACK:
196             case VALUE_CHANNEL_TRI_BACK_LOWERCASE:
197                 return StreamConfiguration.CHANNEL_TRI_BACK;
198             case VALUE_CHANNEL_3POINT1:
199                 return StreamConfiguration.CHANNEL_3POINT1;
200             case VALUE_CHANNEL_2POINT0POINT2:
201                 return StreamConfiguration.CHANNEL_2POINT0POINT2;
202             case VALUE_CHANNEL_2POINT1POINT2:
203                 return StreamConfiguration.CHANNEL_2POINT1POINT2;
204             case VALUE_CHANNEL_3POINT0POINT2:
205                 return StreamConfiguration.CHANNEL_3POINT0POINT2;
206             case VALUE_CHANNEL_3POINT1POINT2:
207                 return StreamConfiguration.CHANNEL_3POINT1POINT2;
208             case VALUE_CHANNEL_QUAD:
209                 return StreamConfiguration.CHANNEL_QUAD;
210             case VALUE_CHANNEL_QUAD_SIDE:
211             case VALUE_CHANNEL_QUAD_SIDE_LOWERCASE:
212                 return StreamConfiguration.CHANNEL_QUAD_SIDE;
213             case VALUE_CHANNEL_SURROUND:
214                 return StreamConfiguration.CHANNEL_SURROUND;
215             case VALUE_CHANNEL_PENTA:
216                 return StreamConfiguration.CHANNEL_PENTA;
217             case VALUE_CHANNEL_5POINT1:
218                 return StreamConfiguration.CHANNEL_5POINT1;
219             case VALUE_CHANNEL_5POINT1_SIDE:
220             case VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE:
221                 return StreamConfiguration.CHANNEL_5POINT1_SIDE;
222             case VALUE_CHANNEL_6POINT1:
223                 return StreamConfiguration.CHANNEL_6POINT1;
224             case VALUE_CHANNEL_7POINT1:
225                 return StreamConfiguration.CHANNEL_7POINT1;
226             case VALUE_CHANNEL_5POINT1POINT2:
227                 return StreamConfiguration.CHANNEL_5POINT1POINT2;
228             case VALUE_CHANNEL_5POINT1POINT4:
229                 return StreamConfiguration.CHANNEL_5POINT1POINT4;
230             case VALUE_CHANNEL_7POINT1POINT2:
231                 return StreamConfiguration.CHANNEL_7POINT1POINT2;
232             case VALUE_CHANNEL_7POINT1POINT4:
233                 return StreamConfiguration.CHANNEL_7POINT1POINT4;
234             case VALUE_CHANNEL_9POINT1POINT4:
235                 return StreamConfiguration.CHANNEL_9POINT1POINT4;
236             case VALUE_CHANNEL_9POINT1POINT6:
237                 return StreamConfiguration.CHANNEL_9POINT1POINT6;
238             case VALUE_CHANNEL_FRONT_BACK:
239             case VALUE_CHANNEL_FRONT_BACK_LOWERCASE:
240                 return StreamConfiguration.CHANNEL_FRONT_BACK;
241             default:
242                 throw new IllegalArgumentException(
243                         channelMaskKey + " invalid: " + channelMaskText);
244         }
245     }
246 
configureOutputStreamFromBundle(Bundle bundle, StreamConfiguration requestedOutConfig)247     public static void configureOutputStreamFromBundle(Bundle bundle,
248                                                         StreamConfiguration requestedOutConfig) {
249         int audioApi;
250         String text;
251 
252         requestedOutConfig.reset();
253 
254         int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE);
255         requestedOutConfig.setSampleRate(sampleRate);
256 
257         text = bundle.getString(KEY_OUT_API, VALUE_UNSPECIFIED);
258         audioApi = getApiFromText(text);
259         requestedOutConfig.setNativeApi(audioApi);
260 
261         int outChannels = bundle.getInt(KEY_OUT_CHANNELS, VALUE_DEFAULT_CHANNELS);
262         int channelMask = getChannelMaskFromBundle(bundle, KEY_OUT_CHANNEL_MASK);
263         // Respect channel mask when it is specified.
264         if (channelMask != StreamConfiguration.UNSPECIFIED) {
265             requestedOutConfig.setChannelMask(channelMask);
266         } else {
267             requestedOutConfig.setChannelCount(outChannels);
268         }
269 
270         boolean outMMAP = bundle.getBoolean(KEY_OUT_USE_MMAP, VALUE_DEFAULT_USE_MMAP);
271         requestedOutConfig.setMMap(outMMAP);
272 
273         text = bundle.getString(KEY_OUT_PERF, VALUE_PERF_LOW_LATENCY);
274         int perfMode = getPerfFromText(text);
275         requestedOutConfig.setPerformanceMode(perfMode);
276 
277         text = bundle.getString(KEY_OUT_SHARING, VALUE_SHARING_EXCLUSIVE);
278         int sharingMode = getSharingFromText(text);
279         requestedOutConfig.setSharingMode(sharingMode);
280 
281     }
282 
configureInputStreamFromBundle(Bundle bundle, StreamConfiguration requestedInConfig)283     public static void configureInputStreamFromBundle(Bundle bundle,
284                                                        StreamConfiguration requestedInConfig) {
285         int audioApi;
286         String text;
287 
288         requestedInConfig.reset();
289 
290         int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE);
291         requestedInConfig.setSampleRate(sampleRate);
292 
293         text = bundle.getString(KEY_IN_API, VALUE_UNSPECIFIED);
294         audioApi = getApiFromText(text);
295         requestedInConfig.setNativeApi(audioApi);
296 
297         int inChannels = bundle.getInt(KEY_IN_CHANNELS, VALUE_DEFAULT_CHANNELS);
298         int channelMask = getChannelMaskFromBundle(bundle, KEY_IN_CHANNEL_MASK);
299         // Respect channel mask when it is specified.
300         if (channelMask != StreamConfiguration.UNSPECIFIED) {
301             requestedInConfig.setChannelMask(channelMask);
302         } else {
303             requestedInConfig.setChannelCount(inChannels);
304         }
305 
306         boolean inMMAP = bundle.getBoolean(KEY_IN_USE_MMAP, VALUE_DEFAULT_USE_MMAP);
307         requestedInConfig.setMMap(inMMAP);
308 
309         text = bundle.getString(KEY_IN_PERF, VALUE_PERF_LOW_LATENCY);
310         int perfMode = getPerfFromText(text);
311         requestedInConfig.setPerformanceMode(perfMode);
312 
313         text = bundle.getString(KEY_IN_SHARING, VALUE_SHARING_EXCLUSIVE);
314         int sharingMode = getSharingFromText(text);
315         requestedInConfig.setSharingMode(sharingMode);
316 
317         String defaultText = StreamConfiguration.convertInputPresetToText(
318                 StreamConfiguration.INPUT_PRESET_VOICE_RECOGNITION);
319         text = bundle.getString(KEY_IN_PRESET, defaultText);
320         int inputPreset = StreamConfiguration.convertTextToInputPreset(text);
321         if (inputPreset < 0) throw new IllegalArgumentException(KEY_IN_PRESET + " invalid: " + text);
322         requestedInConfig.setInputPreset(inputPreset);
323     }
324 
getSignalTypeFromBundle(Bundle bundle)325     public static int getSignalTypeFromBundle(Bundle bundle) {
326         String signalTypeText = bundle.getString(KEY_SIGNAL_TYPE);
327         if (signalTypeText == null) {
328             return 0;
329         }
330         switch (signalTypeText) {
331             case VALUE_SIGNAL_SINE:
332                 return 0;
333             case VALUE_SIGNAL_SAWTOOTH:
334                 return 1;
335             case VALUE_SIGNAL_FREQ_SWEEP:
336                 return 2;
337             case VALUE_SIGNAL_PITCH_SWEEP:
338                 return 3;
339             case VALUE_SIGNAL_WHITE_NOISE:
340                 return 4;
341             default:
342                 throw new IllegalArgumentException(
343                         KEY_SIGNAL_TYPE + " invalid: " + signalTypeText);
344         }
345     }
346 
getDurationSeconds(Bundle bundle)347     public static int getDurationSeconds(Bundle bundle) {
348         return bundle.getInt(KEY_DURATION, VALUE_DEFAULT_DURATION);
349     }
350 }
351