Skip to content

Телефон: выключение звука отдельного ПК или всех ПК одной кнопкой - #2

Merged
Lyten02 merged 3 commits into
mainfrom
feat/phone-mute
Oct 6, 2026
Merged

Lyten02 merged 3 commits into
mainfrom
feat/phone-mute

Conversation

@Lyten02

@Lyten02 Lyten02 commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

Closes #1

Что сделано

На телефоне звук компьютеров теперь можно выключать, не закрывая приложение:

  • Кнопка у каждого ПК (иконка динамика на карточке) — выключает/включает звук только этого компьютера; на карточке появляется чип «Звук выключен на телефоне».
  • Кнопка «Выключить звук» / «Включить звук» в уведомлении — выключает все ПК сразу, не открывая приложение.
  • Одна кнопка в общей сводке — «Выключить звук всех ПК» / «Включить звук всех ПК» (при одном ПК — «Выключить звук» / «Включить звук»). Если выключено всё, сводка пишет «Звук с ПК выключен на телефоне».
  • Состояние сохраняется для каждого ПК (muted в paired_pcs) и переживает перезапуск приложения/телефона и повторное сканирование QR.

Как устроено

  • core: Hub::set_muted(ids). Заглушённый ПК остаётся подключён (микрофон работает) и продолжает слать звук, но его пакеты не ставятся в очередь плейаута: в очередь кладётся один маркер тишины, а Mixer::fill уводит его громкость в ноль линейной рампой 10 мс, без щелчков. При включении звука поток этого ПК начинается заново (RxFeeder::reset), поэтому накопленный звук никогда не проигрывается повторно. В real-time пути нет ни аллокаций, ни блокировок.
  • HubStatus::pc_audio_active не учитывает заглушённые ПК. Поэтому, если звук всех играющих ПК выключен, аудиовыход телефона закрывается через 30 с простоя, а сервис отпускает Wi-Fi/CPU wake lock. Pace-пакеты заглушённому ПК не отправляются.
  • Всё происходит только на телефоне, протокол не меняется: работает с любой версией приложения на ПК.
  • android-native / Kotlin: новый JNI NativeBridge.setMuted(idsJson), Cmd::SetMuted. Engine повторно применяет список при перезапуске hub, BridgeService передаёт mute раньше setPeers, поэтому только что добавленный заглушённый ПК не успевает заиграть.

Проверка

  • cargo clippy (core, desktop, android host и cargo ndk -t arm64-v8a): -D warnings, чисто.
  • cargo test -p audiobridge-core -p audiobridge-android: всё зелёное, включая все 7 integration-тестов.
  • Новый integration-тест muted_pc_stays_connected_but_is_left_out_of_the_mix (два ПК, 1000 и 1500 Гц):
    • B выключен: 1000 Гц = 0.400, 1500 Гц = 0.003;
    • выключены оба: rms = 0.00000, оба ПК при этом подключены, pc_audio_active = false;
    • после включения: 1500 Гц = 0.394.
  • gradlew :app:testDebugUnitTest :app:lintDebug :app:assembleDebug: успешно. Lint: 0 ошибок, новых предупреждений нет. Новые JVM-тесты в PairedPcTest: сохранение muted и mutedIdsJson.
  • Регрессионный тест unmuting_after_the_output_was_closed_plays_fresh_audio. Проблему нашли на POCO F5: если включить звук после того, как аудиовыход телефона был закрыт, проигрывалась накопленная очередь — в логах lost=177 buffer=612ms. Тест воспроизводил это до исправления (задержка 548 мс, lost=200, buffer 559 мс), после исправления: задержка 34 мс, lost=0, buffer 30 мс.
  • На POCO F5 (adb по Wi-Fi): эта сборка установлена на телефон. Кнопки на карточке ПК и в сводке работают, состояние сохраняется в paired_pcs. В уведомлении есть действие «Выключить звук» (проверено через dumpsys notification). Логи после выключения и включения звука: lost=0, buffer 24–52 мс; после остановки звука ПК аудиовыход закрылся сам через 30 с.

Muted PCs stay connected (mic included) and keep streaming; the hub mixer leaves them out with a 10 ms gain ramp, they no longer hold the output open or get Pace packets. Phone-local, no protocol change. Mute flags persist per PC in paired_pcs.

Closes #1
Copilot AI balanced review requested due to automatic review settings October 5, 2026 19:53

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

While a PC is muted its feeder no longer queues audio (one Silence marker ends the stream) and unmuting resets it. Before, with the phone output closed, the unread queue was replayed on unmute: ~550 ms extra latency and ~200 packets counted as lost (reproduced on POCO F5 and in unmuting_after_the_output_was_closed_plays_fresh_audio).

The status notification gets a Выключить звук / Включить звук action for all PCs.
@Lyten02
Lyten02 merged commit 9eb63e3 into main Oct 6, 2026
1 check passed
@Lyten02
Lyten02 deleted the feat/phone-mute branch October 6, 2026 05:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Телефон: выключать звук отдельного ПК или всех ПК одной кнопкой

2 participants