Browse Source

Track Android stream audio state independently of microphone ownership

master
evgeny 3 days ago
parent
commit
e3fb8377ab
  1. 17
      tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamController.kt
  2. 1
      tools/chatgui-android/app/src/main/res/values-ru/strings.xml
  3. 1
      tools/chatgui-android/app/src/main/res/values/strings.xml

17
tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamController.kt

@ -13,7 +13,8 @@ import java.util.concurrent.atomic.AtomicLong
enum class StreamPhase { STARTING, LIVE, STOPPING, ENDED, FAILED }
data class StreamState(val id: Long, val group: Long, val phase: StreamPhase, val error: Int? = null,
val config: StreamCaptureConfig? = null, val pendingConfig: StreamCaptureConfig? = null, val notice: Int? = null, val preview: StreamPreview = StreamPreview()) {
val config: StreamCaptureConfig? = null, val pendingConfig: StreamCaptureConfig? = null, val notice: Int? = null,
val preview: StreamPreview = StreamPreview(), val audioAvailable: Boolean = false, val audioEnabled: Boolean = false) {
val ongoing get() = phase == StreamPhase.STARTING || phase == StreamPhase.LIVE || phase == StreamPhase.STOPPING
}
@ -43,7 +44,8 @@ object StreamController {
LogManager.addLog("WARN", "stream", "start rejected: core/call/voice busy group=$group")
mutable.value = StreamState(id, group, StreamPhase.FAILED, R.string.stream_resources_busy); return
}
capturing = true; mutable.value = StreamState(id, group, StreamPhase.STARTING, pendingConfig = config)
capturing = true
mutable.value = StreamState(id, group, StreamPhase.STARTING, pendingConfig = config, audioAvailable = audio, audioEnabled = audio)
mutableTx.value = null
try {
ContextCompat.startForegroundService(ChatApplication.instance, Intent(ChatApplication.instance, StreamService::class.java)
@ -66,6 +68,17 @@ object StreamController {
owner.change(config)
}
fun setAudioEnabled(enabled: Boolean) {
check(Looper.myLooper() == Looper.getMainLooper())
val st = mutable.value ?: return
if (st.phase != StreamPhase.LIVE || !st.audioAvailable || service == null) {
LogManager.addLog("WARN", "stream", "audio control unavailable id=${st.id} phase=${st.phase}"); return
}
if (st.audioEnabled == enabled) return
if (service!!.setAudioEnabled(enabled)) mutable.value = st.copy(audioEnabled = enabled)
else failed(st.id, "audio control failed enabled=$enabled")
}
fun captureReady(id: Long, config: StreamCaptureConfig, restored: Boolean) {
main.post {
val st = mutable.value ?: return@post

1
tools/chatgui-android/app/src/main/res/values-ru/strings.xml

@ -23,6 +23,7 @@
<string name="stream_group_closed">Канал закрыт</string>
<string name="stream_start">Начать трансляцию</string>
<string name="stream_stop">Остановить трансляцию</string>
<string name="stream_audio">Звук трансляции</string>
<string name="stream_live">Прямая трансляция</string>
<string name="stream_connecting">Подключение…</string>
<string name="stream_stopping">Завершение трансляции…</string>

1
tools/chatgui-android/app/src/main/res/values/strings.xml

@ -23,6 +23,7 @@
<string name="stream_group_closed">The channel is closed</string>
<string name="stream_start">Start stream</string>
<string name="stream_stop">Stop stream</string>
<string name="stream_audio">Stream audio</string>
<string name="stream_live">Streaming live</string>
<string name="stream_connecting">Connecting…</string>
<string name="stream_stopping">Finishing stream…</string>

Loading…
Cancel
Save