Tune skip silence feature for music
This commit is contained in:
@@ -30,10 +30,17 @@ import androidx.media3.datasource.cache.Cache
|
|||||||
import androidx.media3.datasource.cache.CacheDataSource
|
import androidx.media3.datasource.cache.CacheDataSource
|
||||||
import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor
|
import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor
|
||||||
import androidx.media3.datasource.cache.SimpleCache
|
import androidx.media3.datasource.cache.SimpleCache
|
||||||
|
import androidx.media3.exoplayer.DefaultRenderersFactory
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
|
import androidx.media3.exoplayer.RenderersFactory
|
||||||
import androidx.media3.exoplayer.analytics.AnalyticsListener
|
import androidx.media3.exoplayer.analytics.AnalyticsListener
|
||||||
import androidx.media3.exoplayer.analytics.PlaybackStats
|
import androidx.media3.exoplayer.analytics.PlaybackStats
|
||||||
import androidx.media3.exoplayer.analytics.PlaybackStatsListener
|
import androidx.media3.exoplayer.analytics.PlaybackStatsListener
|
||||||
|
import androidx.media3.exoplayer.audio.AudioSink
|
||||||
|
import androidx.media3.exoplayer.audio.DefaultAudioSink
|
||||||
|
import androidx.media3.exoplayer.audio.DefaultAudioSink.DefaultAudioProcessorChain
|
||||||
|
import androidx.media3.exoplayer.audio.SilenceSkippingAudioProcessor
|
||||||
|
import androidx.media3.exoplayer.audio.SonicAudioProcessor
|
||||||
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
||||||
import it.vfsfitvnm.vimusic.Database
|
import it.vfsfitvnm.vimusic.Database
|
||||||
import it.vfsfitvnm.vimusic.MainActivity
|
import it.vfsfitvnm.vimusic.MainActivity
|
||||||
@@ -131,6 +138,7 @@ class PlayerService : Service(), Player.Listener, PlaybackStatsListener.Callback
|
|||||||
.build(),
|
.build(),
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
|
.setRenderersFactory(createRendersFactory())
|
||||||
.setUsePlatformDiagnostics(false)
|
.setUsePlatformDiagnostics(false)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
@@ -266,8 +274,14 @@ class PlayerService : Service(), Player.Listener, PlaybackStatsListener.Callback
|
|||||||
if (playbackState == Player.STATE_READY) {
|
if (playbackState == Player.STATE_READY) {
|
||||||
if (player.duration != C.TIME_UNSET) {
|
if (player.duration != C.TIME_UNSET) {
|
||||||
metadataBuilder
|
metadataBuilder
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_TITLE, player.currentMediaItem?.mediaMetadata?.title)
|
.putText(
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_ARTIST, player.currentMediaItem?.mediaMetadata?.artist)
|
MediaMetadataCompat.METADATA_KEY_TITLE,
|
||||||
|
player.currentMediaItem?.mediaMetadata?.title
|
||||||
|
)
|
||||||
|
.putText(
|
||||||
|
MediaMetadataCompat.METADATA_KEY_ARTIST,
|
||||||
|
player.currentMediaItem?.mediaMetadata?.artist
|
||||||
|
)
|
||||||
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, player.duration)
|
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, player.duration)
|
||||||
mediaSession.setMetadata(metadataBuilder.build())
|
mediaSession.setMetadata(metadataBuilder.build())
|
||||||
}
|
}
|
||||||
@@ -328,7 +342,8 @@ class PlayerService : Service(), Player.Listener, PlaybackStatsListener.Callback
|
|||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.setShowWhen(false)
|
.setShowWhen(false)
|
||||||
.setSmallIcon(player.playerError?.let { R.drawable.alert_circle } ?: R.drawable.app_icon)
|
.setSmallIcon(player.playerError?.let { R.drawable.alert_circle }
|
||||||
|
?: R.drawable.app_icon)
|
||||||
.setOngoing(false)
|
.setOngoing(false)
|
||||||
.setContentIntent(activityPendingIntent<MainActivity>())
|
.setContentIntent(activityPendingIntent<MainActivity>())
|
||||||
.setDeleteIntent(broadCastPendingIntent<StopServiceBroadcastReceiver>())
|
.setDeleteIntent(broadCastPendingIntent<StopServiceBroadcastReceiver>())
|
||||||
@@ -484,6 +499,36 @@ class PlayerService : Service(), Player.Listener, PlaybackStatsListener.Callback
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createRendersFactory(): RenderersFactory {
|
||||||
|
return object : DefaultRenderersFactory(this) {
|
||||||
|
override fun buildAudioSink(
|
||||||
|
context: Context,
|
||||||
|
enableFloatOutput: Boolean,
|
||||||
|
enableAudioTrackPlaybackParams: Boolean,
|
||||||
|
enableOffload: Boolean
|
||||||
|
): AudioSink {
|
||||||
|
return DefaultAudioSink.Builder()
|
||||||
|
.setEnableFloatOutput(enableFloatOutput)
|
||||||
|
.setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
|
||||||
|
.setOffloadMode(
|
||||||
|
if (enableOffload) {
|
||||||
|
DefaultAudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
|
||||||
|
} else {
|
||||||
|
DefaultAudioSink.OFFLOAD_MODE_DISABLED
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.setAudioProcessorChain(
|
||||||
|
DefaultAudioProcessorChain(
|
||||||
|
emptyArray(),
|
||||||
|
SilenceSkippingAudioProcessor(1_000_000, 20_000, 256),
|
||||||
|
SonicAudioProcessor()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inner class Binder : android.os.Binder() {
|
inner class Binder : android.os.Binder() {
|
||||||
val player: ExoPlayer
|
val player: ExoPlayer
|
||||||
get() = this@PlayerService.player
|
get() = this@PlayerService.player
|
||||||
@@ -522,10 +567,10 @@ class PlayerService : Service(), Player.Listener, PlaybackStatsListener.Callback
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setupRadio(endpoint: NavigationEndpoint.Endpoint.Watch?) =
|
fun setupRadio(endpoint: NavigationEndpoint.Endpoint.Watch?) =
|
||||||
startRadio(endpoint= endpoint, justAdd = true)
|
startRadio(endpoint = endpoint, justAdd = true)
|
||||||
|
|
||||||
fun playRadio(endpoint: NavigationEndpoint.Endpoint.Watch?) =
|
fun playRadio(endpoint: NavigationEndpoint.Endpoint.Watch?) =
|
||||||
startRadio(endpoint= endpoint, justAdd = false)
|
startRadio(endpoint = endpoint, justAdd = false)
|
||||||
|
|
||||||
private fun startRadio(endpoint: NavigationEndpoint.Endpoint.Watch?, justAdd: Boolean) {
|
private fun startRadio(endpoint: NavigationEndpoint.Endpoint.Watch?, justAdd: Boolean) {
|
||||||
radioJob?.cancel()
|
radioJob?.cancel()
|
||||||
@@ -575,3 +620,4 @@ class PlayerService : Service(), Player.Listener, PlaybackStatsListener.Callback
|
|||||||
private const val SleepTimerNotificationChannelId = "sleep_timer_channel_id"
|
private const val SleepTimerNotificationChannelId = "sleep_timer_channel_id"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user