|
|
|
|
@ -126,6 +126,7 @@ class RadioAudioEngine {
|
|
|
|
|
active = false |
|
|
|
|
releaseLocked(false) |
|
|
|
|
active = true |
|
|
|
|
router.setAutoHeadset(true) /* дефолт «авто» только на свежий старт/смену группы */ |
|
|
|
|
setupAudio() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -157,7 +158,6 @@ class RadioAudioEngine {
|
|
|
|
|
|
|
|
|
|
/* Маршрут выхода: автоследование за гарнитурой (воткнули → HEADSET, вынули → SPEAKER). */ |
|
|
|
|
router.fallbackRoute = AudioRoute.SPEAKER |
|
|
|
|
router.setAutoHeadset(true) |
|
|
|
|
router.start() |
|
|
|
|
|
|
|
|
|
// ── AudioRecord (захват) с откатом стерео→моно ── |
|
|
|
|
@ -382,6 +382,7 @@ class RadioAudioEngine {
|
|
|
|
|
val ch = captureChannels |
|
|
|
|
val frame = FRAME_SAMPLES * ch |
|
|
|
|
val buf = ShortArray(frame) |
|
|
|
|
var frameN = 0L |
|
|
|
|
while (active) { |
|
|
|
|
val rec = audioRecord ?: break |
|
|
|
|
if (rec.recordingState != AudioRecord.RECORDSTATE_RECORDING) { |
|
|
|
|
@ -404,6 +405,12 @@ class RadioAudioEngine {
|
|
|
|
|
} |
|
|
|
|
read += n |
|
|
|
|
} |
|
|
|
|
/* диагностика крос-девайс входа/выхода: куда реально роутится захват + уровень сигнала */ |
|
|
|
|
if (frameN < 10 || frameN % 100L == 0L) { |
|
|
|
|
LogManager.addLog("DEBUG", "RadioAudio", |
|
|
|
|
"cap routed=${rec.routedDevice?.type ?: "-"} frame=$frameN rmsDb=${rmsDb(buf)} input=${inputSource()} route=${route()}") |
|
|
|
|
} |
|
|
|
|
frameN++ |
|
|
|
|
if ((talking || vadMode) && !NativeLib.radioAudioFeed(groupId, buf)) { |
|
|
|
|
LogManager.addLog("WARN", "RadioAudio", "radioAudioFeed returned false") |
|
|
|
|
} |
|
|
|
|
@ -411,6 +418,14 @@ class RadioAudioEngine {
|
|
|
|
|
LogManager.addLog("DEBUG", "RadioAudio", "capture loop done") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** RMS захваченного кадра в dBFS (0 = полная шкала; тишина ~ -90). */ |
|
|
|
|
private fun rmsDb(buf: ShortArray): Int { |
|
|
|
|
var sum = 0L |
|
|
|
|
for (s in buf) sum += s.toLong() * s.toLong() |
|
|
|
|
val rms = Math.sqrt(sum.toDouble() / buf.size) |
|
|
|
|
return if (rms < 1.0) -120 else (20.0 * Math.log10(rms / 32768.0)).toInt() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun playLoop() { |
|
|
|
|
val frame = FRAME_SAMPLES * PLAY_CHANNELS |
|
|
|
|
val buf = ShortArray(frame) |
|
|
|
|
|