Как отключить оранжевую иконку микрофона в верхней панели для конкретного приложения? (Проблема индикатора звука Gnome)

Вопрос или проблема

Я использую 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, всегда отображается в списке источников записи, что и приводит к появлению проблемы.

Устранение проблемы

  1. Модификация скрипта: Сейчас вы вручную создаете и удаляете ваш виртуальный микрофон. Это процессов можно улучшить, автоматизировав создание и удаление на основе активности записи других приложений.

  2. Разработка пользовательского расширения GNOME:

    • Основной способ устранения данной проблемы состоит в разработке собственного расширения GNOME, которое изменит поведение проверки источников записи. В частности, в файле volume.js, который контролирует отображение значка микрофона, можно добавить условие, которое будет исключать виртуальные микрофоны на основе необходимых параметров, таких как node.virtual = "true".
    • Для начала разработки расширения вам потребуется ознакомиться с официальной документацией 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 с источниками записи. Разработка пользовательского расширения, которое будет фильтровать источники по критерию виртуальности, может стать решением для этой ситуации. Заранее желаю вам удачи в ваших начинаниях на пути к созданию расширения!

Оцените материал
Добавить комментарий

Капча загружается...