srctree

Robin Linden parent 88ca2101 733d4d87
Tell Android to handle call audio as VoIP audio

inlinesplit
WORKSPACE added: 25, removed: 6, total 19
@@ -133,6 +133,7 @@ load("@rules_jvm_external//:defs.bzl", "maven_install")
 
maven_install(
artifacts = [
"androidx.core:core-ktx:1.5.0",
"androidx.room:room-compiler:2.2.6",
"androidx.room:room-ktx:2.2.6",
"androidx.room:room-runtime:2.2.6",
 
atox/src/main/AndroidManifest.xml added: 25, removed: 6, total 19
@@ -4,6 +4,7 @@
android:installLocation="auto">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
 
domain/BUILD.bazel added: 25, removed: 6, total 19
@@ -28,6 +28,7 @@ kt_android_library(
deps = [
":tox4j",
"//core",
"@maven//:androidx_core_core_ktx",
],
)
 
 
domain/build.gradle.kts added: 25, removed: 6, total 19
@@ -100,6 +100,7 @@ tasks.named("preBuild") { dependsOn("fixPaths") }
dependencies {
implementation(project(":core"))
 
implementation(AndroidX.Core.ktx)
implementation(JavaX.inject)
implementation(KotlinX.Coroutines.core)
api(Tox4j.api)
 
domain/src/main/kotlin/av/AudioPlayer.kt added: 25, removed: 6, total 19
@@ -1,5 +1,6 @@
package ltd.evilcorp.domain.av
 
import android.media.AudioAttributes
import android.media.AudioFormat
import android.media.AudioManager
import android.media.AudioTrack
@@ -32,6 +33,11 @@ class AudioPlayer(sampleRate: Int, channels: Int) {
.setChannelMask(intToChannel(channels))
.build()
)
.setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.build()
)
.setBufferSizeInBytes(minBufferSize)
.build()
}
 
domain/src/main/kotlin/feature/CallManager.kt added: 25, removed: 6, total 19
@@ -1,6 +1,9 @@
package ltd.evilcorp.domain.feature
 
import android.content.Context
import android.media.AudioManager
import android.util.Log
import androidx.core.content.ContextCompat
import im.tox.tox4j.av.exceptions.ToxavCallControlException
import javax.inject.Inject
import javax.inject.Singleton
@@ -24,6 +27,7 @@ private const val TAG = "CallManager"
@Singleton
class CallManager @Inject constructor(
private val tox: Tox,
context: Context,
) : CoroutineScope by GlobalScope {
private val _inCall = MutableStateFlow<CallState>(CallState.NotInCall)
val inCall: StateFlow<CallState> get() = _inCall
@@ -31,17 +35,22 @@ class CallManager @Inject constructor(
private val _sendingAudio = MutableStateFlow(false)
val sendingAudio: StateFlow<Boolean> get() = _sendingAudio
 
private val audioManager = ContextCompat.getSystemService(context, AudioManager::class.java)
 
fun startCall(publicKey: PublicKey) {
tox.startCall(publicKey)
_inCall.value = CallState.InCall(publicKey)
audioManager?.mode = AudioManager.MODE_IN_COMMUNICATION
}
 
fun answerCall(publicKey: PublicKey) {
tox.answerCall(publicKey)
_inCall.value = CallState.InCall(publicKey)
audioManager?.mode = AudioManager.MODE_IN_COMMUNICATION
}
 
fun endCall(publicKey: PublicKey) {
audioManager?.mode = AudioManager.MODE_NORMAL
_inCall.value = CallState.NotInCall
try {
tox.endCall(publicKey)