blob: 7701ab31db3828985494301dda6c24cd12fcf3c1 [file] [log] [blame]
Adrien BĂ©raud62bf85d2014-01-31 16:02:39 -05001package org.sflphone.service;
2
3import android.annotation.TargetApi;
4import android.content.Context;
5import android.media.AudioManager;
6import android.os.Build;
7import android.util.Log;
8
9/**
10 * This class illustrates how to query OpenSL config parameters on Jelly Bean MR1 while maintaining
11 * backward compatibility with older versions of Android. The trick is to place the new API calls in
12 * an inner class that will only be loaded if we're running on JB MR1 or later.
13 */
14public abstract class OpenSlParams {
15
16 /**
17 * @return The recommended sample rate in Hz.
18 */
19 public abstract int getSampleRate();
20
21 /**
22 * @return The recommended buffer size in frames.
23 */
24 public abstract int getBufferSize();
25
26 /**
27 * @param context, e.g., the current activity.
28 * @return OpenSlParams instance for the given context.
29 */
30 public static OpenSlParams createInstance(Context context) {
31 return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
32 ? new JellyBeanMr1OpenSlParams(context)
33 : new DefaultOpenSlParams();
34 }
35
36 private OpenSlParams() {
37 // Not meant to be instantiated except here.
38 }
39
40 // Implementation for Jelly Bean MR1 or later.
41 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
42 private static class JellyBeanMr1OpenSlParams extends OpenSlParams {
43
44 private final int sampleRate;
45 private final int bufferSize;
46
47 private JellyBeanMr1OpenSlParams(Context context) {
48 AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
49 // Provide default values in case config lookup fails.
50 int sr = 44100;
51 int bs = 64;
52 try {
53 // If possible, query the native sample rate and buffer size.
54 sr = Integer.parseInt(am.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
55 bs = Integer.parseInt(am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER));
56 } catch (NumberFormatException e) {
57 Log.w(getClass().getName(), "Failed to read native OpenSL config: " + e);
58 }
59 sampleRate = sr;
60 bufferSize = bs;
61 }
62
63 @Override
64 public int getSampleRate() {
65 return sampleRate;
66 }
67
68 @Override
69 public int getBufferSize() {
70 return bufferSize;
71 }
72 };
73
74 // Default factory for Jelly Bean or older.
75 private static class DefaultOpenSlParams extends OpenSlParams {
76 @Override
77 public int getSampleRate() {
78 return 44100;
79 }
80
81 @Override
82 public int getBufferSize() {
83 return 64;
84 }
85 };
86}