audio: detect hardware audio format class.

Available on API 17 +
diff --git a/src/org/sflphone/service/OpenSlParams.java b/src/org/sflphone/service/OpenSlParams.java
new file mode 100644
index 0000000..7701ab3
--- /dev/null
+++ b/src/org/sflphone/service/OpenSlParams.java
@@ -0,0 +1,86 @@
+package org.sflphone.service;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.media.AudioManager;
+import android.os.Build;
+import android.util.Log;
+
+/**
+ * This class illustrates how to query OpenSL config parameters on Jelly Bean MR1 while maintaining
+ * backward compatibility with older versions of Android. The trick is to place the new API calls in
+ * an inner class that will only be loaded if we're running on JB MR1 or later.
+ */
+public abstract class OpenSlParams {
+
+  /**
+   * @return The recommended sample rate in Hz.
+   */
+  public abstract int getSampleRate();
+
+  /**
+   * @return The recommended buffer size in frames.
+   */
+  public abstract int getBufferSize();
+
+  /**
+   * @param context, e.g., the current activity.
+   * @return OpenSlParams instance for the given context.
+   */
+  public static OpenSlParams createInstance(Context context) {
+    return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
+        ? new JellyBeanMr1OpenSlParams(context)
+        : new DefaultOpenSlParams();
+  }
+
+  private OpenSlParams() {
+    // Not meant to be instantiated except here.
+  }
+
+  // Implementation for Jelly Bean MR1 or later.
+  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+  private static class JellyBeanMr1OpenSlParams extends OpenSlParams {
+
+    private final int sampleRate;
+    private final int bufferSize;
+
+    private JellyBeanMr1OpenSlParams(Context context) {
+      AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+      // Provide default values in case config lookup fails.
+      int sr = 44100;
+      int bs = 64;
+      try {
+        // If possible, query the native sample rate and buffer size.
+        sr = Integer.parseInt(am.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
+        bs = Integer.parseInt(am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER));
+      } catch (NumberFormatException e) {
+        Log.w(getClass().getName(), "Failed to read native OpenSL config: " + e);
+      }
+      sampleRate = sr;
+      bufferSize = bs;
+    }
+
+    @Override
+    public int getSampleRate() {
+      return sampleRate;
+    }
+
+    @Override
+    public int getBufferSize() {
+      return bufferSize;
+    }
+  };
+
+  // Default factory for Jelly Bean or older.
+  private static class DefaultOpenSlParams extends OpenSlParams {
+    @Override
+    public int getSampleRate() {
+      return 44100;
+    }
+
+    @Override
+    public int getBufferSize() {
+      return 64;
+    }
+  };
+}