From ad1348d9a5a84c379e802cea050684e942b2dfd8 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 9 Aug 2023 22:39:09 +0200 Subject: [PATCH] fix: Fix encoders --- app/build.gradle | 2 +- .../java/app/myzel394/alibi/db/AppSettings.kt | 57 +++++++++++++++++-- .../AudioRecorder/molecules/StartRecording.kt | 1 - .../SettingsScreen/atoms/OutputFormatTile.kt | 2 +- .../app/myzel394/alibi/ui/effects/settings.kt | 12 ++++ .../alibi/ui/screens/AudioRecorder.kt | 6 +- .../java/app/myzel394/alibi/ui/utils/file.kt | 4 -- 7 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/app/myzel394/alibi/ui/effects/settings.kt diff --git a/app/build.gradle b/app/build.gradle index 68b37e1..b146473 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,7 +106,7 @@ dependencies { annotationProcessor 'com.google.dagger:hilt-compiler:2.46.1' implementation "androidx.hilt:hilt-navigation-compose:1.0.0" - implementation 'com.arthenica:ffmpeg-kit-min:5.1' + implementation 'com.arthenica:ffmpeg-kit-min-gpl:5.1' implementation "androidx.datastore:datastore-preferences:1.0.0" diff --git a/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt b/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt index 5ce1e0a..e4e6640 100644 --- a/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt +++ b/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt @@ -143,11 +143,52 @@ data class AudioRecorderSettings( val outputFormat: Int? = null, val encoder: Int? = null, ) { - fun getOutputFormat(): Int = outputFormat ?: - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) - MediaRecorder.OutputFormat.AAC_ADTS - else - MediaRecorder.OutputFormat.THREE_GPP + fun getOutputFormat(): Int { + if (outputFormat != null) { + return outputFormat + } + + if (encoder == null) { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + MediaRecorder.OutputFormat.AAC_ADTS + else MediaRecorder.OutputFormat.THREE_GPP + } + + return when(encoder) { + MediaRecorder.AudioEncoder.AAC -> MediaRecorder.OutputFormat.AAC_ADTS + MediaRecorder.AudioEncoder.AAC_ELD -> MediaRecorder.OutputFormat.AAC_ADTS + MediaRecorder.AudioEncoder.AMR_NB -> MediaRecorder.OutputFormat.AMR_NB + MediaRecorder.AudioEncoder.AMR_WB -> MediaRecorder.OutputFormat.AMR_WB + MediaRecorder.AudioEncoder.HE_AAC -> MediaRecorder.OutputFormat.AAC_ADTS + MediaRecorder.AudioEncoder.VORBIS -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + MediaRecorder.OutputFormat.OGG + } else { + MediaRecorder.OutputFormat.AAC_ADTS + } + } + MediaRecorder.AudioEncoder.OPUS -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + MediaRecorder.OutputFormat.OGG + } else { + MediaRecorder.OutputFormat.AAC_ADTS + } + } + else -> MediaRecorder.OutputFormat.DEFAULT + } + } + + fun getMimeType(): String = when(getOutputFormat()) { + MediaRecorder.OutputFormat.AAC_ADTS -> "audio/aac" + MediaRecorder.OutputFormat.THREE_GPP -> "audio/3gpp" + MediaRecorder.OutputFormat.MPEG_4 -> "audio/mp4" + MediaRecorder.OutputFormat.MPEG_2_TS -> "audio/ts" + MediaRecorder.OutputFormat.WEBM -> "audio/webm" + MediaRecorder.OutputFormat.AMR_NB -> "audio/amr" + MediaRecorder.OutputFormat.AMR_WB -> "audio/amr-wb" + MediaRecorder.OutputFormat.OGG -> "audio/ogg" + else -> "audio/3gpp" + } fun getSamplingRate(): Int = samplingRate ?: when(getOutputFormat()) { MediaRecorder.OutputFormat.AAC_ADTS -> 96000 @@ -229,9 +270,13 @@ data class AudioRecorderSettings( } fun isEncoderCompatible(encoder: Int): Boolean { + if (outputFormat == null || outputFormat == MediaRecorder.OutputFormat.DEFAULT) { + return true + } + val supportedFormats = ENCODER_SUPPORTED_OUTPUT_FORMATS_MAP[encoder]!! - return supportedFormats.contains(getOutputFormat()) + return supportedFormats.contains(outputFormat) } companion object { diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/StartRecording.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/StartRecording.kt index 7954b2c..a040e48 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/StartRecording.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/StartRecording.kt @@ -46,7 +46,6 @@ fun StartRecording( audioRecorder: AudioRecorderModel, ) { val context = LocalContext.current - val saveFile = rememberFileSaverDialog("audio/*") Column( modifier = Modifier.fillMaxSize(), diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/OutputFormatTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/OutputFormatTile.kt index 14c390c..f5d4f8c 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/OutputFormatTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/OutputFormatTile.kt @@ -45,7 +45,7 @@ fun OutputFormatTile() { .value val availableOptions = if (settings.audioRecorderSettings.encoder == null) AudioRecorderSettings.OUTPUT_FORMAT_INDEX_TEXT_MAP.keys.toTypedArray() - else arrayOf(MediaRecorder.OutputFormat.DEFAULT, *AudioRecorderSettings.ENCODER_SUPPORTED_OUTPUT_FORMATS_MAP[settings.audioRecorderSettings.encoder]!!) + else AudioRecorderSettings.ENCODER_SUPPORTED_OUTPUT_FORMATS_MAP[settings.audioRecorderSettings.encoder]!! fun updateValue(outputFormat: Int?) { scope.launch { diff --git a/app/src/main/java/app/myzel394/alibi/ui/effects/settings.kt b/app/src/main/java/app/myzel394/alibi/ui/effects/settings.kt new file mode 100644 index 0000000..c148519 --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/effects/settings.kt @@ -0,0 +1,12 @@ +package app.myzel394.alibi.ui.effects + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.platform.LocalContext +import app.myzel394.alibi.dataStore +import app.myzel394.alibi.db.AppSettings + +@Composable +fun rememberSettings(): AppSettings { + return LocalContext.current.dataStore.data.collectAsState(initial = AppSettings.getDefaultInstance()).value +} diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AudioRecorder.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AudioRecorder.kt index 0e20792..9d856cb 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/AudioRecorder.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AudioRecorder.kt @@ -32,7 +32,10 @@ import app.myzel394.alibi.ui.components.AudioRecorder.molecules.StartRecording import app.myzel394.alibi.ui.enums.Screen import app.myzel394.alibi.ui.utils.rememberFileSaverDialog import app.myzel394.alibi.R +import app.myzel394.alibi.dataStore +import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.LastRecording +import app.myzel394.alibi.ui.effects.rememberSettings import app.myzel394.alibi.ui.models.AudioRecorderModel import kotlinx.coroutines.launch @@ -42,7 +45,8 @@ fun AudioRecorder( navController: NavController, audioRecorder: AudioRecorderModel, ) { - val saveFile = rememberFileSaverDialog("audio/aac") + val settings = rememberSettings() + val saveFile = rememberFileSaverDialog(settings.audioRecorderSettings.getMimeType()) val scope = rememberCoroutineScope() var isProcessingAudio by remember { mutableStateOf(false) } diff --git a/app/src/main/java/app/myzel394/alibi/ui/utils/file.kt b/app/src/main/java/app/myzel394/alibi/ui/utils/file.kt index 06f7bfc..8838d04 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/utils/file.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/utils/file.kt @@ -15,8 +15,6 @@ fun rememberFileSaverDialog(mimeType: String): ((File) -> Unit) { var file = remember { mutableStateOf(null) } val launcher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument(mimeType)) { - println("file") - println(file) it?.let { context.contentResolver.openOutputStream(it)?.use { outputStream -> file.value!!.inputStream().use { inputStream -> @@ -29,8 +27,6 @@ fun rememberFileSaverDialog(mimeType: String): ((File) -> Unit) { } return { - println("eich") - println(it) file.value = it launcher.launch(it.name) }