aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fietz <Martin.Fietz@gmail.com>2016-01-01 20:44:14 +0100
committerMartin Fietz <Martin.Fietz@gmail.com>2016-01-01 20:44:14 +0100
commitb94e3ab4b2662b63e6ac9f8227a9e299d74a82a9 (patch)
treec3137387fffdd6fc4e649e5df0b12429e44f6216
parentde0f473612afd2fccba1bc7849e2291db6624fe1 (diff)
downloadAudioPlayer-b94e3ab4b2662b63e6ac9f8227a9e299d74a82a9.tar.gz
Sonic: On error, fall back to native mediaplayer
-rw-r--r--library/src/main/java/org/antennapod/audio/AndroidAudioPlayer.java5
-rw-r--r--library/src/main/java/org/antennapod/audio/MediaPlayer.java20
-rw-r--r--library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java61
3 files changed, 48 insertions, 38 deletions
diff --git a/library/src/main/java/org/antennapod/audio/AndroidAudioPlayer.java b/library/src/main/java/org/antennapod/audio/AndroidAudioPlayer.java
index e994bde..a16b7bd 100644
--- a/library/src/main/java/org/antennapod/audio/AndroidAudioPlayer.java
+++ b/library/src/main/java/org/antennapod/audio/AndroidAudioPlayer.java
@@ -348,8 +348,9 @@ public class AndroidAudioPlayer extends AbstractAudioPlayer {
owningMediaPlayer.lock.lock();
try {
mp.reset();
- }
- finally {
+ } catch(IllegalStateException e) {
+ Log.e(AMP_TAG, Log.getStackTraceString(e));
+ } finally {
owningMediaPlayer.lock.unlock();
}
}
diff --git a/library/src/main/java/org/antennapod/audio/MediaPlayer.java b/library/src/main/java/org/antennapod/audio/MediaPlayer.java
index c9e2299..61730a4 100644
--- a/library/src/main/java/org/antennapod/audio/MediaPlayer.java
+++ b/library/src/main/java/org/antennapod/audio/MediaPlayer.java
@@ -353,6 +353,15 @@ public class MediaPlayer {
}
}
+ public boolean canFallback() {
+ return this.mpi == null || false == this.mpi instanceof AndroidAudioPlayer;
+ }
+
+ public void fallback() {
+ smp = null;
+ setupMpi(this.mpi.mContext);
+ }
+
private void setupMpi(final Context context) {
lock.lock();
try {
@@ -469,6 +478,7 @@ public class MediaPlayer {
}
private void switchMediaPlayerImpl(AbstractAudioPlayer from, AbstractAudioPlayer to) {
+ Log.d(TAG, "switchMediaPlayerImpl() called with: " + "from = [" + from + "], to = [" + to + "]");
lock.lock();
try {
Log.d(MP_TAG, "switchMediaPlayerImpl");
@@ -499,11 +509,8 @@ public class MediaPlayer {
// none of them require prepare() or the like first
to.setAudioStreamType(this.mAudioStreamType);
to.setLooping(this.mIsLooping);
- to.setPitchStepsAdjustment(this.mPitchStepsAdjustment);
Log.d(MP_TAG, "Setting playback speed to " + this.mSpeedMultiplier);
- to.setPlaybackSpeed(this.mSpeedMultiplier);
- to.setVolume(MediaPlayer.this.mLeftVolume,
- MediaPlayer.this.mRightVolume);
+ to.setVolume(MediaPlayer.this.mLeftVolume, MediaPlayer.this.mRightVolume);
to.setWakeMode(this.mContext, this.mWakeMode);
Log.d(MP_TAG, "asserting at least one data source is null");
@@ -525,6 +532,11 @@ public class MediaPlayer {
e.printStackTrace();
}
}
+
+ // (native) mediaplayer has to be initialized
+ to.setPitchStepsAdjustment(this.mPitchStepsAdjustment);
+ to.setPlaybackSpeed(this.mSpeedMultiplier);
+
if ((this.state == State.PREPARED)
|| (this.state == State.PREPARING)
|| (this.state == State.PAUSED)
diff --git a/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java b/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java
index bbb2e2e..5aa616b 100644
--- a/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java
+++ b/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java
@@ -45,6 +45,7 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
protected final MediaPlayer mMediaPlayer;
private AudioTrack mTrack;
+ private int mBufferSize;
private Sonic mSonic;
private MediaExtractor mExtractor;
private MediaCodec mCodec;
@@ -119,12 +120,10 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
public int getCurrentPosition() {
switch (mCurrentState) {
case STATE_ERROR:
- error();
- break;
+ return 0;
default:
return (int) (mExtractor.getSampleTime() / 1000);
}
- return 0;
}
@Override
@@ -298,8 +297,8 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
if (mTrack != null) {
error();
} else {
- Log.d("start",
- "Attempting to start while in idle after construction. Not allowed by no callbacks called");
+ Log.d("start", "Attempting to start while in idle after construction. " +
+ "Not allowed by no callbacks called");
}
}
}
@@ -359,11 +358,6 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
}
mTrack.flush();
mExtractor.seekTo(((long) msec * 1000), MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
- if(hasVideoTrack()) {
- Log.d(TAG, "sample time: " + mExtractor.getSampleTime());
- mExtractor.advance();
- Log.d(TAG, "sample time: " + mExtractor.getSampleTime());
- }
Log.d(TAG, "seek completed, position: " + (mExtractor.getSampleTime() / 1000L));
if (owningMediaPlayer.onSeekCompleteListener != null) {
owningMediaPlayer.onSeekCompleteListener.onSeekComplete(owningMediaPlayer);
@@ -378,16 +372,6 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
}
}
- private boolean hasVideoTrack() {
- for(int i=0, count = mExtractor.getTrackCount(); i < count; i++) {
- MediaFormat format = mExtractor.getTrackFormat(i);
- String mime = format.getString(MediaFormat.KEY_MIME);
- Log.d(TAG, "mime: " + mime);
- }
- return false;
- }
-
-
@Override
public void setAudioStreamType(int streamtype) {
return;
@@ -483,6 +467,9 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
}
public void error(int extra) {
+ if(mCurrentState == STATE_ERROR) {
+ return;
+ }
Log.e(TAG_TRACK, "Moved to error state!");
mCurrentState = STATE_ERROR;
if(owningMediaPlayer.onErrorListener != null) {
@@ -531,18 +518,28 @@ public class SonicAudioPlayer extends AbstractAudioPlayer {
}
final MediaFormat oFormat = mExtractor.getTrackFormat(trackNum);
- int sampleRate = oFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
- int channelCount = oFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
- final String mime = oFormat.getString(MediaFormat.KEY_MIME);
- mDuration = oFormat.getLong(MediaFormat.KEY_DURATION);
-
- Log.v(TAG_TRACK, "Sample rate: " + sampleRate);
- Log.v(TAG_TRACK, "Mime type: " + mime);
-
- initDevice(sampleRate, channelCount);
- mExtractor.selectTrack(trackNum);
- mCodec = MediaCodec.createDecoderByType(mime);
- mCodec.configure(oFormat, null, null, 0);
+ if (oFormat.containsKey(MediaFormat.KEY_SAMPLE_RATE)
+ && oFormat.containsKey(MediaFormat.KEY_SAMPLE_RATE)
+ && oFormat.containsKey(MediaFormat.KEY_CHANNEL_COUNT)
+ && oFormat.containsKey(MediaFormat.KEY_MIME)
+ && oFormat.containsKey(MediaFormat.KEY_DURATION)) {
+ int sampleRate = oFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
+ int channelCount = oFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
+ final String mime = oFormat.getString(MediaFormat.KEY_MIME);
+ mDuration = oFormat.getLong(MediaFormat.KEY_DURATION);
+
+ Log.v(TAG_TRACK, "Sample rate: " + sampleRate);
+ Log.v(TAG_TRACK, "Channel count: " + channelCount);
+ Log.v(TAG_TRACK, "Mime type: " + mime);
+ Log.v(TAG_TRACK, "Duration: " + mDuration);
+
+ initDevice(sampleRate, channelCount);
+ mExtractor.selectTrack(trackNum);
+ mCodec = MediaCodec.createDecoderByType(mime);
+ mCodec.configure(oFormat, null, null, 0);
+ } else {
+ error();
+ }
mLock.unlock();
}