mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 00:10:32 +05:30
feat: option to force lowest audio quality
This commit is contained in:
parent
08584b9bfc
commit
eb386fdcdb
@ -27,6 +27,7 @@ import androidx.media3.common.Tracks
|
|||||||
import androidx.media3.exoplayer.DefaultLoadControl
|
import androidx.media3.exoplayer.DefaultLoadControl
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
import androidx.media3.exoplayer.LoadControl
|
import androidx.media3.exoplayer.LoadControl
|
||||||
|
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
|
||||||
import androidx.media3.ui.CaptionStyleCompat
|
import androidx.media3.ui.CaptionStyleCompat
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.obj.ChapterSegment
|
import com.github.libretube.api.obj.ChapterSegment
|
||||||
@ -37,6 +38,7 @@ import com.github.libretube.constants.PreferenceKeys
|
|||||||
import com.github.libretube.db.DatabaseHolder
|
import com.github.libretube.db.DatabaseHolder
|
||||||
import com.github.libretube.enums.PlayerEvent
|
import com.github.libretube.enums.PlayerEvent
|
||||||
import com.github.libretube.enums.SbSkipOptions
|
import com.github.libretube.enums.SbSkipOptions
|
||||||
|
import com.github.libretube.extensions.updateParameters
|
||||||
import com.github.libretube.obj.PreviewFrame
|
import com.github.libretube.obj.PreviewFrame
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
@ -331,6 +333,23 @@ object PlayerHelper {
|
|||||||
return PreferenceHelper.getString(prefKey, "")
|
return PreferenceHelper.getString(prefKey, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply the preferred audio quality: auto or worst
|
||||||
|
*/
|
||||||
|
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
|
||||||
|
fun applyPreferredAudioQuality(context: Context, trackSelector: DefaultTrackSelector) {
|
||||||
|
val prefKey = if (NetworkHelper.isNetworkMetered(context)) {
|
||||||
|
PreferenceKeys.PLAYER_AUDIO_QUALITY_MOBILE
|
||||||
|
} else {
|
||||||
|
PreferenceKeys.PLAYER_AUDIO_QUALITY
|
||||||
|
}
|
||||||
|
when (PreferenceHelper.getString(prefKey, "auto")) {
|
||||||
|
"worst" -> trackSelector.updateParameters {
|
||||||
|
setMaxAudioBitrate(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun getIntentActon(context: Context): String {
|
fun getIntentActon(context: Context): String {
|
||||||
return context.packageName + "." + ACTION_MEDIA_CONTROL
|
return context.packageName + "." + ACTION_MEDIA_CONTROL
|
||||||
}
|
}
|
||||||
@ -659,7 +678,7 @@ object PlayerHelper {
|
|||||||
*
|
*
|
||||||
* Duplicate audio languages with their role flags are removed.
|
* Duplicate audio languages with their role flags are removed.
|
||||||
*
|
*
|
||||||
* @param groups the list of [Group]s of the current tracks played by the player
|
* @param groups the list of [Tracks.Group]s of the current tracks played by the player
|
||||||
* @param keepOnlySelectedTracks whether to get only the selected audio languages with their
|
* @param keepOnlySelectedTracks whether to get only the selected audio languages with their
|
||||||
* role flags among the supported ones
|
* role flags among the supported ones
|
||||||
* @return a list of distinct audio languages with their role flags from the supported formats
|
* @return a list of distinct audio languages with their role flags from the supported formats
|
||||||
@ -697,9 +716,7 @@ object PlayerHelper {
|
|||||||
* @param flag a flag to check its presence in the given bitfield
|
* @param flag a flag to check its presence in the given bitfield
|
||||||
* @return whether the given flag is set in the given bitfield
|
* @return whether the given flag is set in the given bitfield
|
||||||
*/
|
*/
|
||||||
private fun isFlagSet(bitField: Int, flag: Int): Boolean {
|
private fun isFlagSet(bitField: Int, flag: Int) = bitField and flag == flag
|
||||||
return bitField and flag == flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether the given ExoPlayer role flags contain at least one flag used for audio
|
* Check whether the given ExoPlayer role flags contain at least one flag used for audio
|
||||||
|
@ -17,6 +17,7 @@ import androidx.media3.common.MimeTypes
|
|||||||
import androidx.media3.common.PlaybackException
|
import androidx.media3.common.PlaybackException
|
||||||
import androidx.media3.common.Player
|
import androidx.media3.common.Player
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
|
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.JsonHelper
|
import com.github.libretube.api.JsonHelper
|
||||||
import com.github.libretube.api.RetrofitInstance
|
import com.github.libretube.api.RetrofitInstance
|
||||||
@ -230,11 +231,15 @@ class OnlinePlayerService : LifecycleService() {
|
|||||||
private fun initializePlayer() {
|
private fun initializePlayer() {
|
||||||
if (player != null) return
|
if (player != null) return
|
||||||
|
|
||||||
|
val trackSelector = DefaultTrackSelector(this)
|
||||||
|
PlayerHelper.applyPreferredAudioQuality(this, trackSelector)
|
||||||
|
|
||||||
player = ExoPlayer.Builder(this)
|
player = ExoPlayer.Builder(this)
|
||||||
.setUsePlatformDiagnostics(false)
|
.setUsePlatformDiagnostics(false)
|
||||||
.setHandleAudioBecomingNoisy(true)
|
.setHandleAudioBecomingNoisy(true)
|
||||||
.setAudioAttributes(PlayerHelper.getAudioAttributes(), true)
|
.setAudioAttributes(PlayerHelper.getAudioAttributes(), true)
|
||||||
.setLoadControl(PlayerHelper.getLoadControl())
|
.setLoadControl(PlayerHelper.getLoadControl())
|
||||||
|
.setTrackSelector(trackSelector)
|
||||||
.build()
|
.build()
|
||||||
.loadPlaybackParams(isBackgroundMode = true)
|
.loadPlaybackParams(isBackgroundMode = true)
|
||||||
|
|
||||||
|
@ -1360,6 +1360,8 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PlayerHelper.applyPreferredAudioQuality(requireContext(), trackSelector)
|
||||||
|
|
||||||
exoPlayer = ExoPlayer.Builder(requireContext())
|
exoPlayer = ExoPlayer.Builder(requireContext())
|
||||||
.setUsePlatformDiagnostics(false)
|
.setUsePlatformDiagnostics(false)
|
||||||
.setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory))
|
.setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory))
|
||||||
|
@ -259,12 +259,12 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="audioQuality">
|
<string-array name="audioQuality">
|
||||||
<item>@string/best_quality</item>
|
<item>@string/auto</item>
|
||||||
<item>@string/worst_quality</item>
|
<item>@string/worst_quality</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="audioQualityValues">
|
<string-array name="audioQualityValues">
|
||||||
<item>best</item>
|
<item>auto</item>
|
||||||
<item>worst</item>
|
<item>worst</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
@ -13,16 +13,14 @@
|
|||||||
app:title="@string/defres"
|
app:title="@string/defres"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
<!--
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:icon="@drawable/ic_headphones"
|
android:icon="@drawable/ic_headphones"
|
||||||
app:defaultValue="best"
|
app:defaultValue="auto"
|
||||||
app:entries="@array/audioQuality"
|
app:entries="@array/audioQuality"
|
||||||
app:entryValues="@array/audioQualityValues"
|
app:entryValues="@array/audioQualityValues"
|
||||||
app:key="player_audio_quality"
|
app:key="player_audio_quality"
|
||||||
app:title="@string/playerAudioQuality"
|
app:title="@string/playerAudioQuality"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
-->
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
@ -37,20 +35,17 @@
|
|||||||
app:title="@string/defres"
|
app:title="@string/defres"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
<!--
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:icon="@drawable/ic_headphones"
|
android:icon="@drawable/ic_headphones"
|
||||||
app:defaultValue="best"
|
app:defaultValue="auto"
|
||||||
app:entries="@array/audioQuality"
|
app:entries="@array/audioQuality"
|
||||||
app:entryValues="@array/audioQualityValues"
|
app:entryValues="@array/audioQualityValues"
|
||||||
app:key="player_audio_quality_mobile"
|
app:key="player_audio_quality_mobile"
|
||||||
app:title="@string/playerAudioQuality"
|
app:title="@string/playerAudioQuality"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
-->
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
|
||||||
<PreferenceCategory app:title="@string/quality">
|
<PreferenceCategory app:title="@string/quality">
|
||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
|
Loading…
x
Reference in New Issue
Block a user