|
|
|
|
@ -44,6 +44,7 @@ class StreamCaptureEngine(
|
|
|
|
|
private var audioCapture: MicrophoneCapture.Subscription? = null |
|
|
|
|
private var audioThread: Thread? = null |
|
|
|
|
@Volatile private var audioRunning = false |
|
|
|
|
@Volatile private var audioMuted = false |
|
|
|
|
@Volatile var audioCompressorSettings = initialAudioCompressor |
|
|
|
|
@Volatile private var stopped = false |
|
|
|
|
private var stopping = false |
|
|
|
|
@ -434,6 +435,21 @@ class StreamCaptureEngine(
|
|
|
|
|
LogManager.addLog("DEBUG", "video", "video resources released id=$id closed=$closed revision=$generation") |
|
|
|
|
done(closed) |
|
|
|
|
} |
|
|
|
|
/** Меняем только свою копию PCM; общий микрофон и рация продолжают работать. */ |
|
|
|
|
fun setAudioEnabled(enabled: Boolean): Boolean { |
|
|
|
|
if (!microphone || !audioRunning) { |
|
|
|
|
LogManager.addLog("WARN", "stream", "audio change without capture id=$id enabled=$enabled"); return false |
|
|
|
|
} |
|
|
|
|
val previous = audioMuted |
|
|
|
|
audioMuted = !enabled |
|
|
|
|
if (!NativeLib.streamSetAudioEnabled(id, enabled)) { |
|
|
|
|
audioMuted = previous |
|
|
|
|
LogManager.addLog("ERROR", "stream", "audio change refused id=$id enabled=$enabled"); return false |
|
|
|
|
} |
|
|
|
|
LogManager.addLog("INFO", "stream", "source audio id=$id enabled=$enabled") |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@SuppressLint("MissingPermission") |
|
|
|
|
private fun startAudio() { |
|
|
|
|
val radio = RadioAudioEngine.instance() |
|
|
|
|
@ -464,6 +480,7 @@ class StreamCaptureEngine(
|
|
|
|
|
expected = frame.sequence + 960 |
|
|
|
|
val pts = (frame.timeNs - originNs) / 1000 |
|
|
|
|
check(pts >= 0 && pts > last) { "Audio timestamp discontinuity pts=$pts last=$last" }; last = pts |
|
|
|
|
if (audioMuted) frame.pcm.fill(0) |
|
|
|
|
val packet = NativeLib.streamOpusEncode(opus, frame.pcm, audioCompressorSettings) ?: error("Stream compressor/Opus encode failed") |
|
|
|
|
check(NativeLib.streamFeed(id, false, pts, false, packet) >= 0) { "Stream audio publisher detached" } |
|
|
|
|
} |
|
|
|
|
|