feat: Add PoC for sources for AudioRecorderService

This commit is contained in:
Myzel394 2023-10-21 17:18:57 +02:00
parent fc643040c6
commit 862de21436
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B

View File

@ -1,12 +1,19 @@
package app.myzel394.alibi.services package app.myzel394.alibi.services
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.media.AudioDeviceInfo
import android.media.AudioManager
import android.media.MediaRecorder import android.media.MediaRecorder
import android.media.MediaRecorder.OnErrorListener import android.media.MediaRecorder.OnErrorListener
import android.media.MediaRecorder.getAudioSourceMax
import android.os.Build import android.os.Build
import java.lang.IllegalStateException import java.lang.IllegalStateException
class AudioRecorderService: IntervalRecorderService() { class AudioRecorderService: IntervalRecorderService() {
var amplitudesAmount = 1000 var amplitudesAmount = 1000
var selectedDevice: AudioDeviceInfo? = null
var recorder: MediaRecorder? = null var recorder: MediaRecorder? = null
private set private set
@ -15,12 +22,39 @@ class AudioRecorderService: IntervalRecorderService() {
val filePath: String val filePath: String
get() = "$folder/$counter.${settings!!.fileExtension}" get() = "$folder/$counter.${settings!!.fileExtension}"
private fun _setAudioDevice() {
val audioManger = getSystemService(AUDIO_SERVICE)!! as AudioManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (selectedDevice == null) {
audioManger.clearCommunicationDevice()
} else {
audioManger.setCommunicationDevice(selectedDevice!!)
}
} else {
if (selectedDevice == null) {
audioManger.stopBluetoothSco()
} else {
audioManger.startBluetoothSco()
}
}
}
private fun createRecorder(): MediaRecorder { private fun createRecorder(): MediaRecorder {
_setAudioDevice()
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
MediaRecorder(this) MediaRecorder(this)
} else { } else {
MediaRecorder() MediaRecorder()
}.apply { }.apply {
// Audio Source is kinda strange, here are my experimental findings using a Pixel 7 Pro
// and Redmi Buds 3 Pro:
// - MIC: Uses the bottom microphone of the phone (17)
// - CAMCORDER: Uses the top microphone of the phone (2)
// - VOICE_COMMUNICATION: Uses the bottom microphone of the phone (17)
// - DEFAULT: Uses the bottom microphone of the phone (17)
setAudioSource(MediaRecorder.AudioSource.MIC) setAudioSource(MediaRecorder.AudioSource.MIC)
setOutputFile(filePath) setOutputFile(filePath)
setOutputFormat(settings!!.outputFormat) setOutputFormat(settings!!.outputFormat)
@ -82,4 +116,30 @@ class AudioRecorderService: IntervalRecorderService() {
0 0
} }
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent?.action == "changeAudioDevice") {
selectedDevice = intent.getStringExtra("deviceID")!!.let {
if (it == "null") {
null
} else {
val audioManager = getSystemService(AUDIO_SERVICE)!! as AudioManager
audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS).find { device ->
device.id == it.toInt()
}
}
}
}
return super.onStartCommand(intent, flags, startId)
}
companion object {
fun changeAudioDevice(deviceID: String?, context: Context) {
val intent = Intent("changeAudioDevice").apply {
putExtra("deviceID", deviceID ?: "null")
}
context.startService(intent)
}
}
} }