Document graph measurement boundaries and improve label contrast
This commit is contained in:
1 parent
b760cef460
commit
355604a862
2 files changed
+61
-1
No files matched your search
@@ -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 нет аллокаций.
|
||||
|
||||
Простыми словами: аудиомодуль записывает, сколько звука было в запасе и сколько
|
||||
его не хватило. Сеть отдельно записывает очереди и объём отправки. Оба интерфейса
|
||||
показывают одни и те же измерения, ничего не меняя в работе звонка.
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user