my code is:
val mediaItem: MediaItem = MediaItem.Builder()
.setUri(recitationUri)
.setMediaId("$surah:${ayah}")
.setClippingConfiguration(
ClippingConfiguration.Builder()
.setStartPositionMs(ayahTiming.start)
.setEndPositionMs(ayahTiming.end)
.build()
).build()
val mediaSourceFactory = ProgressiveMediaSource.Factory(MediaCache.getInstance(this@PlaybackService).cacheFactory)
val source = mediaSourceFactory.createMediaSource(mediaItem)
and MediaCache class is :
const val CACHE_DIR_NAME = "cached_audio"
const val MAX_CACHE_SIZE = 256 * 1024 * 1024L//256MB
class MediaCache private constructor(context: Context) {
val cacheFactory: CacheDataSource.Factory
init {
cacheFactory = setupExoPlayerCache(context)
}
companion object {
@Volatile
private lateinit var instance: MediaCache
fun getInstance(context: Context): MediaCache {
synchronized(this) {
if (!::instance.isInitialized) {
instance = MediaCache(context)
}
return instance
}
}
}
@SuppressLint("UnsafeOptInUsageError")
private fun setupExoPlayerCache(context: Context): CacheDataSource.Factory {
val cacheEvictor = LeastRecentlyUsedCacheEvictor(MAX_CACHE_SIZE)
val databaseProvider = StandaloneDatabaseProvider(context)
val cache = SimpleCache(
File(context.cacheDir, CACHE_DIR_NAME),
cacheEvictor, databaseProvider
)
val upstreamFactory = DefaultDataSource.Factory(context)
return CacheDataSource.Factory().apply {
setCache(cache)
setUpstreamDataSourceFactory(upstreamFactory)
setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR)
}
}
}
I don't know why using this code ClippingConfiguration
is not working :
val mediaSourceFactory = ProgressiveMediaSource.Factory(MediaCache.getInstance(this@PlaybackService).cacheFactory)
val source = mediaSourceFactory.createMediaSource(mediaItem)
but working if using simple media source:
val source = DefaultMediaSourceFactory(this).createMediaSource(mediaItem)