From 074ab20202cb8cf9f9e92c42548274e4ffbb5d93 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 19 Jan 2023 17:48:35 +0100 Subject: [PATCH 1/2] Use the same audio attributes and load control for all players --- .../libretube/services/BackgroundMode.kt | 14 ++------ .../ui/activities/OfflinePlayerActivity.kt | 2 ++ .../libretube/ui/fragments/PlayerFragment.kt | 33 ++++-------------- .../com/github/libretube/util/PlayerHelper.kt | 34 +++++++++++++++++-- 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt index dd9e0dbb8..ac4251f65 100644 --- a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt +++ b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt @@ -34,12 +34,10 @@ import com.github.libretube.util.NowPlayingNotification import com.github.libretube.util.PlayerHelper import com.github.libretube.util.PlayingQueue import com.github.libretube.util.PreferenceHelper -import com.google.android.exoplayer2.C import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.PlaybackException import com.google.android.exoplayer2.Player -import com.google.android.exoplayer2.audio.AudioAttributes import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -70,11 +68,6 @@ class BackgroundMode : Service() { private var player: ExoPlayer? = null private var playWhenReadyPlayer = true - /** - * The [AudioAttributes] handle the audio focus of the [player] - */ - private lateinit var audioAttributes: AudioAttributes - /** * SponsorBlock Segment data */ @@ -246,13 +239,10 @@ class BackgroundMode : Service() { private fun initializePlayer() { if (player != null) return - audioAttributes = AudioAttributes.Builder() - .setUsage(C.USAGE_MEDIA) - .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) - .build() player = ExoPlayer.Builder(this) .setHandleAudioBecomingNoisy(true) - .setAudioAttributes(audioAttributes, true) + .setAudioAttributes(PlayerHelper.getAudioAttributes(), true) + .setLoadControl(PlayerHelper.getLoadControl()) .build() /** diff --git a/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt index cc0693234..5072bb5d6 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt @@ -68,6 +68,8 @@ class OfflinePlayerActivity : BaseActivity() { player = ExoPlayer.Builder(this) .setHandleAudioBecomingNoisy(true) .setTrackSelector(trackSelector) + .setLoadControl(PlayerHelper.getLoadControl()) + .setAudioAttributes(PlayerHelper.getAudioAttributes(), true) .build().apply { addListener(object : Player.Listener { override fun onEvents(player: Player, events: Player.Events) { diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index ec626f4f8..740b4e272 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -99,13 +99,11 @@ import com.github.libretube.util.PreferenceHelper import com.github.libretube.util.SeekbarPreviewListener import com.github.libretube.util.TextUtils import com.google.android.exoplayer2.C -import com.google.android.exoplayer2.DefaultLoadControl import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.MediaItem.SubtitleConfiguration import com.google.android.exoplayer2.PlaybackException import com.google.android.exoplayer2.Player -import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.ext.cronet.CronetDataSource import com.google.android.exoplayer2.source.DefaultMediaSourceFactory import com.google.android.exoplayer2.trackselection.DefaultTrackSelector @@ -113,15 +111,15 @@ import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.upstream.DefaultDataSource import com.google.android.exoplayer2.util.MimeTypes import com.google.android.material.dialog.MaterialAlertDialogBuilder -import java.io.IOException -import java.util.* -import java.util.concurrent.Executors -import kotlin.math.abs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.chromium.net.CronetEngine import retrofit2.HttpException +import java.io.IOException +import java.util.* +import java.util.concurrent.Executors +import kotlin.math.abs class PlayerFragment : BaseFragment(), OnlinePlayerOptions { @@ -1335,24 +1333,6 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { cronetDataSourceFactory ) - // handles the audio focus - val audioAttributes = AudioAttributes.Builder() - .setUsage(C.USAGE_MEDIA) - .setContentType(C.AUDIO_CONTENT_TYPE_MOVIE) - .build() - - // handles the duration of media to retain in the buffer prior to the current playback position (for fast backward seeking) - val loadControl = DefaultLoadControl.Builder() - // cache the last three minutes - .setBackBuffer(1000 * 60 * 3, true) - .setBufferDurationsMs( - 1000 * 10, // exo default is 50s - PlayerHelper.bufferingGoal, - DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS, - DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS - ) - .build() - // control for the track sources like subtitles and audio source trackSelector = DefaultTrackSelector(requireContext()) @@ -1364,12 +1344,11 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { exoPlayer = ExoPlayer.Builder(requireContext()) .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) - .setLoadControl(loadControl) + .setLoadControl(PlayerHelper.getLoadControl()) .setTrackSelector(trackSelector) .setHandleAudioBecomingNoisy(true) + .setAudioAttributes(PlayerHelper.getAudioAttributes(), true) .build() - - exoPlayer.setAudioAttributes(audioAttributes, true) } /** diff --git a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt index 5f3315946..916ea78b2 100644 --- a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt @@ -16,6 +16,10 @@ import com.github.libretube.api.obj.PipedStream import com.github.libretube.constants.PreferenceKeys import com.github.libretube.enums.AudioQuality import com.github.libretube.enums.PlayerEvent +import com.google.android.exoplayer2.C +import com.google.android.exoplayer2.DefaultLoadControl +import com.google.android.exoplayer2.LoadControl +import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.ui.CaptionStyleCompat import com.google.android.exoplayer2.video.VideoSize import kotlin.math.roundToInt @@ -213,7 +217,7 @@ object PlayerHelper { "webm" ) - val bufferingGoal: Int + private val bufferingGoal: Int get() = PreferenceHelper.getString( PreferenceKeys.BUFFERING_GOAL, "50" @@ -332,7 +336,7 @@ object PlayerHelper { false ) - val alternativePiPControls: Boolean + private val alternativePiPControls: Boolean get() = PreferenceHelper.getBoolean( PreferenceKeys.ALTERNATIVE_PIP_CONTROLS, false @@ -429,4 +433,30 @@ object PlayerHelper { arrayListOf(rewindAction, playPauseAction, forwardAction) } } + + /** + * Get the audio attributes to use for the player + */ + fun getAudioAttributes(): AudioAttributes { + return AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.AUDIO_CONTENT_TYPE_MOVIE) + .build() + } + + /** + * Get the load controls for the player (buffering, etc) + */ + fun getLoadControl(): LoadControl { + return DefaultLoadControl.Builder() + // cache the last three minutes + .setBackBuffer(1000 * 60 * 3, true) + .setBufferDurationsMs( + 1000 * 10, // exo default is 50s + bufferingGoal, + DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS, + DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS + ) + .build() + } } From e1e4b2a2c9437aa467e4511fbde48eeb61b00ba4 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 19 Jan 2023 17:49:04 +0100 Subject: [PATCH 2/2] Run `ktlint --android -F --- .../com/github/libretube/ui/fragments/PlayerFragment.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index 740b4e272..8bb59b4f3 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -111,15 +111,15 @@ import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.upstream.DefaultDataSource import com.google.android.exoplayer2.util.MimeTypes import com.google.android.material.dialog.MaterialAlertDialogBuilder +import java.io.IOException +import java.util.* +import java.util.concurrent.Executors +import kotlin.math.abs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.chromium.net.CronetEngine import retrofit2.HttpException -import java.io.IOException -import java.util.* -import java.util.concurrent.Executors -import kotlin.math.abs class PlayerFragment : BaseFragment(), OnlinePlayerOptions {