diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamController.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamController.kt
index 86aa465d..c7cff060 100644
--- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamController.kt
+++ b/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
diff --git a/tools/chatgui-android/app/src/main/res/values-ru/strings.xml b/tools/chatgui-android/app/src/main/res/values-ru/strings.xml
index c8d0f849..d91efc3e 100644
--- a/tools/chatgui-android/app/src/main/res/values-ru/strings.xml
+++ b/tools/chatgui-android/app/src/main/res/values-ru/strings.xml
@@ -23,6 +23,7 @@
Канал закрыт
Начать трансляцию
Остановить трансляцию
+ Звук трансляции
Прямая трансляция
Подключение…
Завершение трансляции…
diff --git a/tools/chatgui-android/app/src/main/res/values/strings.xml b/tools/chatgui-android/app/src/main/res/values/strings.xml
index 0e6139ba..6ec1110d 100644
--- a/tools/chatgui-android/app/src/main/res/values/strings.xml
+++ b/tools/chatgui-android/app/src/main/res/values/strings.xml
@@ -23,6 +23,7 @@
The channel is closed
Start stream
Stop stream
+ Stream audio
Streaming live
Connecting…
Finishing stream…