import java.util.Scanner;
import java.util.Set;
import java.util.Vector;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.lang.ref.WeakReference;
/**
private int mUsage = -1;
private boolean mBypassInterruptionPolicy;
- // use AtomicBoolean instead of boolean so we can use the same member both as a flag and a lock.
- private AtomicBoolean mPreparing = new AtomicBoolean();
-
/**
* Default constructor. Consider using one of the create() methods for
* synchronously instantiating a MediaPlayer from a Uri or resource.
* @throws IllegalStateException if it is called in an invalid state
*/
public void prepare() throws IOException, IllegalStateException {
- // The synchronous version of prepare also recieves a MEDIA_PREPARED message.
- synchronized (mPreparing) {
- mPreparing.set(true);
- }
_prepare();
scanInternalSubtitleTracks();
}
*
* @throws IllegalStateException if it is called in an invalid state
*/
- public void prepareAsync() throws IllegalStateException {
- synchronized (mPreparing) {
- mPreparing.set(true);
- }
- _prepareAsync();
- }
-
- private native void _prepareAsync() throws IllegalStateException;
+ public native void prepareAsync() throws IllegalStateException;
/**
* Starts or resumes playback. If playback had previously been paused,
* initialized.
*/
public void stop() throws IllegalStateException {
- synchronized (mPreparing) {
- mPreparing.set(false);
- }
stayAwake(false);
_stop();
}
* at the same time.
*/
public void release() {
- synchronized (mPreparing) {
- mPreparing.set(false);
- }
stayAwake(false);
updateSurfaceScreenOn();
mOnPreparedListener = null;
* data source and calling prepare().
*/
public void reset() {
- synchronized (mPreparing) {
- mPreparing.set(false);
- }
mSelectedSubtitleTrackIndex = -1;
synchronized(mOpenSubtitleSources) {
for (final InputStream is: mOpenSubtitleSources) {
}
switch(msg.what) {
case MEDIA_PREPARED:
- synchronized (mPreparing) {
- if (mPreparing.get()) {
- scanInternalSubtitleTracks();
- mPreparing.set(false);
- }
+ try {
+ scanInternalSubtitleTracks();
+ } catch (RuntimeException e) {
+ // send error message instead of crashing;
+ // send error message instead of inlining a call to onError
+ // to avoid code duplication.
+ Message msg2 = obtainMessage(
+ MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_UNSUPPORTED, null);
+ sendMessage(msg2);
}
if (mOnPreparedListener != null)
mOnPreparedListener.onPrepared(mMediaPlayer);
Log.i(TAG, "Info (" + msg.arg1 + "," + msg.arg2 + ")");
break;
case MEDIA_INFO_METADATA_UPDATE:
- scanInternalSubtitleTracks();
+ try {
+ scanInternalSubtitleTracks();
+ } catch (RuntimeException e) {
+ Message msg2 = obtainMessage(
+ MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_UNSUPPORTED, null);
+ sendMessage(msg2);
+ }
// fall through
case MEDIA_INFO_EXTERNAL_METADATA_UPDATE:
{"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback },
{"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface},
{"_prepare", "()V", (void *)android_media_MediaPlayer_prepare},
- {"_prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync},
+ {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync},
{"_start", "()V", (void *)android_media_MediaPlayer_start},
{"_stop", "()V", (void *)android_media_MediaPlayer_stop},
{"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth},