xref: /aosp_15_r20/external/oboe/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/IntentBasedTestSupport.java (revision 05767d913155b055644481607e6fa1e35e2fe72c)
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 = NativeEngine.isMMapSupported();
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_OUT_USAGE = "out_usage";
50     public static final String VALUE_USAGE_MEDIA = "media";
51     public static final String VALUE_USAGE_VOICE_COMMUNICATION = "voice_communication";
52     public static final String VALUE_USAGE_ALARM = "alarm";
53     public static final String VALUE_USAGE_NOTIFICATION = "notification";
54     public static final String VALUE_USAGE_GAME = "game";
55 
56     public static final String KEY_IN_API = "in_api";
57     public static final String KEY_OUT_API = "out_api";
58     public static final String VALUE_API_AAUDIO = "aaudio";
59     public static final String VALUE_API_OPENSLES = "opensles";
60 
61     public static final String KEY_FILE_NAME = "file";
62     public static final String KEY_BUFFER_BURSTS = "buffer_bursts";
63     public static final String KEY_BACKGROUND = "background";
64     public static final String KEY_VOLUME = "volume";
65 
66     public static final String KEY_VOLUME_TYPE = "volume_type";
67     public static final float VALUE_VOLUME_INVALID = -1.0f;
68     public static final String VALUE_VOLUME_TYPE_ACCESSIBILITY = "accessibility";
69     public static final String VALUE_VOLUME_TYPE_ALARM = "alarm";
70     public static final String VALUE_VOLUME_TYPE_DTMF = "dtmf";
71     public static final String VALUE_VOLUME_TYPE_MUSIC = "music";
72     public static final String VALUE_VOLUME_TYPE_NOTIFICATION = "notification";
73     public static final String VALUE_VOLUME_TYPE_RING = "ring";
74     public static final String VALUE_VOLUME_TYPE_SYSTEM = "system";
75     public static final String VALUE_VOLUME_TYPE_VOICE_CALL = "voice_call";
76 
77     public static final String KEY_IN_CHANNEL_MASK = "in_channel_mask";
78     public static final String KEY_OUT_CHANNEL_MASK = "out_channel_mask";
79     public static final String VALUE_CHANNEL_MONO = "mono";
80     public static final String VALUE_CHANNEL_STEREO = "stereo";
81     public static final String VALUE_CHANNEL_2POINT1 = "2.1";
82     public static final String VALUE_CHANNEL_TRI = "tri";
83     public static final String VALUE_CHANNEL_TRI_BACK = "triBack";
84     public static final String VALUE_CHANNEL_TRI_BACK_LOWERCASE = "triback";
85     public static final String VALUE_CHANNEL_3POINT1 = "3.1";
86     public static final String VALUE_CHANNEL_2POINT0POINT2 = "2.0.2";
87     public static final String VALUE_CHANNEL_2POINT1POINT2 = "2.1.2";
88     public static final String VALUE_CHANNEL_3POINT0POINT2 = "3.0.2";
89     public static final String VALUE_CHANNEL_3POINT1POINT2 = "3.1.2";
90     public static final String VALUE_CHANNEL_QUAD = "quad";
91     public static final String VALUE_CHANNEL_QUAD_SIDE = "quadSide";
92     public static final String VALUE_CHANNEL_QUAD_SIDE_LOWERCASE = "quadside";
93     public static final String VALUE_CHANNEL_SURROUND = "surround";
94     public static final String VALUE_CHANNEL_PENTA = "penta";
95     public static final String VALUE_CHANNEL_5POINT1 = "5.1";
96     public static final String VALUE_CHANNEL_5POINT1_SIDE = "5.1Side";
97     public static final String VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE = "5.1side";
98     public static final String VALUE_CHANNEL_6POINT1 = "6.1";
99     public static final String VALUE_CHANNEL_7POINT1 = "7.1";
100     public static final String VALUE_CHANNEL_5POINT1POINT2 = "5.1.2";
101     public static final String VALUE_CHANNEL_5POINT1POINT4 = "5.1.4";
102     public static final String VALUE_CHANNEL_7POINT1POINT2 = "7.1.2";
103     public static final String VALUE_CHANNEL_7POINT1POINT4 = "7.1.4";
104     public static final String VALUE_CHANNEL_9POINT1POINT4 = "9.1.4";
105     public static final String VALUE_CHANNEL_9POINT1POINT6 = "9.1.6";
106     public static final String VALUE_CHANNEL_FRONT_BACK = "frontBack";
107     public static final String VALUE_CHANNEL_FRONT_BACK_LOWERCASE = "frontback";
108 
109     public static final String KEY_SIGNAL_TYPE = "signal_type";
110     public static final String VALUE_SIGNAL_SINE = "sine";
111     public static final String VALUE_SIGNAL_SAWTOOTH = "sawtooth";
112     public static final String VALUE_SIGNAL_FREQ_SWEEP = "freq_sweep";
113     public static final String VALUE_SIGNAL_PITCH_SWEEP = "pitch_sweep";
114     public static final String VALUE_SIGNAL_WHITE_NOISE = "white_noise";
115 
116     public static final String KEY_DURATION = "duration";
117     public static final int VALUE_DEFAULT_DURATION = 10;
118 
getApiFromText(String text)119     public static int getApiFromText(String text) {
120         if (VALUE_API_AAUDIO.equals(text)) {
121             return StreamConfiguration.NATIVE_API_AAUDIO;
122         } else if (VALUE_API_OPENSLES.equals(text)) {
123             return StreamConfiguration.NATIVE_API_OPENSLES;
124         } else {
125             return StreamConfiguration.NATIVE_API_UNSPECIFIED;
126         }
127     }
128 
getPerfFromText(String text)129     public static int getPerfFromText(String text) {
130         if (VALUE_PERF_NONE.equals(text)) {
131             return StreamConfiguration.PERFORMANCE_MODE_NONE;
132         } else if (VALUE_PERF_POWERSAVE.equals(text)) {
133             return StreamConfiguration.PERFORMANCE_MODE_POWER_SAVING;
134         } else if (VALUE_PERF_LOW_LATENCY.equals(text)) {
135             return StreamConfiguration.PERFORMANCE_MODE_LOW_LATENCY;
136         } else {
137             throw new IllegalArgumentException("perf mode invalid: " + text);
138         }
139     }
140 
getSharingFromText(String text)141     public static int getSharingFromText(String text) {
142         if (VALUE_SHARING_SHARED.equals(text)) {
143             return StreamConfiguration.SHARING_MODE_SHARED;
144         } else {
145             return StreamConfiguration.SHARING_MODE_EXCLUSIVE;
146         }
147     }
getUsageFromText(String text)148     public static int getUsageFromText(String text) {
149         if (VALUE_USAGE_GAME.equals(text)) {
150             return StreamConfiguration.USAGE_GAME;
151         } else if (VALUE_USAGE_VOICE_COMMUNICATION.equals(text)) {
152             return StreamConfiguration.USAGE_VOICE_COMMUNICATION;
153         } else if (VALUE_USAGE_MEDIA.equals(text)) {
154             return StreamConfiguration.USAGE_MEDIA;
155         } else if (VALUE_USAGE_ALARM.equals(text)) {
156             return StreamConfiguration.USAGE_ALARM;
157         } else if (VALUE_USAGE_NOTIFICATION.equals(text)) {
158             return StreamConfiguration.USAGE_NOTIFICATION;
159         } else {
160             return StreamConfiguration.UNSPECIFIED;
161         }
162     }
163 
configureStreamsFromBundle(Bundle bundle, StreamConfiguration requestedInConfig, StreamConfiguration requestedOutConfig)164     public static void configureStreamsFromBundle(Bundle bundle,
165                                                   StreamConfiguration requestedInConfig,
166                                                   StreamConfiguration requestedOutConfig) {
167         configureInputStreamFromBundle(bundle, requestedInConfig);
168         configureOutputStreamFromBundle(bundle, requestedOutConfig);
169     }
170 
getNormalizedVolumeFromBundle(Bundle bundle)171     public static float getNormalizedVolumeFromBundle(Bundle bundle) {
172         return bundle.getFloat(KEY_VOLUME, VALUE_VOLUME_INVALID);
173     }
174 
175     /**
176      * @param bundle
177      * @return AudioManager.STREAM type or throw IllegalArgumentException
178      */
getVolumeStreamTypeFromBundle(Bundle bundle)179     public static int getVolumeStreamTypeFromBundle(Bundle bundle) {
180         String typeText = bundle.getString(KEY_VOLUME_TYPE, VALUE_VOLUME_TYPE_MUSIC);
181         switch (typeText) {
182             case VALUE_VOLUME_TYPE_ACCESSIBILITY:
183                 return AudioManager.STREAM_ACCESSIBILITY;
184             case VALUE_VOLUME_TYPE_ALARM:
185                 return AudioManager.STREAM_ALARM;
186             case VALUE_VOLUME_TYPE_DTMF:
187                 return AudioManager.STREAM_DTMF;
188             case VALUE_VOLUME_TYPE_MUSIC:
189                 return AudioManager.STREAM_MUSIC;
190             case VALUE_VOLUME_TYPE_NOTIFICATION:
191                 return AudioManager.STREAM_NOTIFICATION;
192             case VALUE_VOLUME_TYPE_RING:
193                 return AudioManager.STREAM_RING;
194             case VALUE_VOLUME_TYPE_SYSTEM:
195                 return AudioManager.STREAM_SYSTEM;
196             case VALUE_VOLUME_TYPE_VOICE_CALL:
197                 return AudioManager.STREAM_VOICE_CALL;
198             default:
199                throw new IllegalArgumentException(KEY_VOLUME_TYPE + " invalid: " + typeText);
200         }
201     }
202 
getChannelMaskFromBundle(Bundle bundle, String channelMaskKey)203     public static int getChannelMaskFromBundle(Bundle bundle, String channelMaskKey) {
204         String channelMaskText = bundle.getString(channelMaskKey);
205         if (channelMaskText == null) {
206             return StreamConfiguration.UNSPECIFIED;
207         }
208         switch (channelMaskText) {
209             case VALUE_CHANNEL_MONO:
210                 return StreamConfiguration.CHANNEL_MONO;
211             case VALUE_CHANNEL_STEREO:
212                 return StreamConfiguration.CHANNEL_STEREO;
213             case VALUE_CHANNEL_2POINT1:
214                 return StreamConfiguration.CHANNEL_2POINT1;
215             case VALUE_CHANNEL_TRI:
216                 return StreamConfiguration.CHANNEL_TRI;
217             case VALUE_CHANNEL_TRI_BACK:
218             case VALUE_CHANNEL_TRI_BACK_LOWERCASE:
219                 return StreamConfiguration.CHANNEL_TRI_BACK;
220             case VALUE_CHANNEL_3POINT1:
221                 return StreamConfiguration.CHANNEL_3POINT1;
222             case VALUE_CHANNEL_2POINT0POINT2:
223                 return StreamConfiguration.CHANNEL_2POINT0POINT2;
224             case VALUE_CHANNEL_2POINT1POINT2:
225                 return StreamConfiguration.CHANNEL_2POINT1POINT2;
226             case VALUE_CHANNEL_3POINT0POINT2:
227                 return StreamConfiguration.CHANNEL_3POINT0POINT2;
228             case VALUE_CHANNEL_3POINT1POINT2:
229                 return StreamConfiguration.CHANNEL_3POINT1POINT2;
230             case VALUE_CHANNEL_QUAD:
231                 return StreamConfiguration.CHANNEL_QUAD;
232             case VALUE_CHANNEL_QUAD_SIDE:
233             case VALUE_CHANNEL_QUAD_SIDE_LOWERCASE:
234                 return StreamConfiguration.CHANNEL_QUAD_SIDE;
235             case VALUE_CHANNEL_SURROUND:
236                 return StreamConfiguration.CHANNEL_SURROUND;
237             case VALUE_CHANNEL_PENTA:
238                 return StreamConfiguration.CHANNEL_PENTA;
239             case VALUE_CHANNEL_5POINT1:
240                 return StreamConfiguration.CHANNEL_5POINT1;
241             case VALUE_CHANNEL_5POINT1_SIDE:
242             case VALUE_CHANNEL_5POINT1_SIDE_LOWERCASE:
243                 return StreamConfiguration.CHANNEL_5POINT1_SIDE;
244             case VALUE_CHANNEL_6POINT1:
245                 return StreamConfiguration.CHANNEL_6POINT1;
246             case VALUE_CHANNEL_7POINT1:
247                 return StreamConfiguration.CHANNEL_7POINT1;
248             case VALUE_CHANNEL_5POINT1POINT2:
249                 return StreamConfiguration.CHANNEL_5POINT1POINT2;
250             case VALUE_CHANNEL_5POINT1POINT4:
251                 return StreamConfiguration.CHANNEL_5POINT1POINT4;
252             case VALUE_CHANNEL_7POINT1POINT2:
253                 return StreamConfiguration.CHANNEL_7POINT1POINT2;
254             case VALUE_CHANNEL_7POINT1POINT4:
255                 return StreamConfiguration.CHANNEL_7POINT1POINT4;
256             case VALUE_CHANNEL_9POINT1POINT4:
257                 return StreamConfiguration.CHANNEL_9POINT1POINT4;
258             case VALUE_CHANNEL_9POINT1POINT6:
259                 return StreamConfiguration.CHANNEL_9POINT1POINT6;
260             case VALUE_CHANNEL_FRONT_BACK:
261             case VALUE_CHANNEL_FRONT_BACK_LOWERCASE:
262                 return StreamConfiguration.CHANNEL_FRONT_BACK;
263             default:
264                 throw new IllegalArgumentException(
265                         channelMaskKey + " invalid: " + channelMaskText);
266         }
267     }
268 
configureOutputStreamFromBundle(Bundle bundle, StreamConfiguration requestedOutConfig)269     public static void configureOutputStreamFromBundle(Bundle bundle,
270                                                         StreamConfiguration requestedOutConfig) {
271         int audioApi;
272         String text;
273 
274         requestedOutConfig.reset();
275 
276         int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE);
277         requestedOutConfig.setSampleRate(sampleRate);
278 
279         text = bundle.getString(KEY_OUT_API, VALUE_UNSPECIFIED);
280         audioApi = getApiFromText(text);
281         requestedOutConfig.setNativeApi(audioApi);
282 
283         int outChannels = bundle.getInt(KEY_OUT_CHANNELS, VALUE_DEFAULT_CHANNELS);
284         int channelMask = getChannelMaskFromBundle(bundle, KEY_OUT_CHANNEL_MASK);
285         // Respect channel mask when it is specified.
286         if (channelMask != StreamConfiguration.UNSPECIFIED) {
287             requestedOutConfig.setChannelMask(channelMask);
288         } else {
289             requestedOutConfig.setChannelCount(outChannels);
290         }
291 
292         boolean outMMAP = bundle.getBoolean(KEY_OUT_USE_MMAP, VALUE_DEFAULT_USE_MMAP);
293         requestedOutConfig.setMMap(outMMAP);
294 
295         text = bundle.getString(KEY_OUT_PERF, VALUE_PERF_LOW_LATENCY);
296         int perfMode = getPerfFromText(text);
297         requestedOutConfig.setPerformanceMode(perfMode);
298 
299         text = bundle.getString(KEY_OUT_SHARING, VALUE_SHARING_EXCLUSIVE);
300         int sharingMode = getSharingFromText(text);
301         requestedOutConfig.setSharingMode(sharingMode);
302 
303         text = bundle.getString(KEY_OUT_USAGE, VALUE_USAGE_MEDIA);
304         int usage = getUsageFromText(text);
305         requestedOutConfig.setUsage(usage);
306 
307 
308     }
309 
configureInputStreamFromBundle(Bundle bundle, StreamConfiguration requestedInConfig)310     public static void configureInputStreamFromBundle(Bundle bundle,
311                                                        StreamConfiguration requestedInConfig) {
312         int audioApi;
313         String text;
314 
315         requestedInConfig.reset();
316 
317         int sampleRate = bundle.getInt(KEY_SAMPLE_RATE, VALUE_DEFAULT_SAMPLE_RATE);
318         requestedInConfig.setSampleRate(sampleRate);
319 
320         text = bundle.getString(KEY_IN_API, VALUE_UNSPECIFIED);
321         audioApi = getApiFromText(text);
322         requestedInConfig.setNativeApi(audioApi);
323 
324         int inChannels = bundle.getInt(KEY_IN_CHANNELS, VALUE_DEFAULT_CHANNELS);
325         int channelMask = getChannelMaskFromBundle(bundle, KEY_IN_CHANNEL_MASK);
326         // Respect channel mask when it is specified.
327         if (channelMask != StreamConfiguration.UNSPECIFIED) {
328             requestedInConfig.setChannelMask(channelMask);
329         } else {
330             requestedInConfig.setChannelCount(inChannels);
331         }
332 
333         boolean inMMAP = bundle.getBoolean(KEY_IN_USE_MMAP, VALUE_DEFAULT_USE_MMAP);
334         requestedInConfig.setMMap(inMMAP);
335 
336         text = bundle.getString(KEY_IN_PERF, VALUE_PERF_LOW_LATENCY);
337         int perfMode = getPerfFromText(text);
338         requestedInConfig.setPerformanceMode(perfMode);
339 
340         text = bundle.getString(KEY_IN_SHARING, VALUE_SHARING_EXCLUSIVE);
341         int sharingMode = getSharingFromText(text);
342         requestedInConfig.setSharingMode(sharingMode);
343 
344         String defaultText = StreamConfiguration.convertInputPresetToText(
345                 StreamConfiguration.INPUT_PRESET_VOICE_RECOGNITION);
346         text = bundle.getString(KEY_IN_PRESET, defaultText);
347         int inputPreset = StreamConfiguration.convertTextToInputPreset(text);
348         if (inputPreset < 0) throw new IllegalArgumentException(KEY_IN_PRESET + " invalid: " + text);
349         requestedInConfig.setInputPreset(inputPreset);
350     }
351 
getSignalTypeFromBundle(Bundle bundle)352     public static int getSignalTypeFromBundle(Bundle bundle) {
353         String signalTypeText = bundle.getString(KEY_SIGNAL_TYPE);
354         if (signalTypeText == null) {
355             return 0;
356         }
357         switch (signalTypeText) {
358             case VALUE_SIGNAL_SINE:
359                 return 0;
360             case VALUE_SIGNAL_SAWTOOTH:
361                 return 1;
362             case VALUE_SIGNAL_FREQ_SWEEP:
363                 return 2;
364             case VALUE_SIGNAL_PITCH_SWEEP:
365                 return 3;
366             case VALUE_SIGNAL_WHITE_NOISE:
367                 return 4;
368             default:
369                 throw new IllegalArgumentException(
370                         KEY_SIGNAL_TYPE + " invalid: " + signalTypeText);
371         }
372     }
373 
getDurationSeconds(Bundle bundle)374     public static int getDurationSeconds(Bundle bundle) {
375         return bundle.getInt(KEY_DURATION, VALUE_DEFAULT_DURATION);
376     }
377 }
378