# BaseMediaSource

Artifact: [androidx.media3:media3-exoplayer](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/exoplayer/source/BaseMediaSource.java+class:androidx.media3.exoplayer.source.BaseMediaSource)

*** ** * ** ***

<br />

```
@UnstableApi
abstract class BaseMediaSource : MediaSource
```

<br />

Known direct subclasses [CompositeMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/CompositeMediaSource), [DashMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/dash/DashMediaSource), [EmptyMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/test/utils/EmptyMediaSource), [ExternallyLoadedMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ExternallyLoadedMediaSource), [FakeMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeMediaSource), [HlsMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/hls/HlsMediaSource), [ProgressiveMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ProgressiveMediaSource), [RtspMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/rtsp/RtspMediaSource), [ServerSideAdInsertionMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource), [SilenceMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/SilenceMediaSource), [SingleSampleMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/SingleSampleMediaSource), [SsMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/smoothstreaming/SsMediaSource)

|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/CompositeMediaSource` | Composite `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` consisting of multiple child sources. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/dash/DashMediaSource` | A DASH `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/EmptyMediaSource` | MediaSource producing an empty `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ExternallyLoadedMediaSource` | A `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` for media loaded outside of the usual ExoPlayer loading mechanism. |
| `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeMediaSource` | Fake `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` that provides a given timeline. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/hls/HlsMediaSource` | An HLS `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ProgressiveMediaSource` | Provides one period that loads data from a `https://developer.android.com/reference/android/net/Uri.html` and extracted using an `https://developer.android.com/reference/kotlin/androidx/media3/extractor/Extractor`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/rtsp/RtspMediaSource` | An Rtsp `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource` | A `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` for server-side inserted ad breaks. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/SilenceMediaSource` | Media source with a single period consisting of silent raw audio of a given duration. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/SingleSampleMediaSource` | **This class is deprecated.** The only use for this class is subtitle playback, but it is only compatible with legacy subtitle decoding, which is not supported by default. <br /> |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/smoothstreaming/SsMediaSource` | A SmoothStreaming `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource`. |

Known indirect subclasses [AdsMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ads/AdsMediaSource), [ClippingMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ClippingMediaSource), [ConcatenatingMediaSource2](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ConcatenatingMediaSource2), [ConcatenatingMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ConcatenatingMediaSource), [FakeAdaptiveMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeAdaptiveMediaSource), [FilteringMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/FilteringMediaSource), [ImaServerSideAdInsertionMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource), [LoopingMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/LoopingMediaSource), [MaskingMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MaskingMediaSource), [MergingMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MergingMediaSource), [PreloadMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadMediaSource), [WrappingMediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/WrappingMediaSource)

|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ads/AdsMediaSource` | A `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` that inserts ads linearly into a provided content media source. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ClippingMediaSource` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` that wraps a source and clips its timeline based on specified start/end positions. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ConcatenatingMediaSource2` | Concatenates multiple `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource`, combining everything in one single `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline.Window`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/ConcatenatingMediaSource` | **This class is deprecated.** Use playlist modification methods like `https://developer.android.com/reference/kotlin/androidx/media3/common/Player#addMediaItem(androidx.media3.common.MediaItem)` instead. <br /> |
| `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeAdaptiveMediaSource` | Fake `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` that provides a given timeline. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/FilteringMediaSource` | A `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` that filters the available `https://developer.android.com/reference/kotlin/androidx/media3/common/C.TrackType`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource` | MediaSource for IMA server side inserted ad streams. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/LoopingMediaSource` | **This class is deprecated.** To loop a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` indefinitely, use `https://developer.android.com/reference/kotlin/androidx/media3/common/Player#setRepeatMode(int)` instead of this class. <br /> |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MaskingMediaSource` | A `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` that masks the `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline` with a placeholder until the actual media structure is known. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MergingMediaSource` | Merges multiple `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource`s. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadMediaSource` | Preloads a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` and provides a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod` that has data loaded before playback. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/WrappingMediaSource` | An abstract `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` wrapping a single child `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource`. |

*** ** * ** ***

Base `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` implementation to handle parallel reuse and to keep a list of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener`s.

Whenever an implementing subclass needs to provide a new timeline, it must call `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#refreshSourceInfo(androidx.media3.common.Timeline)` to notify all listeners.

## Summary

| ### Public constructors |
|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#BaseMediaSource()()` |

| ### Public functions |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#addDrmEventListener(android.os.Handler,androidx.media3.exoplayer.drm.DrmSessionEventListener)( handler: https://developer.android.com/reference/android/os/Handler.html!, eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener! )` Adds a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener` to the list of listeners which are notified of DRM events for this media source. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#addEventListener(android.os.Handler,androidx.media3.exoplayer.source.MediaSourceEventListener)( handler: https://developer.android.com/reference/android/os/Handler.html!, eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener! )` Adds a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener` to the list of listeners which are notified of media source events. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#disable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)(caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!)` Disables the source for the creation of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#enable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)(caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!)` Enables the source for the creation of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)( caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!, playerId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/analytics/PlayerId!, bandwidthMeter: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter! )` Registers a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)(caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!)` Unregisters a caller, and disables and releases the source if no longer required. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#removeDrmEventListener(androidx.media3.exoplayer.drm.DrmSessionEventListener)(eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener!)` Removes a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener` from the list of listeners which are notified of DRM events for this media source. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#removeEventListener(androidx.media3.exoplayer.source.MediaSourceEventListener)(eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener!)` Removes a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener` from the list of listeners which are notified of media source events. |

| ### Protected functions |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher!` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createDrmEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)(mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?)` Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher!` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createDrmEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)( windowIndex: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId? )` Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher!` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)(mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?)` Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher!` | `[createEventDispatcher](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))( mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!, mediaTimeOffsetMs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html )` **This function is deprecated.** Use `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead. <br /> |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher!` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)( windowIndex: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId? )` Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher!` | `[createEventDispatcher](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))( windowIndex: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?, mediaTimeOffsetMs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html )` **This function is deprecated.** Use `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead. <br /> |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#disableInternal()()` Disables the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#disable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#enableInternal()()` Enables the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#enable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#isEnabled()()` Returns whether the source is enabled. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceCalled()()` Returns whether the source has `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` called. |
| `abstract https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceInternal(androidx.media3.datasource.TransferListener)(mediaTransferListener: https://developer.android.com/reference/kotlin/androidx/media3/datasource/TransferListener?)` Starts source preparation and enables the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#refreshSourceInfo(androidx.media3.common.Timeline)(timeline: https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline!)` Updates timeline and manifest and notifies all listeners of the update. |
| `abstract https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#releaseSourceInternal()()` Releases the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. |

| ### Protected properties |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter?` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#bandwidthMeter()` |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/analytics/PlayerId?` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#playerId()` |

### Inherited functions

From [androidx.media3.exoplayer.source.MediaSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource) `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#canUpdateMediaItem(androidx.media3.common.MediaItem)(mediaItem: https://developer.android.com/reference/kotlin/androidx/media3/common/MediaItem!)`

Returns whether the `https://developer.android.com/reference/kotlin/androidx/media3/common/MediaItem` for this source can be updated with the provided item.
`abstract https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod!` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)(

id: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!,

allocator: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/Allocator!,

startPositionUs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html

)`

Returns a new `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod` identified by `periodId`.
`https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline?` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#getInitialTimeline()()`

Returns the initial placeholder timeline that is returned immediately when the real timeline is not yet known, or null to let the player create an initial timeline.
`abstract https://developer.android.com/reference/kotlin/androidx/media3/common/MediaItem!` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#getMediaItem()()`

Returns the `https://developer.android.com/reference/kotlin/androidx/media3/common/MediaItem` whose media is provided by the source.
`https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#isSingleWindow()()`

Returns true if the media source is guaranteed to never have zero or more than one window.
`abstract https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#maybeThrowSourceInfoRefreshError()()`

Throws any pending error encountered while loading or refreshing source information.
`https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
[prepareSource](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.datasource.TransferListener,androidx.media3.exoplayer.analytics.PlayerId))(

caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!,

mediaTransferListener: https://developer.android.com/reference/kotlin/androidx/media3/datasource/TransferListener?,

playerId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/analytics/PlayerId!

)`

**This function is deprecated.**

Use `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` instead.

<br />

`abstract https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)(mediaPeriod: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod!)`

Releases the period.
`https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#updateMediaItem(androidx.media3.common.MediaItem)(mediaItem: https://developer.android.com/reference/kotlin/androidx/media3/common/MediaItem!)`

Updates the `https://developer.android.com/reference/kotlin/androidx/media3/common/MediaItem` for this source.

## Public constructors

### BaseMediaSource

```
BaseMediaSource()
```

## Public functions

### addDrmEventListener

```
@UnstableApi
fun addDrmEventListener(
    handler: Handler!,
    eventListener: DrmSessionEventListener!
): Unit
```

Adds a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener` to the list of listeners which are notified of DRM events for this media source.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `handler: https://developer.android.com/reference/android/os/Handler.html!` | A handler on the which listener events will be posted. |
| `eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener!` | The listener to be added. |

### addEventListener

```
@UnstableApi
fun addEventListener(
    handler: Handler!,
    eventListener: MediaSourceEventListener!
): Unit
```

Adds a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener` to the list of listeners which are notified of media source events.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `handler: https://developer.android.com/reference/android/os/Handler.html!` | A handler on the which listener events will be posted. |
| `eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener!` | The listener to be added. |

### disable

```
@UnstableApi
fun disable(caller: MediaSource.MediaSourceCaller!): Unit
```

Disables the source for the creation of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod`. The implementation should not hold onto limited resources used for the creation of media periods.

Should not be called directly from application code.

This method must be called on the playback thread and only after all `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod` previously created by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)` have been released by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)`.

| Parameters |
|---|---|
| `caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` disabling the source. |

### enable

```
@UnstableApi
fun enable(caller: MediaSource.MediaSourceCaller!): Unit
```

Enables the source for the creation of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod`.

Should not be called directly from application code.

This method must be called on the playback thread and only after `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)`.

| Parameters |
|---|---|
| `caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` enabling the source. |

### prepareSource

```
@UnstableApi
fun prepareSource(
    caller: MediaSource.MediaSourceCaller!,
    playerId: PlayerId!,
    bandwidthMeter: BandwidthMeter!
): Unit
```

Registers a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller`. Starts source preparation if needed and enables the source for the creation of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod`.

Should not be called directly from application code.

`https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller#onSourceInfoRefreshed(androidx.media3.exoplayer.source.MediaSource,androidx.media3.common.Timeline)` will be called once the source has a `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline`.

For each call to this method, a call to `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)` is needed to remove the caller and to release the source if no longer required.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` to be registered. |
| `playerId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/analytics/PlayerId!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/analytics/PlayerId` of the player using this media source. |
| `bandwidthMeter: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter` that provides `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter#getTransferListener()` which should be informed of any media data transfers, and estimates the currently available bandwidth. May be `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter#NO_OP()` if no bandwidth meter is available and the `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource` doesn't need the bandwidth estimation. Note that the provided transfer listener by the `bandwidthMeter` should be only informed of transfers related to the media loads and not of auxiliary loads for manifests and other data. |

### releaseSource

```
@UnstableApi
fun releaseSource(caller: MediaSource.MediaSourceCaller!): Unit
```

Unregisters a caller, and disables and releases the source if no longer required.

Should not be called directly from application code.

This method must be called on the playback thread and only if all created `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod` have been released by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)`.

| Parameters |
|---|---|
| `caller: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` to be unregistered. |

### removeDrmEventListener

```
@UnstableApi
fun removeDrmEventListener(eventListener: DrmSessionEventListener!): Unit
```

Removes a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener` from the list of listeners which are notified of DRM events for this media source.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener!` | The listener to be removed. |

### removeEventListener

```
@UnstableApi
fun removeEventListener(eventListener: MediaSourceEventListener!): Unit
```

Removes a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener` from the list of listeners which are notified of media source events.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `eventListener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener!` | The listener to be removed. |

## Protected functions

### createDrmEventDispatcher

```
protected fun createDrmEventDispatcher(mediaPeriodId: MediaSource.MediaPeriodId?): DrmSessionEventListener.EventDispatcher!
```

Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`

| Parameters |
|---|---|
| `mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher!` | An event dispatcher with pre-configured media period id. |

### createDrmEventDispatcher

```
protected fun createDrmEventDispatcher(
    windowIndex: Int,
    mediaPeriodId: MediaSource.MediaPeriodId?
): DrmSessionEventListener.EventDispatcher!
```

Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`.

| Parameters |
|---|---|
| `windowIndex: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The timeline window index to be reported with the events. |
| `mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher!` | An event dispatcher with pre-configured media period id and time offset. |

### createEventDispatcher

```
protected fun createEventDispatcher(mediaPeriodId: MediaSource.MediaPeriodId?): MediaSourceEventListener.EventDispatcher!
```

Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`.

| Parameters |
|---|---|
| `mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher!` | An event dispatcher with pre-configured media period id. |

### createEventDispatcher

```
protected fun [createEventDispatcher](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))(
    mediaPeriodId: MediaSource.MediaPeriodId!,
    mediaTimeOffsetMs: Long
): MediaSourceEventListener.EventDispatcher!
```

> [!CAUTION]
> **This function is deprecated.**   
>
> Use `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead.

Note: The `mediaTimeOffsetMs` passed to this method is ignored and not added to media times in any way.

### createEventDispatcher

```
protected fun createEventDispatcher(
    windowIndex: Int,
    mediaPeriodId: MediaSource.MediaPeriodId?
): MediaSourceEventListener.EventDispatcher!
```

Returns a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`.

| Parameters |
|---|---|
| `windowIndex: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The timeline window index to be reported with the events. |
| `mediaPeriodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId?` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher!` | An event dispatcher with pre-configured media period id. |

### createEventDispatcher

```
protected fun [createEventDispatcher](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))(
    windowIndex: Int,
    mediaPeriodId: MediaSource.MediaPeriodId?,
    mediaTimeOffsetMs: Long
): MediaSourceEventListener.EventDispatcher!
```

> [!CAUTION]
> **This function is deprecated.**   
>
> Use `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead.

Note: The `mediaTimeOffsetMs` passed to this method is ignored and not added to media times in any way.

### disableInternal

```
protected fun disableInternal(): Unit
```

Disables the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#disable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`.

### enableInternal

```
protected fun enableInternal(): Unit
```

Enables the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#enable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`.

### isEnabled

```
protected fun isEnabled(): Boolean
```

Returns whether the source is enabled.

### prepareSourceCalled

```
protected fun prepareSourceCalled(): Boolean
```

Returns whether the source has `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` called.

### prepareSourceInternal

```
protected abstract fun prepareSourceInternal(mediaTransferListener: TransferListener?): Unit
```

Starts source preparation and enables the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)`. This method is called at most once until the next call to `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#releaseSourceInternal()`.

This method is called on the playback thread.

| Parameters |
|---|---|
| `mediaTransferListener: https://developer.android.com/reference/kotlin/androidx/media3/datasource/TransferListener?` | The transfer listener which should be informed of any media data transfers. May be null if no listener is available. Note that this listener should usually be only informed of transfers related to the media loads and not of auxiliary loads for manifests and other data. |

### refreshSourceInfo

```
protected fun refreshSourceInfo(timeline: Timeline!): Unit
```

Updates timeline and manifest and notifies all listeners of the update.

| Parameters |
|---|---|
| `timeline: https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline!` | The new `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline`. |

### releaseSourceInternal

```
protected abstract fun releaseSourceInternal(): Unit
```

Releases the source, see `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. This method is called exactly once after each call to `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceInternal(androidx.media3.datasource.TransferListener)`.

This method is called on the playback thread.

## Protected properties

### bandwidthMeter

```
protected var bandwidthMeter: BandwidthMeter?
```

### playerId

```
protected var playerId: PlayerId?
```