diff options
author | Martin Fietz <Martin.Fietz@gmail.com> | 2016-01-01 20:44:14 +0100 |
---|---|---|
committer | Martin Fietz <Martin.Fietz@gmail.com> | 2016-01-01 20:44:14 +0100 |
commit | b94e3ab4b2662b63e6ac9f8227a9e299d74a82a9 (patch) | |
tree | c3137387fffdd6fc4e649e5df0b12429e44f6216 | |
parent | de0f473612afd2fccba1bc7849e2291db6624fe1 (diff) | |
download | AudioPlayer-b94e3ab4b2662b63e6ac9f8227a9e299d74a82a9.tar.gz |
Sonic: On error, fall back to native mediaplayer
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(); } |