Document graph measurement boundaries and improve label contrast

This commit is contained in:
evgeny committed 2026-10-30 21:23:54 +01:00
1 parent b760cef460
commit 355604a862
2 files changed
+61 -1

No files matched your search

+60
View File
@@ -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 нет аллокаций.
Простыми словами: аудиомодуль записывает, сколько звука было в запасе и сколько
его не хватило. Сеть отдельно записывает очереди и объём отправки. Оба интерфейса
показывают одни и те же измерения, ничего не меняя в работе звонка.
+1 -1
View File
@@ -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);