Skip to content

Commit 1b57014

Browse files
authored
Add ExoPlayerDataSourceProvider to offer support for caching in media3 audio navigator (readium#539)
1 parent 4a2e9d3 commit 1b57014

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.readium.adapter.exoplayer.audio
2+
3+
import androidx.media3.datasource.DataSource
4+
import org.readium.r2.shared.publication.Publication
5+
6+
public class DefaultExoPlayerDataSourceProvider : ExoPlayerDataSourceProvider {
7+
8+
override fun createDataSourceFactory(publication: Publication): DataSource.Factory {
9+
return PublicationExoPlayerDataSource.Factory(publication)
10+
}
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.readium.adapter.exoplayer.audio
2+
3+
import androidx.media3.datasource.DataSource
4+
import org.readium.r2.shared.publication.Publication
5+
6+
public fun interface ExoPlayerDataSourceProvider {
7+
8+
public fun createDataSourceFactory(publication: Publication): DataSource.Factory
9+
}

readium/adapters/exoplayer/audio/src/main/java/org/readium/adapter/exoplayer/audio/ExoPlayerEngineProvider.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package org.readium.adapter.exoplayer.audio
1010

1111
import android.app.Application
12-
import androidx.media3.datasource.DataSource
1312
import kotlin.time.Duration
1413
import kotlin.time.Duration.Companion.seconds
1514
import org.readium.navigator.media.audio.AudioEngineProvider
@@ -28,12 +27,16 @@ import org.readium.r2.shared.util.Try
2827
*
2928
* Provide [ExoPlayerDefaults] to customize the default values that will be used by
3029
* the navigator for some preferences.
30+
*
31+
* Pass an [ExoPlayerDataSourceProvider] providing a caching data source with an upstream
32+
* [PublicationExoPlayerDataSource] if you need caching.
3133
*/
3234
@ExperimentalReadiumApi
3335
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
3436
public class ExoPlayerEngineProvider(
3537
private val application: Application,
3638
private val metadataProvider: MediaMetadataProvider = DefaultMediaMetadataProvider(),
39+
private val dataSourceProvider: ExoPlayerDataSourceProvider = DefaultExoPlayerDataSourceProvider(),
3740
private val defaults: ExoPlayerDefaults = ExoPlayerDefaults(),
3841
private val configuration: ExoPlayerEngine.Configuration = ExoPlayerEngine.Configuration()
3942
) : AudioEngineProvider<ExoPlayerSettings, ExoPlayerPreferences, ExoPlayerPreferencesEditor> {
@@ -45,7 +48,7 @@ public class ExoPlayerEngineProvider(
4548
): Try<ExoPlayerEngine, Nothing> {
4649
val metadataFactory = metadataProvider.createMetadataFactory(publication)
4750
val settingsResolver = ExoPlayerSettingsResolver(defaults)
48-
val dataSourceFactory: DataSource.Factory = ExoPlayerDataSource.Factory(publication)
51+
val dataSourceFactory = dataSourceProvider.createDataSourceFactory(publication)
4952
val initialIndex = publication.readingOrder.indexOfFirstWithHref(initialLocator.href) ?: 0
5053
val initialPosition = initialLocator.locations.time ?: Duration.ZERO
5154
val playlist = ExoPlayerEngine.Playlist(
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ internal sealed class ExoPlayerDataSourceException(message: String, cause: Throw
3838
* An ExoPlayer's [DataSource] which retrieves resources from a [Publication].
3939
*/
4040
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
41-
internal class ExoPlayerDataSource internal constructor(
41+
public class PublicationExoPlayerDataSource internal constructor(
4242
private val publication: Publication
4343
) : BaseDataSource(/* isNetwork = */ true) {
4444

45-
class Factory(
45+
public class Factory(
4646
private val publication: Publication,
4747
private val transferListener: TransferListener? = null
4848
) : DataSource.Factory {
4949

5050
override fun createDataSource(): DataSource =
51-
ExoPlayerDataSource(publication).apply {
51+
PublicationExoPlayerDataSource(publication).apply {
5252
if (transferListener != null) {
5353
addTransferListener(transferListener)
5454
}

0 commit comments

Comments
 (0)