Skip to content

Commit fbd38bf

Browse files
committed
Merge branch 'fix/async_load' into minor
2 parents 2892bca + 4b102c7 commit fbd38bf

File tree

5 files changed

+293
-163
lines changed

5 files changed

+293
-163
lines changed

just_audio/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
## 0.10.1
22

33
* Fix unhandled PlayerInterruptedException.
4+
* Fix duplicate load in active state.
5+
* Synchronize playlist API calls.
6+
* Improve position accuracy over Bluetooth on Android.
47

58
## 0.10.0
69

just_audio/android/src/main/java/com/ryanheise/just_audio/AudioPlayer.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import androidx.media3.common.C;
1212
import androidx.media3.exoplayer.DefaultLivePlaybackSpeedControl;
1313
import androidx.media3.exoplayer.DefaultLoadControl;
14+
import androidx.media3.exoplayer.DefaultRenderersFactory;
1415
import androidx.media3.exoplayer.ExoPlaybackException;
1516
import androidx.media3.exoplayer.LivePlaybackSpeedControl;
1617
import androidx.media3.exoplayer.LoadControl;
@@ -25,6 +26,9 @@
2526
import androidx.media3.common.TrackSelectionParameters;
2627
import androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences;
2728
import androidx.media3.common.AudioAttributes;
29+
import androidx.media3.exoplayer.NoSampleRenderer;
30+
import androidx.media3.exoplayer.Renderer;
31+
import androidx.media3.exoplayer.RenderersFactory;
2832
import androidx.media3.extractor.DefaultExtractorsFactory;
2933
import androidx.media3.common.Metadata;
3034
import androidx.media3.exoplayer.metadata.MetadataOutput;
@@ -250,7 +254,9 @@ public void onTracksChanged(Tracks tracks) {
250254
}
251255

252256
private boolean updatePositionIfChanged() {
253-
if (getCurrentPosition() == updatePosition) return false;
257+
if (!player.getPlayWhenReady() || processingState != ProcessingState.ready) {
258+
if (getCurrentPosition() == updatePosition) return false;
259+
}
254260
updatePosition = getCurrentPosition();
255261
updateTime = System.currentTimeMillis();
256262
return true;
@@ -749,7 +755,14 @@ private void load(final List<MediaSource> mediaSources, ShuffleOrder shuffleOrde
749755

750756
private void ensurePlayerInitialized() {
751757
if (player == null) {
752-
ExoPlayer.Builder builder = new ExoPlayer.Builder(context);
758+
RenderersFactory renderersFactory = (eventHandler, videoListener, audioListener, textOutput, metadataOutput) -> {
759+
Renderer[] defaultRenderers = new DefaultRenderersFactory(context)
760+
.createRenderers(eventHandler, videoListener, audioListener, textOutput, metadataOutput);
761+
Renderer[] allRenderers = Arrays.copyOf(defaultRenderers, defaultRenderers.length + 1);
762+
allRenderers[defaultRenderers.length] = new ObserverRenderer();
763+
return allRenderers;
764+
};
765+
ExoPlayer.Builder builder = new ExoPlayer.Builder(context, renderersFactory);
753766
builder.setUseLazyPreparation(useLazyPreparation);
754767
if (loadControl != null) {
755768
builder.setLoadControl(loadControl);
@@ -1103,4 +1116,31 @@ enum ProcessingState {
11031116
ready,
11041117
completed
11051118
}
1119+
1120+
public class ObserverRenderer extends NoSampleRenderer {
1121+
private long lastPosUs = 0L;
1122+
private int consecutivePosCount = 0;
1123+
1124+
@Override
1125+
public void render(long positionUs, long elapsedRealtimeUs) {
1126+
if (positionUs == lastPosUs) {
1127+
consecutivePosCount++;
1128+
} else {
1129+
if (consecutivePosCount >= 3) {
1130+
handler.post(() -> {
1131+
if (updatePositionIfChanged()) {
1132+
broadcastImmediatePlaybackEvent();
1133+
}
1134+
});
1135+
}
1136+
consecutivePosCount = 0;
1137+
}
1138+
lastPosUs = positionUs;
1139+
}
1140+
1141+
@Override
1142+
public String getName() {
1143+
return "ObserverRenderer";
1144+
}
1145+
}
11061146
}

0 commit comments

Comments
 (0)