Отключаем автонастройку громкости микрофона

Фикс самой ублюдской настройки современных звонилок

Введение

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

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

Фиксим проблему в браузере

Если эта проблема лишь с сайтами в браузере, то есть универсальный фикс под любую ОС.

В Chromium и его аналогах надо написать в браузерной строке chrome://flags/. В поиске той страницы написать Allow WebRTC to adjust the input volume и сделать его Disabled.

В Firefox и его аналогах у меня проблемы не было, но в теории там надо открыть about:config и в поиске написать media.getusermedia.agc_enabled. Его надо сделать False. AGC это Automatic Gain Control.

Фиксим проблему на Linux с PipeWire

У меня эта же проблема была с десктоп discord приложением, тут я сделал фикс на уровне ОС. Работает только на Linux с PipeWire. Для фикса надо написать конфиг WirePlumber. Это менеджер сессий и прав для PipeWire, который управляет устройствами и потоками аудио/видео.

Его конфиги находятся в ~/.config/wireplumber/. Там надо создать файл 99-stop-microphone-auto-adjust.lua с таким содержимым:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
table.insert (default_access.rules,{
    matches = {
        {
            { "application.process.binary", "=", "*" }
        }
    },
    default_permissions = "r-x",
})
table.insert (default_access.rules,{
    matches = {
        {
            { "application.process.binary", "=", ".pavucontrol-wrapped" }
        },
        {
            { "application.process.binary", "=", ".easyeffects-wrapped" }
        }
    },
    default_permissions = "rwx",
})

Тут я запрещаю всем (*) бинарям write. То есть они не смогут менять что либо в звуке системы, только читать и использовать. И уже после этого я разрешаю менять звук системы конкретным программам.

В моём случае это pavucontrol для изменения громкости аудио девайсов, и easyeffects для разных звуковых фильтров, эквалайзеров и т.д.

Можно сделать запрет на write лишь конкретным программам, у меня так было раньше, вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
table.insert (default_access.rules,{
  matches = {
	{
	  { "application.process.binary", "=", ".Discord-wrapped" }
	},
	{
	  { "application.process.binary", "=", ".telegram-desktop-wrapped" }
	}
  },
  default_permissions = "rx",
})

Для запрета записи не важно пишешь ты rx или r-x.

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

Чтоб применить эти настройки, в терминале пишем это:

1
systemctl --user restart wireplumber pipewire pipewire-pulse

Некоторые программы могут перестать выдавать звук, потому что их надо перезапустить после ребута PipeWire.

Ещё есть нюанс. Я указываю application.process.binary = что-то. Но где взять это что-то? Как понять что надо писать? Для этого надо повозиться.

Сначала запускаешь программу, которая редачит звук. Если это голосовой канал, то в него лучше зайти, чтоб наверняка процесс создался. Потом в терминале пишешь:

1
wpctl status

И ищешь нужное приложение. Для голосовых каналов это зачастую WEBRTC VoiceEngine. Но их там будет очень много, как понять какой из них, например, discord, а какой из них другая программа? Для этого надо написать:

1
wpctl inspect номер-клиента | grep application.process.binary

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

1
2
3
wpctl status | grep -E "^\s+[0-9]+" | awk '{print $1}' | while read id; do
    wpctl inspect $id | grep application.process.binary
done

Фикс для NixOS

На NixOS, возможно, работает и стандартный вариант. Но я сделал сразу через .nix конфиг. Вот весь мой конфиг для звука в NixOS:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    jack.enable = true;

    wireplumber = {
      enable = true;

      # Отключаем автонастройку громкости микрофона
      # Если не помогает и сайты в браузере продолжают менять, то есть такие решения:
      # 1) Firefox или его аналоги - в браузерной строке пишешь и открываешь about:config
      #    Там делаешь media.getusermedia.agc_enabled false. Это Automatic Gain Control
      # 2) Chromium или его аналоги - в браузерной строке пишешь и открываешь chrome://flags/
      #    Там ставишь Allow WebRTC to adjust the input volume = Disabled

      extraScripts."99-stop-microphone-auto-adjust.lua" = ''
        table.insert (default_access.rules,{
          matches = {
            {
              { "application.process.binary", "=", "*" }
            }
          },
          default_permissions = "r-x",
        })
        table.insert (default_access.rules,{
          matches = {
            {
              { "application.process.binary", "=", ".pavucontrol-wrapped" }
            },
            {
              { "application.process.binary", "=", ".easyeffects-wrapped" }
            }
          },
          default_permissions = "rwx",
        })
      '';
    };
  };
}
Создано при помощи Hugo
Тема Stack, дизайн Jimmy