From 355604a862e605fa580e5ef6dab4820cc951d4b2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 30 Oct 2026 21:23:54 +0100 Subject: [PATCH] Document graph measurement boundaries and improve label contrast --- doc/call_audio_graphs.txt | 60 +++++++++++++++++++++++++ tools/chatgui/src/call_audio_graphs.cpp | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 doc/call_audio_graphs.txt diff --git a/doc/call_audio_graphs.txt b/doc/call_audio_graphs.txt new file mode 100644 index 00000000..e459d756 --- /dev/null +++ b/doc/call_audio_graphs.txt @@ -0,0 +1,60 @@ +Диагностика аудио в окне звонка +============================== + +Desktop: кнопка «Графики аудио» открывает отдельное окно; закрытие не завершает звонок. +Android: значок графика в верхней строке активного звонка открывает прокручиваемую панель. +Сверху вниз: буфер приёма, очереди передачи, скорость отправки ETCP, гистограмма. +Три временных графика показывают одни и те же последние 30 секунд. +Min/Max относятся ко всем линиям соответствующего графика за показанный интервал. +Масштаб автоматический; минимальный диапазон: RX 100мс, TX 1024 байта, скорость 256 байт/с. + +Общий источник — call_history_store.h внутри call_jitter. Наблюдение не меняет +резерв, упаковку, темп, ретрансляцию или выбор маршрута. Согласованный новый +регулятор качества — отдельное изменение; текущая панель показывает существующий. + +RX +-- +Playback worker сохраняет глубину Opus+исходного PCM в DSP перед pull, текущую +цель и реально недостающие выходные сэмплы. PCM, уже переданный устройству, в RX +глубину не входит. Начальное ожидание отображается, но не считается нехваткой речи. +После старта нехватка включает повторное накопление: это наблюдение прерывания +на выходе общего аудиостека, не доказательство потери сетевых пакетов. + +Точки объединяются в 50мс интервалы; min/max внутри интервала сохраняются. +Гистограмма отдельно накапливает длительность всех PCM-блоков по их глубине, +поэтому короткий провал не заменяется средним значением интервала. Размер блока +и число pull не меняют его временной вес. Шаг столбцов 50мс, последний >=3000мс. +Вес: exp2(-возраст/10000мс); доли нормируются на взвешенную длительность PCM. +До первого PCM гистограмма пуста. Это распределение запаса, не сетевая задержка. + +TX +-- +Снимок снимает uasync в существующем 50мс таймере звонка: + синяя линия = send_q + inflight_q всех Router-каналов ядра + локальная FIFO Opus звонка; + оранжевая = сумма inflight_q этих же Router-каналов; + фиолетовая = etcp_tx_get_snapshot: ожидание + логические unacked всех ETCP-соединений. +Это глобальные суммы, включая фоновые сервисы, не только аудиопакеты собеседника. +Нижний транспорт не прибавляется к синей линии: Router хранит те же данные до ACK. +Непереданные внутренние очереди других производителей до Router сюда не входят. + +Скорость +-------- +etcp_router_get_path выбирает тот же ETCP_CONN, что отправка CALL_AUDIO. +diagnostic_wire_tx_bytes увеличивается только при принятии полного кадра packet_link. +Считаются все ETCP-кадры соединения, в том числе другие сервисы, ACK и повторы. +Обрамление BLE/TCP/UDP ниже ETCP не считается. Принятие драйвером может означать +его очередь; это не подтверждение фактического выхода в эфир или доставки пиру. +Байт/с = разность счётчиков / время за последние <=1с. Переключение peer/epoch, +падение счётчика и пробел измерений >150мс не образуют скачок скорости. + +Снимки и ресурсы +--------------- +Хранятся ограниченные кольца за 30с; отсутствие измерений не заполняется нулями. +UI получает независимую копию каждые 250мс только при открытом окне. Android +останавливает опрос также в фоне. Скрытие окна не выключает native-сбор. +Desktop после завершения звонка сохраняет последний показанный снимок. +Графики не требуют call=debug; открытие/закрытие логируется, в hot path нет аллокаций. + +Простыми словами: аудиомодуль записывает, сколько звука было в запасе и сколько +его не хватило. Сеть отдельно записывает очереди и объём отправки. Оба интерфейса +показывают одни и те же измерения, ничего не меняя в работе звонка. diff --git a/tools/chatgui/src/call_audio_graphs.cpp b/tools/chatgui/src/call_audio_graphs.cpp index 1cd57bef..4befef1f 100644 --- a/tools/chatgui/src/call_audio_graphs.cpp +++ b/tools/chatgui/src/call_audio_graphs.cpp @@ -41,7 +41,7 @@ void CallAudioGraphs::hideEvent(QHideEvent* event) { void CallAudioGraphs::paintEvent(QPaintEvent*) { QPainter p(this); p.fillRect(rect(), palette().window()); p.setRenderHint(QPainter::Antialiasing); - const QColor foreground = palette().text().color(), muted = palette().color(QPalette::Disabled, QPalette::Text); + const QColor foreground = palette().text().color(); QColor muted = foreground; muted.setAlphaF(.72); const QColor blue("#3498db"), green("#27ae60"), orange("#e67e22"), violet("#9b59b6"), red("#e74c3c"); p.setPen(foreground); p.drawText(QRectF(16, 8, width() - 32, 22), text("Audio history — last 30 seconds")); p.setPen(muted);