-Fixed audio focus not working with timeline changes.

-Changed circular loading to boundary loading.
This commit is contained in:
John Zhen M 2017-09-17 22:47:29 -07:00 committed by John Zhen Mo
parent a0ba3ce2e4
commit 9576d5bd89
2 changed files with 19 additions and 12 deletions

View File

@ -440,12 +440,16 @@ public abstract class BasePlayer implements Player.EventListener,
if (simpleExoPlayer != null) simpleExoPlayer.setVolume(DUCK_AUDIO_TO);
animateAudio(DUCK_AUDIO_TO, 1f, DUCK_DURATION);
if (isResumeAfterAudioFocusGain()) simpleExoPlayer.setPlayWhenReady(true);
if (isResumeAfterAudioFocusGain()) {
simpleExoPlayer.setPlayWhenReady(true);
wasPlaying = true;
}
}
protected void onAudioFocusLoss() {
if (DEBUG) Log.d(TAG, "onAudioFocusLoss() called");
simpleExoPlayer.setPlayWhenReady(false);
wasPlaying = false;
}
protected void onAudioFocusLossCanDuck() {
@ -758,6 +762,7 @@ public abstract class BasePlayer implements Player.EventListener,
else playQueue.setIndex(0);
}
simpleExoPlayer.setPlayWhenReady(!isPlaying());
wasPlaying = simpleExoPlayer.getPlayWhenReady();
}
public void onFastRewind() {
@ -774,10 +779,12 @@ public abstract class BasePlayer implements Player.EventListener,
if (simpleExoPlayer == null || playQueue == null || currentInfo == null) return;
if (DEBUG) Log.d(TAG, "onPlayPrevious() called");
if (simpleExoPlayer.getCurrentPosition() <= PLAY_PREV_ACTIVATION_LIMIT) {
playQueue.offsetIndex(-1);
} else {
/* If current playback has run for PLAY_PREV_ACTIVATION_LIMIT milliseconds, restart current track.
* Also restart the track if the current track is the first in a queue.*/
if (simpleExoPlayer.getCurrentPosition() > PLAY_PREV_ACTIVATION_LIMIT || playQueue.getIndex() == 0) {
simpleExoPlayer.seekTo(currentInfo.start_position);
} else {
playQueue.offsetIndex(-1);
}
}

View File

@ -211,18 +211,18 @@ public class PlaybackManager {
// The current item has higher priority
final int currentIndex = playQueue.getIndex();
final PlayQueueItem currentItem = playQueue.get(currentIndex);
if (currentItem != null) load(currentItem);
else return;
if (currentItem == null) return;
load(currentItem);
// Load boundaries to ensure correct looping
if (sourceToQueueIndex.indexOf(0) == -1) load(playQueue.get(0));
if (sourceToQueueIndex.indexOf(playQueue.size() - 1) == -1) load(playQueue.get(playQueue.size() - 1));
// The rest are just for seamless playback
final int leftBound = Math.max(0, currentIndex - WINDOW_SIZE);
final int rightLimit = currentIndex + WINDOW_SIZE + 1;
final int rightBound = Math.min(playQueue.size(), rightLimit);
final int rightBound = Math.min(playQueue.size(), currentIndex + WINDOW_SIZE + 1);
final List<PlayQueueItem> items = new ArrayList<>(playQueue.getStreams().subList(leftBound, rightBound));
final int excess = rightLimit - playQueue.size();
if (excess >= 0) items.addAll(playQueue.getStreams().subList(0, excess));
for (final PlayQueueItem item: items) load(item);
}
@ -245,7 +245,7 @@ public class PlaybackManager {
final MediaSource source = playbackListener.sourceOf(streamInfo, item.getSortedQualityIndex());
final int itemIndex = playQueue.indexOf(item);
// replace all except the currently playing
insert(itemIndex, source, false);
insert(itemIndex, source, itemIndex != playQueue.getIndex());
if (tryUnblock()) sync();
}