чат с агентомспроситьAI и агенты7 файловИнфраструктура4 файлаРазработка6 файловОбо мне5 файлов
Микрофон опубликован, а звука нет - как я искал честный критерий
  • WebRTC
  • устройства
  • диагностика
  • UX

Микрофон опубликован, а звука нет - как я искал честный критерий

В продукте есть монитор здоровья устройств: он должен понимать, работает ли микрофон и камера, и подсказывать пользователю, когда что-то отвалилось. Три задачи подряд пришли не из бэклога, а из жалоб живых людей.

Микрофон, который «работает», но молчит

Пользователь менял микрофон во время звонка, ловил переподключение и оставался без звука. Собеседники не слышали, а интерфейс показывал, что всё в порядке.

Монитор считал переиздание дорожки успешным по самому факту публикации: дорожка опубликована, значит звук идёт. На деле опубликовать можно и мёртвую дорожку. Первым кандидатом на честный критерий был уровень сигнала, но он не годится: когда человек молчит, уровень равен нулю, и живой микрофон неотличим от сломанного.

Рабочий признак нашёлся в статистике соединения: растёт число отправленных байт - звук уходит. Молчание байты не обнуляет, потому что кодек продолжает слать пакеты. Критерий простой и не врёт ни в тишине, ни при смене устройства.

Отдельно вскрылось, что смену устройства вообще легко пропустить. Библиотека при автоматическом переключении подменяет дорожку внутри существующей публикации и не шлёт события переиздания. Любой монитор, слушающий только их, такое переключение не увидит.

Камера, которая заперла кнопку

Второй случай: пользователь выдёргивал камеру на ходу, она уходила в состояние «потеряна», и кнопка включения запиралась до конца звонка. Даже когда камеру возвращали в порт, вернуться было нечем.

Здесь была склеена индикация и блокировка. Разделил: запираем кнопку только когда устройство реально занято другим приложением, а при потере оставляем кликабельной и показываем предупреждение. Возврат в рабочее состояние - через переоценку свежей дорожки, а не по флагу, выставленному в момент аварии.

Приложение, которое каждый раз забывало выбор

Третья жалоба пришла от людей со стрим-софтом: приложение при каждом входе брало системный микрофон по умолчанию, а не тот, что человек выбрал в прошлый раз. Причина оказалась одной строкой - у стора настроек не было сохранения между сессиями, и выбранные устройства обнулялись при каждой загрузке.

Добавил сохранение с приоритетом ручного выбора над системным дефолтом. Побочный эффект аккуратный: если сохранённого устройства в системе больше нет, приложение молча падает обратно на системное, а не показывает ошибку.

Что общего у трёх багов

Все три жили в коде месяцами и не ловились тестами, потому что каждый из них - про расхождение между «состояние выставлено» и «оно соответствует реальности». Такое видно только на живом железе: выдернуть камеру, закрыть ноутбук, подключить виртуальный микрофон.