Skip to content

Commit

Permalink
Add ExoPlayerDataSourceProvider to offer support for caching in med…
Browse files Browse the repository at this point in the history
…ia3 audio navigator (readium#539)
  • Loading branch information
qnga authored Jun 19, 2024
1 parent 4a2e9d3 commit 1b57014
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.readium.adapter.exoplayer.audio

import androidx.media3.datasource.DataSource
import org.readium.r2.shared.publication.Publication

public class DefaultExoPlayerDataSourceProvider : ExoPlayerDataSourceProvider {

override fun createDataSourceFactory(publication: Publication): DataSource.Factory {
return PublicationExoPlayerDataSource.Factory(publication)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.readium.adapter.exoplayer.audio

import androidx.media3.datasource.DataSource
import org.readium.r2.shared.publication.Publication

public fun interface ExoPlayerDataSourceProvider {

public fun createDataSourceFactory(publication: Publication): DataSource.Factory
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
package org.readium.adapter.exoplayer.audio

import android.app.Application
import androidx.media3.datasource.DataSource
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
import org.readium.navigator.media.audio.AudioEngineProvider
Expand All @@ -28,12 +27,16 @@ import org.readium.r2.shared.util.Try
*
* Provide [ExoPlayerDefaults] to customize the default values that will be used by
* the navigator for some preferences.
*
* Pass an [ExoPlayerDataSourceProvider] providing a caching data source with an upstream
* [PublicationExoPlayerDataSource] if you need caching.
*/
@ExperimentalReadiumApi
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
public class ExoPlayerEngineProvider(
private val application: Application,
private val metadataProvider: MediaMetadataProvider = DefaultMediaMetadataProvider(),
private val dataSourceProvider: ExoPlayerDataSourceProvider = DefaultExoPlayerDataSourceProvider(),
private val defaults: ExoPlayerDefaults = ExoPlayerDefaults(),
private val configuration: ExoPlayerEngine.Configuration = ExoPlayerEngine.Configuration()
) : AudioEngineProvider<ExoPlayerSettings, ExoPlayerPreferences, ExoPlayerPreferencesEditor> {
Expand All @@ -45,7 +48,7 @@ public class ExoPlayerEngineProvider(
): Try<ExoPlayerEngine, Nothing> {
val metadataFactory = metadataProvider.createMetadataFactory(publication)
val settingsResolver = ExoPlayerSettingsResolver(defaults)
val dataSourceFactory: DataSource.Factory = ExoPlayerDataSource.Factory(publication)
val dataSourceFactory = dataSourceProvider.createDataSourceFactory(publication)
val initialIndex = publication.readingOrder.indexOfFirstWithHref(initialLocator.href) ?: 0
val initialPosition = initialLocator.locations.time ?: Duration.ZERO
val playlist = ExoPlayerEngine.Playlist(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,17 @@ internal sealed class ExoPlayerDataSourceException(message: String, cause: Throw
* An ExoPlayer's [DataSource] which retrieves resources from a [Publication].
*/
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
internal class ExoPlayerDataSource internal constructor(
public class PublicationExoPlayerDataSource internal constructor(
private val publication: Publication
) : BaseDataSource(/* isNetwork = */ true) {

class Factory(
public class Factory(
private val publication: Publication,
private val transferListener: TransferListener? = null
) : DataSource.Factory {

override fun createDataSource(): DataSource =
ExoPlayerDataSource(publication).apply {
PublicationExoPlayerDataSource(publication).apply {
if (transferListener != null) {
addTransferListener(transferListener)
}
Expand Down

0 comments on commit 1b57014

Please sign in to comment.