From 0a1c7561bdaa05de92b47353f1487b4291a89098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 5 Sep 2022 12:43:37 +0200 Subject: [PATCH] Use embedded libopus encoder for devices that somehow lack the official one --- changelog.d/7010.feature | 1 + .../room/detail/composer/AudioMessageHelper.kt | 2 +- .../features/voice/VoiceRecorderProvider.kt | 18 +++++++++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 changelog.d/7010.feature diff --git a/changelog.d/7010.feature b/changelog.d/7010.feature new file mode 100644 index 0000000000..d6c7c85b3e --- /dev/null +++ b/changelog.d/7010.feature @@ -0,0 +1 @@ +Try to detect devices that lack Opus encoder support, use bundled libopus library for those. diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt index 7d25471e51..a5e899c672 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt @@ -48,7 +48,7 @@ class AudioMessageHelper @Inject constructor( ) { private var mediaPlayer: MediaPlayer? = null private var currentPlayingId: String? = null - private var voiceRecorder: VoiceRecorder = voiceRecorderProvider.provideVoiceRecorder() + private val voiceRecorder: VoiceRecorder by lazy { voiceRecorderProvider.provideVoiceRecorder() } private val amplitudeList = mutableListOf() diff --git a/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt b/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt index 28693ca287..3441d0231a 100644 --- a/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt +++ b/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt @@ -17,6 +17,8 @@ package im.vector.app.features.voice import android.content.Context +import android.media.MediaCodecList +import android.media.MediaFormat import android.os.Build import im.vector.app.features.VectorFeatures import kotlinx.coroutines.Dispatchers @@ -27,10 +29,20 @@ class VoiceRecorderProvider @Inject constructor( private val vectorFeatures: VectorFeatures, ) { fun provideVoiceRecorder(): VoiceRecorder { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && vectorFeatures.forceUsageOfOpusEncoder().not()) { - VoiceRecorderQ(context) - } else { + return if (useFallbackRecorder()) { VoiceRecorderL(context, Dispatchers.IO) + } else { + VoiceRecorderQ(context) } } + + private fun useFallbackRecorder(): Boolean { + return Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || !hasOpusEncoder() || vectorFeatures.forceUsageOfOpusEncoder() + } + + private fun hasOpusEncoder(): Boolean { + val codecList = MediaCodecList(MediaCodecList.ALL_CODECS) + val format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_OPUS, 48000, 1) + return codecList.findEncoderForFormat(format) != null + } }