Вопрос или проблема
Я использую Ubuntu 24.04 с Gnome. Я установил PulseAudio и создал выход (sink), который содержит два петли (loopback). Одной из них является мой внешний микрофон, а другой – внутренний системный звук.
Проблема в том, что виртуальный поток – выход – всегда находится в состоянии записи, даже когда я ничего не записываю с его помощью. Его активность отображается на вкладке записи в PulseAudio. Из-за этого оранжевый значок микрофона Gnome отображается на панели, даже когда я не записываю ничего!
Мне нужно, чтобы выход записывал свои петли только тогда, когда другие приложения записывают, и останавливал запись петли, когда PulseAudio является единственным приложением, использующим его (что указывает на то, что выход больше не нужен).
Цель заключается в том, чтобы значок оранжевого микрофона отображался только во время “реальной” записи чего-либо, а не когда выход “виртуально” записывает устройство петли.
На данный момент я создаю выход вручную, когда он мне нужен, и удаляю его вручную, когда заканчиваю свою запись!
Мой скрипт create_virtual_sink.sh:
#!/bin/bash
# Загружаем модули и получаем их индексы
null_sink_index=$(pactl load-module module-null-sink sink_name=combined_input sink_properties=device.description=CombinedInput)
loopback1_index=$(pactl load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=combined_input)
loopback2_index=$(pactl load-module module-loopback source=alsa_output.pci-0000_00_1b.0.analog-stereo.2.monitor sink=combined_input)
# Сохраняем индексы в файл
echo "$null_sink_index" > /tmp/combined_input_module_indices
echo "$loopback1_index" >> /tmp/combined_input_module_indices
echo "$loopback2_index" >> /tmp/combined_input_module_indices
Мой скрипт remove_virtual_sink.sh:
#!/bin/bash
# Читаем индексы модулей из файла
if [ -f /tmp/combined_input_module_indices ]; then
indices=$(cat /tmp/combined_input_module_indices)
for index in $indices; do
pactl unload-module $index
done
# Удаляем файл после выгрузки модулей
rm /tmp/combined_input_module_indices
else
echo "Файл индексов модулей не найден."
fi
Я не нашел решения проблемы, но нашел ее коренную причину и действительно верю, что это можно решить с помощью пользовательского расширения для gnome.
В проекте gnome-shell, а именно в файле volume.js, индикатор проверяет все выходы источников, и если существует какой-либо выход источника, то будет показан раздражающий значок. Обратите внимание, что в исходном коде он уже фильтрует и пропускает некоторые приложения:
// пропустить gnome-volume-control и pavucontrol, которые появляются
// как записывающие, потому что они показывают уровень входа
let skippedApps = [
'org.gnome.VolumeControl',
'org.PulseAudio.pavucontrol',
];
В моем случае у меня есть виртуальный микрофон, входящий с выходного нуля, созданного модулями pactl, и этот виртуальный микрофон всегда отображается в выводе pactl list source-outputs
Source Output #44
Driver: PipeWire
Owner Module: 536870914
Client: n/a
Source: 39
Sample Specification: float32le 2ch 48000Hz
Channel Map: front-left,front-right
Format: pcm, format.sample_format = "\"float32ne\"" format.rate = "48000" format.channels = "2" format.channel_map = "\"front-left,front-right\""
Corked: yes
Mute: no
Volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB
balance 0.00
Buffer Latency: 0 usec
Source Latency: 0 usec
Resample method: PipeWire
Properties:
node.passive = "true"
target.object = "VirtualMicSource"
stream.capture.sink = "true"
node.group = "virtual-source-536870914"
pulse.module.id = "536870914"
audio.channels = "2"
audio.position = "[ FL, FR ]"
device.description = "VirtualMic"
node.link-group = "loopback-144583-11"
node.virtual = "true"
resample.prefill = "true"
node.name = "input.VirtualMic"
resample.disable = "true"
media.name = "VirtualMic input"
stream.is-live = "true"
node.want-driver = "true"
node.autoconnect = "true"
media.class = "Stream/Input/Audio"
adapt.follower.spa-node = ""
object.register = "false"
factory.id = "6"
clock.quantum-limit = "8192"
factory.mode = "merge"
audio.adapt.follower = ""
library.name = "audioconvert/libspa-audioconvert"
client.id = "38"
object.id = "44"
object.serial = "44"
module-stream-restore.id = "source-output-by-media-name:VirtualMic input"
Этот конкретный выход и вызывает показ значка микрофона. Если бы только как-то мы могли также фильтровать по некоторым свойствам, таким как node.virtual = "true"
, тогда вся проблема была бы решена.
Проблема в том, что я не знаю, как начать разрабатывать расширения gnome, поэтому я оставляю это здесь для следующего человека, который столкнется с этой проблемой.
Ответ или решение
Для устранения проблемы с отображением иконки микрофона в верхней панели GNOME при использовании виртуального микрофона в Ubuntu 24.04, нам необходимо проанализировать причину этого поведения и предложить решение, основанное на возможной разработке пользовательского расширения для GNOME.
Проблема
Ваша текущая конфигурация с созданием виртуального звукового устройства и двумя петлями записи вызывает непрерывное отображение оранжевого значка микрофона на панели, даже когда фактически ничего не записывается. Это поведение связано с тем, что GNOME проверяет наличие активных источников записи и отображает значок, если такие источники существуют. Согласно вашим выводам, виртуальный микрофон, созданный через pactl
, всегда отображается в списке источников записи, что и приводит к появлению проблемы.
Устранение проблемы
-
Модификация скрипта: Сейчас вы вручную создаете и удаляете ваш виртуальный микрофон. Это процессов можно улучшить, автоматизировав создание и удаление на основе активности записи других приложений.
-
Разработка пользовательского расширения GNOME:
- Основной способ устранения данной проблемы состоит в разработке собственного расширения GNOME, которое изменит поведение проверки источников записи. В частности, в файле
volume.js
, который контролирует отображение значка микрофона, можно добавить условие, которое будет исключать виртуальные микрофоны на основе необходимых параметров, таких какnode.virtual = "true"
. - Для начала разработки расширения вам потребуется ознакомиться с официальной документацией GNOME по разработке расширений.
- Основной способ устранения данной проблемы состоит в разработке собственного расширения GNOME, которое изменит поведение проверки источников записи. В частности, в файле
Пример кода для расширения
Взяв за основу исходный код из volume.js
, вы можете внести изменения следующим образом:
let skippedApps = [
'org.gnome.VolumeControl',
'org.PulseAudio.pavucontrol',
];
// Добавьте дополнительное условие для исключения виртуальных источников
if (sourceOutput.properties['node.virtual'] == "true") {
return; // Пропустить аудиопоток, если это виртуальный источник
}
Ваша дальнейшая работа
- Изучите основы создания расширений: Знакомство с JavaScript и API GNOME также будет полезным.
- Тестирование изменений: Проверьте, работает ли новое расширение так, как предполагалось, и корректно ли оно скрывает оранжевую иконку при неактивной записи.
- Обратная связь сообществу: Если ваше расширение будет успешным, вы можете поделиться своим решением с сообществом на платформах, таких как GitHub или GNOME Extensions.
Заключение
Проблема постоянного отображения иконки микрофона связана с особенностями работы GNOME с источниками записи. Разработка пользовательского расширения, которое будет фильтровать источники по критерию виртуальности, может стать решением для этой ситуации. Заранее желаю вам удачи в ваших начинаниях на пути к созданию расширения!