[Android] [PATCH 1/2] Remove AudioTrack Java and use AudioTrack by default
Thomas Guillem
thomas at gllm.fr
Fri Feb 6 18:08:11 CET 2015
There is a new audiotrack module that use AudioTrack API by JNI.
Use it per default because of the problems we have with Open Sles.
AudioTrack (Java) and AudioTrack (Native) are now merged.
---
libvlc/jni/Android.mk | 2 +-
libvlc/jni/aout.c | 260 ---------------------
libvlc/jni/aout.h | 35 ---
libvlc/jni/libvlcjni.c | 27 ++-
libvlc/src/org/videolan/libvlc/AudioOutput.java | 74 ------
libvlc/src/org/videolan/libvlc/LibVLC.java | 51 +---
vlc-android/res/values/strings.xml | 15 +-
vlc-android/res/xml/preferences.xml | 3 +-
.../org/videolan/vlc/gui/PreferencesActivity.java | 26 ++-
9 files changed, 47 insertions(+), 446 deletions(-)
delete mode 100644 libvlc/jni/aout.c
delete mode 100644 libvlc/jni/aout.h
delete mode 100644 libvlc/src/org/videolan/libvlc/AudioOutput.java
diff --git a/libvlc/jni/Android.mk b/libvlc/jni/Android.mk
index dbc5614..4134bb7 100644
--- a/libvlc/jni/Android.mk
+++ b/libvlc/jni/Android.mk
@@ -9,7 +9,7 @@ LOCAL_SRC_FILES += libvlcjni-equalizer.c
LOCAL_SRC_FILES += libvlcjni-vlcobject.c
LOCAL_SRC_FILES += java_event_thread.c
LOCAL_SRC_FILES += libvlcjni-media.c libvlcjni-medialist.c libvlcjni-mediadiscoverer.c
-LOCAL_SRC_FILES += aout.c vout.c native_crash_handler.c thumbnailer.c
+LOCAL_SRC_FILES += vout.c native_crash_handler.c thumbnailer.c
ifneq ($(APP_PLATFORM),android-21)
# compat functions not needed after android-21
LOCAL_SRC_FILES += compat/pthread-condattr.c compat/pthread-rwlocks.c
diff --git a/libvlc/jni/aout.c b/libvlc/jni/aout.c
deleted file mode 100644
index 7d4d8ce..0000000
--- a/libvlc/jni/aout.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*****************************************************************************
- * aout.c
- *****************************************************************************
- * Copyright © 2011-2012 VLC authors and VideoLAN
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#include <stdio.h>
-#include <assert.h>
-#include <string.h>
-#include <stdint.h>
-
-#include <jni.h>
-
-#include <vlc/vlc.h>
-
-#include "aout.h"
-
-#define LOG_TAG "VLC/JNI/aout"
-#include "log.h"
-
-// An audio frame will contain FRAME_SIZE samples
-#define FRAME_SIZE (4096*2)
-
-typedef struct
-{
- jobject j_libVlc; /// Pointer to the LibVLC Java object
- jmethodID play; /// Java method to play audio buffers
- jbyteArray buffer; /// Raw audio data to be played
-} aout_sys_t;
-
-#define THREAD_NAME "jni_aout"
-extern int jni_attach_thread(JNIEnv **env, const char *thread_name);
-extern void jni_detach_thread();
-
-int aout_open(void **opaque, char *format, unsigned *rate, unsigned *nb_channels)
-{
- LOGI ("Opening the JNI audio output");
-
- aout_sys_t *p_sys = calloc (1, sizeof (*p_sys));
- if (!p_sys)
- goto enomem;
-
- p_sys->j_libVlc = *opaque; // Keep a reference to our Java object
- *opaque = (void*) p_sys; // The callback will need aout_sys_t
-
- LOGI ("Parameters: %u channels, FOURCC '%4.4s', sample rate: %uHz",
- *nb_channels, format, *rate);
-
- JNIEnv *p_env;
- if (jni_attach_thread (&p_env, THREAD_NAME) != 0)
- {
- LOGE("Could not attach the display thread to the JVM !");
- goto eattach;
- }
-
- // Call the init function.
- jclass cls = (*p_env)->GetObjectClass (p_env, p_sys->j_libVlc);
- jmethodID methodIdInitAout = (*p_env)->GetMethodID (p_env, cls,
- "initAout", "(III)V");
- if (!methodIdInitAout)
- {
- LOGE ("Method initAout() could not be found!");
- goto error;
- }
-
- LOGV ("Number of channels forced to 2, number of samples to %d", FRAME_SIZE);
- *nb_channels = 2;
-
- int aout_rate = *rate;
- while (1) {
- (*p_env)->CallVoidMethod (p_env, p_sys->j_libVlc, methodIdInitAout,
- aout_rate, *nb_channels, FRAME_SIZE);
- if ((*p_env)->ExceptionCheck (p_env) == 0) {
- *rate = aout_rate;
- break;
- }
-
- if (aout_rate <= 0) {
- LOGE ("initAout failed, invalid sample rate %dHz", aout_rate);
- } else if (aout_rate != 44100) {
- if (aout_rate < 4000) {
- do {
- aout_rate *= 2;
- } while (aout_rate < 4000);
- } else if (aout_rate > 48000) {
- do {
- aout_rate /= 2;
- } while (aout_rate > 48000);
- } else {
- aout_rate = 44100;
- }
-
- LOGE ("initAout failed, try next sample rate %dHz", aout_rate);
- (*p_env)->ExceptionClear (p_env);
- continue;
- }
-
- LOGE ("Unable to create audio player!");
-#ifndef NDEBUG
- (*p_env)->ExceptionDescribe (p_env);
-#endif
- (*p_env)->ExceptionClear (p_env);
- goto error;
- }
-
- /* Create a new byte array to store the audio data. */
- jbyteArray buffer = (*p_env)->NewByteArray (p_env,
- *nb_channels *
- FRAME_SIZE *
- sizeof (uint16_t) /* =2 */);
- if (buffer == NULL)
- {
- LOGE ("Could not allocate the Java byte array to store the audio data!");
- goto error;
- }
-
- /* Use a global reference to not reallocate memory each time we run
- the play function. */
- p_sys->buffer = (*p_env)->NewGlobalRef (p_env, buffer);
- /* The local reference is no longer useful. */
- (*p_env)->DeleteLocalRef (p_env, buffer);
- if (p_sys->buffer == NULL)
- {
- LOGE ("Could not create the global reference!");
- goto error;
- }
-
- // Get the play methodId
- p_sys->play = (*p_env)->GetMethodID (p_env, cls, "playAudio", "([BI)V");
- assert (p_sys->play != NULL);
- jni_detach_thread ();
- return 0;
-
-error:
- jni_detach_thread ();
-eattach:
- *opaque = NULL;
- free (p_sys);
-enomem:
- return -1;
-}
-
-/**
- * Play an audio frame
- **/
-void aout_play(void *opaque, const void *samples, unsigned count, int64_t pts)
-{
- aout_sys_t *p_sys = opaque;
- JNIEnv *p_env;
-
- /* How ugly: we constantly attach/detach this thread to/from the JVM
- * because it will be killed before aout_close is called.
- * aout_close will actually be called in an different thread!
- */
- jni_attach_thread (&p_env, THREAD_NAME);
-
- (*p_env)->SetByteArrayRegion (p_env, p_sys->buffer, 0,
- 2 /*nb_channels*/ * count * sizeof (uint16_t),
- (jbyte*) samples);
- if ((*p_env)->ExceptionCheck (p_env))
- {
- // This can happen if for some reason the size of the input buffer
- // is larger than the size of the output buffer
- LOGE ("An exception occurred while calling SetByteArrayRegion");
- (*p_env)->ExceptionDescribe (p_env);
- (*p_env)->ExceptionClear (p_env);
- return;
- }
-
- (*p_env)->CallVoidMethod (p_env, p_sys->j_libVlc, p_sys->play,
- p_sys->buffer,
- 2 /*nb_channels*/ * count * sizeof (uint16_t),
- FRAME_SIZE);
- // FIXME: check for errors
-
- jni_detach_thread ();
-}
-
-void aout_pause(void *opaque, int64_t pts)
-{
- LOGI ("Pausing audio output");
- aout_sys_t *p_sys = opaque;
- assert(p_sys);
-
- JNIEnv *p_env;
- jni_attach_thread (&p_env, THREAD_NAME);
-
- // Call the pause function.
- jclass cls = (*p_env)->GetObjectClass (p_env, p_sys->j_libVlc);
- jmethodID methodIdPauseAout = (*p_env)->GetMethodID (p_env, cls, "pauseAout", "()V");
- if (!methodIdPauseAout)
- LOGE ("Method pauseAout() could not be found!");
- (*p_env)->CallVoidMethod (p_env, p_sys->j_libVlc, methodIdPauseAout);
- if ((*p_env)->ExceptionCheck (p_env))
- {
- LOGE ("Unable to pause audio player!");
-#ifndef NDEBUG
- (*p_env)->ExceptionDescribe (p_env);
-#endif
- (*p_env)->ExceptionClear (p_env);
- }
-
- jni_detach_thread ();
-}
-
-void aout_close(void *opaque)
-{
- LOGI ("Closing audio output");
- aout_sys_t *p_sys = opaque;
- assert(p_sys);
- assert(p_sys->buffer);
-
- JNIEnv *p_env;
- jni_attach_thread (&p_env, THREAD_NAME);
-
- // Call the close function.
- jclass cls = (*p_env)->GetObjectClass (p_env, p_sys->j_libVlc);
- jmethodID methodIdCloseAout = (*p_env)->GetMethodID (p_env, cls, "closeAout", "()V");
- if (!methodIdCloseAout)
- LOGE ("Method closeAout() could not be found!");
- (*p_env)->CallVoidMethod (p_env, p_sys->j_libVlc, methodIdCloseAout);
- if ((*p_env)->ExceptionCheck (p_env))
- {
- LOGE ("Unable to close audio player!");
-#ifndef NDEBUG
- (*p_env)->ExceptionDescribe (p_env);
-#endif
- (*p_env)->ExceptionClear (p_env);
- }
-
- (*p_env)->DeleteGlobalRef (p_env, p_sys->buffer);
- (*p_env)->DeleteGlobalRef (p_env, p_sys->j_libVlc);
- jni_detach_thread ();
- free (p_sys);
-}
-
-int aout_get_native_sample_rate(void)
-{
- JNIEnv *p_env;
- jni_attach_thread (&p_env, THREAD_NAME);
- jclass cls = (*p_env)->FindClass (p_env, "android/media/AudioTrack");
- jmethodID method = (*p_env)->GetStaticMethodID (p_env, cls, "getNativeOutputSampleRate", "(I)I");
- int sample_rate = (*p_env)->CallStaticIntMethod (p_env, cls, method, 3); // AudioManager.STREAM_MUSIC
- jni_detach_thread ();
- return sample_rate;
-}
diff --git a/libvlc/jni/aout.h b/libvlc/jni/aout.h
deleted file mode 100644
index 3fa3833..0000000
--- a/libvlc/jni/aout.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*****************************************************************************
- * aout.h
- *****************************************************************************
- * Copyright © 2011-2012 VLC authors and VideoLAN
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifndef LIBVLCJNI_AOUT_H
-#define LIBVLCJNI_AOUT_H
-
-#include <stdint.h>
-
-#define AOUT_AUDIOTRACK_JAVA 0
-#define AOUT_AUDIOTRACK 1
-#define AOUT_OPENSLES 2
-
-int aout_open(void **opaque, char *format, unsigned *rate, unsigned *nb_channels);
-void aout_play(void *opaque, const void *samples, unsigned count, int64_t pts);
-void aout_pause(void *opaque, int64_t pts);
-void aout_close(void *opaque);
-
-#endif // LIBVLCJNI_AOUT_H
diff --git a/libvlc/jni/libvlcjni.c b/libvlc/jni/libvlcjni.c
index 27d4e06..96df260 100644
--- a/libvlc/jni/libvlcjni.c
+++ b/libvlc/jni/libvlcjni.c
@@ -36,7 +36,6 @@
#include <android/api-level.h>
#include "libvlcjni.h"
-#include "aout.h"
#include "vout.h"
#include "utils.h"
#include "native_crash_handler.h"
@@ -45,6 +44,9 @@
#define VOUT_OPENGLES2 1
#define VOUT_ANDROID_WINDOW 2
+#define AOUT_AUDIOTRACK 0
+#define AOUT_OPENSLES 1
+
#define LOG_TAG "VLC/JNI/main"
#include "log.h"
@@ -498,6 +500,7 @@ void Java_org_videolan_libvlc_LibVLC_setEventHandler(JNIEnv *env, jobject thiz,
void Java_org_videolan_libvlc_LibVLC_playMRL(JNIEnv *env, jobject thiz,
jstring mrl, jobjectArray mediaOptions)
{
+ jclass cls;
/* Release previous media player, if any */
releaseMediaPlayer(env, thiz);
@@ -508,16 +511,6 @@ void Java_org_videolan_libvlc_LibVLC_playMRL(JNIEnv *env, jobject thiz,
libvlc_media_player_set_video_title_display(mp, libvlc_position_disable, 0);
jobject myJavaLibVLC = (*env)->NewGlobalRef(env, thiz); // freed in aout_close
- // If AOUT_AUDIOTRACK_JAVA, 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, aout_pause, NULL, NULL, NULL,
- (void*) myJavaLibVLC);
- libvlc_audio_set_format_callbacks(mp, aout_open, aout_close);
- }
-
/* Connect the event manager */
libvlc_event_manager_t *ev = libvlc_media_player_event_manager(mp);
static const libvlc_event_type_t mp_events[] = {
@@ -818,3 +811,15 @@ int jni_GetWindowSize(int *width, int *height)
pthread_mutex_unlock(&vout_android_lock);
return 0;
}
+
+/* used by opensles module */
+int aout_get_native_sample_rate(void)
+{
+ JNIEnv *p_env;
+ jni_attach_thread (&p_env, THREAD_NAME);
+ jclass cls = (*p_env)->FindClass (p_env, "android/media/AudioTrack");
+ jmethodID method = (*p_env)->GetStaticMethodID (p_env, cls, "getNativeOutputSampleRate", "(I)I");
+ int sample_rate = (*p_env)->CallStaticIntMethod (p_env, cls, method, 3); // AudioManager.STREAM_MUSIC
+ jni_detach_thread ();
+ return sample_rate;
+}
diff --git a/libvlc/src/org/videolan/libvlc/AudioOutput.java b/libvlc/src/org/videolan/libvlc/AudioOutput.java
deleted file mode 100644
index 06955ac..0000000
--- a/libvlc/src/org/videolan/libvlc/AudioOutput.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*****************************************************************************
- * Aout.java
- *****************************************************************************
- * Copyright © 2011-2012 VLC authors and VideoLAN
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-package org.videolan.libvlc;
-
-import android.media.AudioFormat;
-import android.media.AudioManager;
-import android.media.AudioTrack;
-import android.util.Log;
-
-public class AudioOutput {
- /**
- * Java side of the audio output module for Android.
- * Uses an AudioTrack to play decoded audio buffers.
- *
- * TODO Use MODE_STATIC instead of MODE_STREAM with a MemoryFile (ashmem)
- */
-
- public AudioOutput() {
- }
-
- private AudioTrack mAudioTrack;
- private static final String TAG = "LibVLC/aout";
-
- public void init(int sampleRateInHz, int channels, int samples) {
- Log.d(TAG, sampleRateInHz + ", " + channels + ", " + samples + "=>" + channels * samples);
- int minBufferSize = AudioTrack.getMinBufferSize(sampleRateInHz,
- AudioFormat.CHANNEL_OUT_STEREO,
- AudioFormat.ENCODING_PCM_16BIT);
- mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
- sampleRateInHz,
- AudioFormat.CHANNEL_OUT_STEREO,
- AudioFormat.ENCODING_PCM_16BIT,
- Math.max(minBufferSize, channels * samples * 2),
- AudioTrack.MODE_STREAM);
- }
-
- public void release() {
- if (mAudioTrack != null) {
- mAudioTrack.release();
- }
- mAudioTrack = null;
- }
-
- public void playBuffer(byte[] audioData, int bufferSize) {
- if (mAudioTrack.getState() == AudioTrack.STATE_UNINITIALIZED)
- return;
- if (mAudioTrack.write(audioData, 0, bufferSize) != bufferSize) {
- Log.w(TAG, "Could not write all the samples to the audio device");
- }
- mAudioTrack.play();
- }
-
- public void pause() {
- mAudioTrack.pause();
- }
-}
diff --git a/libvlc/src/org/videolan/libvlc/LibVLC.java b/libvlc/src/org/videolan/libvlc/LibVLC.java
index e7284ea..9860436 100644
--- a/libvlc/src/org/videolan/libvlc/LibVLC.java
+++ b/libvlc/src/org/videolan/libvlc/LibVLC.java
@@ -31,9 +31,8 @@ import android.view.Surface;
public class LibVLC {
private static final String TAG = "VLC/LibVLC";
- public static final int AOUT_AUDIOTRACK_JAVA = 0;
- public static final int AOUT_AUDIOTRACK = 1;
- public static final int AOUT_OPENSLES = 2;
+ public static final int AOUT_AUDIOTRACK = 0;
+ public static final int AOUT_OPENSLES = 1;
public static final int VOUT_ANDROID_SURFACE = 0;
public static final int VOUT_OPEGLES2 = 1;
@@ -73,8 +72,6 @@ public class LibVLC {
private StringBuffer mDebugLogBuffer;
private boolean mIsBufferingLog = false;
- private AudioOutput mAout;
-
/** Keep screen bright */
//private WakeLock mWakeLock;
@@ -84,7 +81,7 @@ public class LibVLC {
private String codecList = DEFAULT_CODEC_LIST;
private String devCodecList = null;
private String subtitlesEncoding = "";
- private int aout = LibVlcUtil.isGingerbreadOrLater() ? AOUT_OPENSLES : AOUT_AUDIOTRACK_JAVA;
+ private int aout = AOUT_AUDIOTRACK;
private int vout = VOUT_ANDROID_SURFACE;
private boolean timeStretching = false;
private int deblocking = -1;
@@ -196,7 +193,6 @@ public class LibVLC {
* It is private because this class is a singleton.
*/
private LibVLC() {
- mAout = new AudioOutput();
}
/**
@@ -363,10 +359,10 @@ public class LibVLC {
}
public void setAout(int aout) {
- if (aout < 0)
- this.aout = LibVlcUtil.isICSOrLater() ? AOUT_OPENSLES : AOUT_AUDIOTRACK_JAVA;
+ if (aout == AOUT_OPENSLES && LibVlcUtil.isICSOrLater())
+ this.aout = AOUT_OPENSLES;
else
- this.aout = aout;
+ this.aout = AOUT_AUDIOTRACK;
}
public int getVout() {
@@ -519,41 +515,6 @@ public class LibVLC {
}
/**
- * Open the Java audio output.
- * This function is called by the native code
- */
- public void initAout(int sampleRateInHz, int channels, int samples) {
- Log.d(TAG, "Opening the java audio output");
- mAout.init(sampleRateInHz, channels, samples);
- }
-
- /**
- * Play an audio buffer taken from the native code
- * This function is called by the native code
- */
- public void playAudio(byte[] audioData, int bufferSize) {
- mAout.playBuffer(audioData, bufferSize);
- }
-
- /**
- * Pause the Java audio output
- * This function is called by the native code
- */
- public void pauseAout() {
- Log.d(TAG, "Pausing the java audio output");
- mAout.pause();
- }
-
- /**
- * Close the Java audio output
- * This function is called by the native code
- */
- public void closeAout() {
- Log.d(TAG, "Closing the java audio output");
- mAout.release();
- }
-
- /**
* Play an MRL directly.
*
* @param mrl MRL of the media to play.
diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml
index 3786b99..e334bbb 100644
--- a/vlc-android/res/values/strings.xml
+++ b/vlc-android/res/values/strings.xml
@@ -268,9 +268,8 @@
<string name="advanced_prefs_category">Advanced</string>
<string name="aout">Audio output</string>
<string name="aout_summary">Change the method that VLC uses to output audio.</string>
- <string name="aout_audiotrack">AudioTrack (native)</string>
- <string name="aout_audiotrack_java">AudioTrack (Java)</string>
- <string name="aout_opensles">OpenSL ES</string>
+ <string name="aout_audiotrack" translatable="false">AudioTrack</string>
+ <string name="aout_opensles" translatable="false">OpenSL ES</string>
<string name="vout">Video output</string>
<string name="vout_summary">Change the method that VLC uses to output video.</string>
<string name="vout_android_surface">Android surface</string>
@@ -475,23 +474,13 @@
<item>Windows-1258</item>
</string-array>
- <string-array name="aouts_froyo">
- <item>@string/aout_audiotrack_java</item>
- <item>@string/aout_audiotrack</item>
- </string-array>
<string-array name="aouts">
- <item>@string/aout_audiotrack_java</item>
<item>@string/aout_audiotrack</item>
<item>@string/aout_opensles</item>
</string-array>
- <string-array name="aouts_values_froyo" translatable="false">
- <item>0</item>
- <item>1</item>
- </string-array>
<string-array name="aouts_values" translatable="false">
<item>0</item>
<item>1</item>
- <item>2</item>
</string-array>
<string-array name="chroma_formats_values" translatable="false">
diff --git a/vlc-android/res/xml/preferences.xml b/vlc-android/res/xml/preferences.xml
index 510833e..4aec0ac 100644
--- a/vlc-android/res/xml/preferences.xml
+++ b/vlc-android/res/xml/preferences.xml
@@ -108,7 +108,8 @@
</PreferenceCategory>
</PreferenceScreen>
<PreferenceScreen android:title="@string/advanced_prefs_category" >
- <PreferenceCategory android:title="@string/advanced_prefs_category" >
+ <PreferenceCategory android:key="advanced_prefs_group"
+ android:title="@string/advanced_prefs_category" >
<ListPreference
android:key="aout"
android:summary="@string/aout_summary"
diff --git a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
index 43aebc4..88e4970 100644
--- a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
@@ -51,6 +51,7 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.text.format.DateFormat;
@@ -237,12 +238,25 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
// Audio output
ListPreference aoutPref = (ListPreference) findPreference("aout");
- int aoutEntriesId = LibVlcUtil.isGingerbreadOrLater() ? R.array.aouts : R.array.aouts_froyo;
- int aoutEntriesIdValues = LibVlcUtil.isGingerbreadOrLater() ? R.array.aouts_values : R.array.aouts_values_froyo;
- aoutPref.setEntries(aoutEntriesId);
- aoutPref.setEntryValues(aoutEntriesIdValues);
- if (aoutPref.getValue() == null)
- aoutPref.setValue("0"/*AOUT_AUDIOTRACK_JAVA*/);
+ if (LibVlcUtil.isICSOrLater()) {
+ int aoutEntriesId = R.array.aouts;
+ int aoutEntriesIdValues = R.array.aouts_values;
+ aoutPref.setEntries(aoutEntriesId);
+ aoutPref.setEntryValues(aoutEntriesIdValues);
+ final String value = aoutPref.getValue();
+ if (value == null)
+ aoutPref.setValue(String.valueOf(LibVLC.AOUT_AUDIOTRACK));
+ else {
+ /* number of entries decreased, handle old values */
+ final int intValue = Integer.parseInt(value);
+ if (intValue != LibVLC.AOUT_AUDIOTRACK && intValue != LibVLC.AOUT_OPENSLES)
+ aoutPref.setValue(String.valueOf(LibVLC.AOUT_AUDIOTRACK));
+ }
+ } else {
+ /* only audiotrack before ics */
+ PreferenceGroup group = (PreferenceGroup) findPreference("advanced_prefs_group");
+ group.removePreference(aoutPref);
+ }
// Video output
ListPreference voutPref = (ListPreference) findPreference("vout");
int voutEntriesId = LibVlcUtil.isGingerbreadOrLater() ? R.array.vouts : R.array.vouts_froyo;
--
2.1.3
More information about the Android
mailing list