Skip to content

Commit

Permalink
feat(audio): audio channels
Browse files Browse the repository at this point in the history
  • Loading branch information
abdallahmehiz committed Aug 16, 2024
1 parent 3435978 commit 7a62eda
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 9 deletions.
12 changes: 12 additions & 0 deletions app/src/main/java/live/mehiz/mpvkt/preferences/AudioPreferences.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
package live.mehiz.mpvkt.preferences

import androidx.annotation.StringRes
import live.mehiz.mpvkt.R
import live.mehiz.mpvkt.preferences.preference.PreferenceStore
import live.mehiz.mpvkt.preferences.preference.getEnum

class AudioPreferences(preferenceStore: PreferenceStore) {
val preferredLanguages = preferenceStore.getString("audio_preferred_languages")
val defaultAudioDelay = preferenceStore.getInt("audio_delay_default")
val audioPitchCorrection = preferenceStore.getBoolean("audio_pitch_correction", true)
val audioChannels = preferenceStore.getEnum("audio_channels", AudioChannels.AutoSafe)
}

enum class AudioChannels(@StringRes val title: Int, val property: String, val value: String) {
Auto(R.string.pref_audio_channels_auto, "audio-channels", "audio-safe"),
AutoSafe(R.string.pref_audio_channels_auto_safe, "audio-channels", "auto"),
Mono(R.string.pref_audio_channels_mono, "audio-channels", "mono"),
Stereo(R.string.pref_audio_channels_stereo, "audio-channels", "stereo"),
ReverseStereo(R.string.pref_audio_channels_stereo_reversed, "af", "pan=[stereo|c0=c1|c1=c0]"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ class PlayerActivity : AppCompatActivity() {
MPVLib.setPropertyString("alang", audioPreferences.preferredLanguages.get())
MPVLib.setPropertyDouble("audio-delay", audioPreferences.defaultAudioDelay.get() / 1000.0)
MPVLib.setPropertyBoolean("audio-pitch-correction", audioPreferences.audioPitchCorrection.get())
audioPreferences.audioChannels.get().let { MPVLib.setPropertyString(it.property, it.value) }

val request = AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN).also {
it.setAudioAttributes(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.FilterChip
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
Expand All @@ -15,6 +16,8 @@ import androidx.compose.ui.unit.dp
import `is`.xyz.mpv.MPVLib
import live.mehiz.mpvkt.R
import live.mehiz.mpvkt.preferences.AdvancedPreferences
import live.mehiz.mpvkt.preferences.AudioChannels
import live.mehiz.mpvkt.preferences.AudioPreferences
import live.mehiz.mpvkt.preferences.preference.collectAsState
import live.mehiz.mpvkt.presentation.components.PlayerSheet
import org.koin.compose.koinInject
Expand All @@ -25,6 +28,7 @@ fun MoreSheet(
modifier: Modifier = Modifier
) {
val advancedPreferences = koinInject<AdvancedPreferences>()
val audioPreferences = koinInject<AudioPreferences>()
val statisticsPage by advancedPreferences.enabledStatisticsPage.collectAsState()
PlayerSheet(
onDismissRequest,
Expand All @@ -34,6 +38,7 @@ fun MoreSheet(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
Text(stringResource(R.string.player_sheets_stats_page_title))
LazyRow(
Expand All @@ -44,11 +49,7 @@ fun MoreSheet(
label = {
Text(
stringResource(
if (page == 0) {
R.string.player_sheets_tracks_off
} else {
R.string.player_sheets_stats_page_chip
},
if (page == 0) R.string.player_sheets_tracks_off else R.string.player_sheets_stats_page_chip,
page,
),
)
Expand All @@ -66,6 +67,27 @@ fun MoreSheet(
)
}
}
Text(text = stringResource(id = R.string.pref_audio_channels))
val audioChannels by audioPreferences.audioChannels.collectAsState()
LazyRow(
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(AudioChannels.entries) {
FilterChip(
selected = audioChannels == it,
onClick = {
audioPreferences.audioChannels.set(it)
if (it == AudioChannels.ReverseStereo) {
MPVLib.setPropertyString(AudioChannels.AutoSafe.property, AudioChannels.AutoSafe.value)
} else {
MPVLib.setPropertyString(AudioChannels.ReverseStereo.property, "")
}
MPVLib.setPropertyString(it.property, it.value)
},
label = { Text(text = stringResource(id = it.title)) },
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import live.mehiz.mpvkt.R
import live.mehiz.mpvkt.preferences.AppearancePreferences
Expand Down Expand Up @@ -64,7 +65,7 @@ object AppearancePreferencesScreen : Screen() {
val darkMode by preferences.darkMode.collectAsState()
MultiChoiceSegmentedButton(
choices = DarkMode.entries.map { context.getString(it.titleRes) }.toImmutableList(),
selectedIndices = listOf(DarkMode.entries.indexOf(darkMode)).toImmutableList(),
selectedIndices = persistentListOf(DarkMode.entries.indexOf(darkMode)),
onClick = { preferences.darkMode.set(DarkMode.entries[it]) }
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,20 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import live.mehiz.mpvkt.R
import live.mehiz.mpvkt.preferences.AudioChannels
import live.mehiz.mpvkt.preferences.AudioPreferences
import live.mehiz.mpvkt.preferences.preference.collectAsState
import live.mehiz.mpvkt.presentation.Screen
import me.zhanghai.compose.preference.ProvidePreferenceLocals
import me.zhanghai.compose.preference.listPreference
import me.zhanghai.compose.preference.switchPreference
import me.zhanghai.compose.preference.textFieldPreference
import org.koin.compose.koinInject
Expand All @@ -31,8 +37,11 @@ object AudioPreferencesScreen : Screen() {
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val context = LocalContext.current
val navigator = LocalNavigator.currentOrThrow
val preferences = koinInject<AudioPreferences>()
val audioChannels by preferences.audioChannels.collectAsState()

Scaffold(
topBar = {
TopAppBar(
Expand All @@ -43,15 +52,15 @@ object AudioPreferencesScreen : Screen() {
IconButton(onClick = { navigator.pop() }) {
Icon(Icons.AutoMirrored.Default.ArrowBack, null)
}
}
},
)
},
) { padding ->
ProvidePreferenceLocals {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(padding)
.padding(padding),
) {
textFieldPreference(
preferences.preferredLanguages.key(),
Expand All @@ -65,7 +74,7 @@ object AudioPreferencesScreen : Screen() {
TextField(
value,
onValueChange,
modifier = Modifier.fillMaxWidth()
modifier = Modifier.fillMaxWidth(),
)
}
},
Expand All @@ -76,6 +85,14 @@ object AudioPreferencesScreen : Screen() {
title = { Text(stringResource(R.string.pref_audio_pitch_correction_title)) },
summary = { Text(stringResource(R.string.pref_audio_pitch_correction_summary)) },
)
listPreference(
preferences.audioChannels.key(),
defaultValue = preferences.audioChannels.defaultValue().name,
values = AudioChannels.entries.map { it.name },
valueToText = { AnnotatedString(context.getString(enumValueOf<AudioChannels>(it).title)) },
title = { Text(text = stringResource(id = R.string.pref_audio_channels)) },
summary = { Text(text = context.getString(enumValueOf<AudioChannels>(it).title)) },
)
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@
<string name="pref_audio">Audio</string>
<string name="pref_audio_pitch_correction_title">Enable audio pitch correction</string>
<string name="pref_audio_pitch_correction_summary">Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds.</string>
<string name="pref_audio_channels">Audio channels</string>
<string name="pref_audio_channels_auto">Auto</string>
<string name="pref_audio_channels_auto_safe">Auto Safe</string>
<string name="pref_audio_channels_mono">Mono</string>
<string name="pref_audio_channels_stereo">Stereo</string>
<string name="pref_audio_channels_stereo_reversed">Reversed Stereo</string>

<string name="pref_advanced">Advanced</string>
<string name="pref_advanced_mpv_conf_storage_location">pick mpv configuration storage location</string>
Expand Down

0 comments on commit 7a62eda

Please sign in to comment.