[Android] Add an option to select the audio output
Sébastien Toque
git at videolan.org
Thu May 10 00:31:52 CEST 2012
android | branch: master | Sébastien Toque <xilasz at gmail.com> | Thu May 10 00:31:00 2012 +0200| [8d14def06d3c994e2fb61eb443f027f07ee36fd4] | committer: Sébastien Toque
Add an option to select the audio output
choices are :
- AudioTrack (natif) <= default
- AudioTrack (java)
- OpenSL ES <= only available in 2.3+
> http://git.videolan.org/gitweb.cgi/android.git/?a=commit;h=8d14def06d3c994e2fb61eb443f027f07ee36fd4
---
vlc-android/jni/libvlcjni.c | 17 +++++++++-
vlc-android/res/values-fr/strings.xml | 5 +++
vlc-android/res/values/strings.xml | 13 ++++++++
vlc-android/res/xml/preferences.xml | 5 +++
vlc-android/src/org/videolan/vlc/LibVLC.java | 33 +++++++++++++++++++-
vlc-android/src/org/videolan/vlc/Util.java | 15 +++++++++
.../org/videolan/vlc/gui/PreferencesActivity.java | 16 +++++++++
7 files changed, 101 insertions(+), 3 deletions(-)
diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
index b6c0d18..602d579 100644
--- a/vlc-android/jni/libvlcjni.c
+++ b/vlc-android/jni/libvlcjni.c
@@ -36,6 +36,10 @@
#define LOG_TAG "VLC/JNI/main"
#include "log.h"
+#define AOUT_AUDIOTRACK 0
+#define AOUT_AUDIOTRACK_JAVA 1
+#define AOUT_OPENSLES 2
+
libvlc_media_t *new_media(jint instance, JNIEnv *env, jobject thiz, jstring fileLocation, bool noOmx)
{
libvlc_instance_t *libvlc = (libvlc_instance_t*)instance;
@@ -220,8 +224,13 @@ void Java_org_videolan_vlc_LibVLC_detachSurface(JNIEnv *env, jobject thiz) {
void Java_org_videolan_vlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
{
+ //only use OpenSLES if java side says we can
+ jclass cls = (*env)->GetObjectClass(env, thiz);
+ jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I");
+ bool use_opensles = (*env)->CallIntMethod(env, thiz, methodId) == AOUT_OPENSLES;
+
/* Don't add any invalid options, otherwise it causes LibVLC to crash */
- static const char *argv[] = {
+ const char *argv[] = {
"-I", "dummy",
"-vv",
"--no-osd",
@@ -232,6 +241,7 @@ void Java_org_videolan_vlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
"--control", "logger",
"--logmode", "android",
"--ffmpeg-fast",
+ use_opensles ? "--aout=opensles" : "--aout=android_audiotrack"
};
libvlc_instance_t *instance = libvlc_new(sizeof(argv) / sizeof(*argv), argv);
@@ -444,7 +454,10 @@ void Java_org_videolan_vlc_LibVLC_readMedia(JNIEnv *env, jobject thiz,
libvlc_media_player_set_media(mp, m);
- if ( currentSdk( env, thiz ) < 9 ) //On newer version, we can use SLES
+ //if AOUT_AUDIOTRACK_JAVA, we use amem
+ jclass cls = (*env)->GetObjectClass(env, thiz);
+ jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I");
+ if ( (*env)->CallIntMethod(env, thiz, methodId) == AOUT_AUDIOTRACK_JAVA )
{
libvlc_audio_set_callbacks(mp, aout_play, NULL, NULL, NULL, NULL,
(void*) myJavaLibVLC);
diff --git a/vlc-android/res/values-fr/strings.xml b/vlc-android/res/values-fr/strings.xml
index 4395c7f..23808f0 100644
--- a/vlc-android/res/values-fr/strings.xml
+++ b/vlc-android/res/values-fr/strings.xml
@@ -86,4 +86,9 @@
<string name="track_samplerate_info">Fréquence d\'échantillonage: %1$d Hz\n</string>
<string name="track_resolution_info">Résolution: %1$dx%2$d\n</string>
<string name="track_framerate_info">Débit d\'images: %1$.3f\n</string>
+
+ <string name="aout">Sortie audio</string>
+ <string name="aout_audiotrack">AudioTrack (natif)</string>
+ <string name="aout_audiotrack_java">AudioTrack (java)</string>
+ <string name="aout_opensles">OpenSL ES</string>
</resources>
diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml
index 0ce6559..5643240 100644
--- a/vlc-android/res/values/strings.xml
+++ b/vlc-android/res/values/strings.xml
@@ -93,4 +93,17 @@
<string name="open_mrl_dialog_title">Open network stream</string>
<string name="open_mrl_dialog_msg">Enter network MRL: e.g. http://, mms:// or rtsp://</string>
+ <string name="aout">Audio output</string>
+ <string name="aout_audiotrack">AudioTrack (native)</string>
+ <string name="aout_audiotrack_java">AudioTrack (java)</string>
+ <string name="aout_opensles">OpenSL ES</string>
+ <string-array name="aouts_froyo">
+ <item>@string/aout_audiotrack</item>
+ <item>@string/aout_audiotrack_java</item>
+ </string-array>
+ <string-array name="aouts">
+ <item>@string/aout_audiotrack</item>
+ <item>@string/aout_audiotrack_java</item>
+ <item>@string/aout_opensles</item>
+ </string-array>
</resources>
diff --git a/vlc-android/res/xml/preferences.xml b/vlc-android/res/xml/preferences.xml
index d196de6..a250a33 100644
--- a/vlc-android/res/xml/preferences.xml
+++ b/vlc-android/res/xml/preferences.xml
@@ -37,6 +37,11 @@
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="@string/advanced_prefs_category">
+ <ListPreference
+ android:key="aout"
+ android:defaultValue="@string/aout_audiotrack"
+ android:title="@string/aout" >
+ </ListPreference>
<PreferenceScreen android:title="@string/advanced_debugging">
<Preference android:title="@string/quit" android:key="quit_app" android:enabled="true"/>
<Preference android:title="@string/clear_media_db" android:key="clear_media_db" android:enabled="true" />
diff --git a/vlc-android/src/org/videolan/vlc/LibVLC.java b/vlc-android/src/org/videolan/vlc/LibVLC.java
index 6eaf8ba..f062fb1 100644
--- a/vlc-android/src/org/videolan/vlc/LibVLC.java
+++ b/vlc-android/src/org/videolan/vlc/LibVLC.java
@@ -27,13 +27,19 @@ import android.util.Log;
import android.view.Surface;
import android.preference.PreferenceManager;
import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
import android.os.Build;
public class LibVLC {
private static final String TAG = "VLC/LibVLC";
+ private static final int AOUT_AUDIOTRACK = 0;
+ private static final int AOUT_AUDIOTRACK_JAVA = 1;
+ private static final int AOUT_OPENSLES = 2;
private static LibVLC sInstance;
private static boolean sUseIomx = false;
+ private static int sAout = AOUT_AUDIOTRACK;
/** libVLC instance C pointer */
private int mLibVlcInstance = 0; // Read-only, reserved for JNI
@@ -132,8 +138,33 @@ public class LibVLC {
sUseIomx = enable;
}
+ public int getAout() {
+ return sAout;
+ }
+
public static synchronized void useIOMX(Context context) {
- sUseIomx = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enable_iomx", false);
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
+ sUseIomx = pref.getBoolean("enable_iomx", false);
+ setAout(context, pref.getString("aout", "error"), false);
+ }
+
+ public static synchronized void setAout(Context context, String aoutPref, boolean reset) {
+ Resources res = context.getResources();
+ if (aoutPref.equals(res.getString(R.string.aout_audiotrack_java)))
+ sAout = AOUT_AUDIOTRACK_JAVA;
+ else if (aoutPref.equals(res.getString(R.string.aout_opensles)) && Util.isGingerbread())
+ sAout = AOUT_OPENSLES;
+ else
+ sAout = AOUT_AUDIOTRACK;
+
+ if (reset && sInstance != null) {
+ try {
+ sInstance.destroy();
+ sInstance.init();
+ } catch (LibVlcException lve) {
+ Log.e(TAG, "Unable to reinit libvlc: " + lve);
+ }
+ }
}
/**
diff --git a/vlc-android/src/org/videolan/vlc/Util.java b/vlc-android/src/org/videolan/vlc/Util.java
index 4be2c4d..68db351 100644
--- a/vlc-android/src/org/videolan/vlc/Util.java
+++ b/vlc-android/src/org/videolan/vlc/Util.java
@@ -166,4 +166,19 @@ public class Util {
? R.drawable.background_item1
: R.drawable.background_item2);
}
+
+ public static boolean isGingerbread()
+ {
+ return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD;
+ }
+
+ public static boolean isHoneycomb()
+ {
+ return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB;
+ }
+
+ public static boolean isICS()
+ {
+ return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
+ }
}
diff --git a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
index 8064161..0282ff1 100644
--- a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
@@ -24,13 +24,16 @@ import org.videolan.vlc.AudioServiceController;
import org.videolan.vlc.DatabaseManager;
import org.videolan.vlc.LibVLC;
import org.videolan.vlc.R;
+import org.videolan.vlc.Util;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.widget.Toast;
@@ -105,6 +108,19 @@ public class PreferencesActivity extends PreferenceActivity {
}
});
+ // Audio output
+ ListPreference aoutPref = (ListPreference) findPreference("aout");
+ int aoutEntriesId = Util.isGingerbread() ? R.array.aouts : R.array.aouts_froyo;
+ aoutPref.setEntries(aoutEntriesId);
+ aoutPref.setEntryValues(aoutEntriesId);
+ aoutPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ LibVLC.setAout(PreferencesActivity.this, (String) newValue, true);
+ return true;
+ }
+ });
+
// Attach debugging items
Preference quitAppPref = (Preference) findPreference("quit_app");
quitAppPref.setOnPreferenceClickListener(
More information about the Android
mailing list