Files
utun2/doc/call_audio_graphs.txt
T

96 lines
10 KiB
Plaintext

Диагностика аудио в окне звонка
==============================
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
глубину не входит. Начальное ожидание отображается, но не считается нехваткой речи.
После старта нехватка включает повторное накопление: это наблюдение прерывания
на выходе общего аудиостека, не доказательство потери сетевых пакетов.
Синяя линия — заполнение перед pull, зелёная — целевой резерв регулятора.
Оранжевая — доступный запас: фактический остаток Opus+исходного PCM в DSP после
полной выдачи запрошенного блока. При короткой выдаче и во время начального или
повторного накопления запас равен нулю: звук приостановлен, хотя заполнение может расти.
После возобновления оранжевая линия снова показывает остаток. PCM устройства сюда
не входит. Шкала RX начинается с нуля; отрицательного запаса нет. Красные точки
показывают нехватку выходного PCM после начала звука.
Точки объединяются в 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 нет аллокаций.
Сводки call/debug
----------------
При call=debug (или trace) каждые 200мс uasync пишет `audio buffers` и `audio transport`.
Это локальные записи существующих выходов логирования, не новые пакеты в канале звонка.
mono_ms связывает обе сводки, dt_ms показывает реальный интервал, включая задержку самого uasync.
audio buffers: текущие Opus/DSP/цель, required_ms — порог выдачи последнего pull,
headroom_ms — доступный остаток после него (0 при паузе), min/max запаса и заполнения за интервал, pulls, requested_ms/missing_ms
после начала звука, возраст последнего pull, темп/ожидание/догон, накопительные underruns,
сетевая вариация, decode/budget события с последней секундной CALL_STATS, глобальные очереди
Router (queued включает локальное ожидающее аудио), отдельный ETCP и скорость выбранного пути.
capture_pending/dropped и AEC over/under — дополнительные признаки локальной перегрузки.
audio transport: очередь и возраст локального Opus, пачка/обратная связь/причина ожидания,
очереди только Router-канала звонка, полный enqueue->ACK и submit->ACK RTT, возраст последнего
ACK, подтверждённые за 500мс байты, эпохи канала, кадры/пачки TX/RX и время без входящего аудио.
Также показываются накопительные повторы/дубли Router и размер его окна в пакетах.
Первая транспортная сводка — исходная точка с dt_ms=0; следующие идут не чаще раза в 200мс.
Значение -1 у скорости, возраста ACK/pull означает отсутствие измерения. При pulls=0 min/max
не определены (поля равны нулю); начальное накопление не увеличивает missing_ms.
Интервал pull считается отдельно от графиков и событий CALL_STATS; даже короткий провал
между сводками сохраняет свою длительность. Время суммы requested/missing дано в PCM при 48кГц.
Сводки выводятся после освобождения аудиомьютексов, без копирования/обхода 30с истории.
При выключенном call/debug счётчики интервала продолжают обнуляться, тяжёлые снимки не читаются.
Простыми словами: аудиомодуль записывает, сколько звука было в запасе и сколько
его не хватило. Сеть отдельно записывает очереди и объём отправки. Оба интерфейса
показывают одни и те же измерения, ничего не меняя в работе звонка.