LINUX.ORG.RU

EasyEffects не нужно, или PipeWire для продвинутых: часть 1

 , ,


7

5

ВСТУПЛЕНИЕ

Звуковая система PipeWire принесла, без преувеличения, революцию в мир десктопно-мультимедийного Linux. Наконец то эта ОС получила продуманную, сделанную по уму понимающими в теме людьми, и сделанную качественно звуковую систему. Многие ее возможности присутствовали и раньше, в других более старых звуковых системах, но в PipeWire они собраны воедино и сформировали целую единую платформу, на которой можно реализовать огромное количество самых разных задач.

Но в пользовательской среде, эта революция практически не заметна, часто можно встретить мнение вида «ну играет ютуб и играет, мне хватает». Поэтому я решил сделать небольшой цикл статей, посвященный более продвинутому использованию PipeWire, раскрывающему его, без преувеличения, поразительные возможности. (Ну и чтобы изучить их самому в процессе, хехехе).

ЧАСТЬ 1: EasyEffects, давай, до свидания!

Начнем с самого простого и нужного. На ноутбуках мы часто или практически всегда имеем плохие динамики, которые требуют эквалайзера. Для пользователя удобнее всего, если такой эквалайзер будет системным, независимым от приложения, потому что, ну попробуйте добавить эквалайзер в Google Chrome )) да и синхронизировать настройки эквалайзера по всем приложениям никому не нужно.

Здесь выходит на сцену известное приложение EasyEffects, которое предоставляет и эквалайзер, и много чего кроме него, как раз общесистемно. НО! Если вы пробовали его использовать, то видите сразу его недостатки – это довольно тяжелое для своей задачи приложение, на GTK4, запускается и работает в фоне тоже как GUI приложение со скрытым окном, потребляет излишне много памяти и ресурсов. Заглянув чуть больше под капот, мы увидим еще более пугающие вещи – EasyEffects принимает на себя задачу линковки (соединения нод в графе звуковой системы), то есть он сам начинает подключать приложения к тем нодам, к каким он хочет. Но, это же задача менеджера сессии PipeWire, то есть WirePlumber!

Проще говоря, EasyEffects берет на себя прямую функцию WirePlumber и они борются друг с другом. Надо ли говорить, что подобная вакханалия и тяжеловесность для простейшей задачи «просто сделать эквалайзер» попадает в полной мере под термин bloatware! Но как же быть?

А что, если я скажу, что PipeWire, сам голый, непосредственно, УЖЕ содержит все возможности для реализации эквалайзера, и не только эквалайзера, а вообще многого, что только может понадобиться делать со звуком? Что если я скажу, что вам достаточно создать один текстовый файл, и САМ PipeWire будет выполнять всю работу, прямо в своем процессе, заменяя не то что EasyEffects, а даже, например, софтовые гитарные процессоры типа Guitarix и KPP?? Для этого не потребуется запуск дополнительных приложений, демонов, хостов плагинов. Только PipeWire. One love. Как тебе такое, Илон Маск @R_He_Po6oT?

Сегодня мы сделаем общесистемный эквалайзер. Немного теории, в двух предложениях. Все приложения, работающие с PipeWire, создают ноды – узлы, через которые идет обмен звуковыми потоками. Через ноду приложение может получать либо выводить звук. Все ноды соединены в граф – «схему» из нод, соединенных связями. Нода, В КОТОРУЮ можно выводить звук, называется Sink, а ноду, которая сама что-то выдает из себя, назовем Source или Stream.

Тогда, чтобы сделать эквалайзер, нам надо добавить в граф две ноды – Equalizer Sink к которому все приложения будут подключаться и выводить в него звук, и Stream который будет выдавать обработанный, эквализованный звук в звуковую карту. Звуковая карта – это тоже нода типа Sink, она уже есть изначально, и по умолчанию все приложения подключаются именно к ней. А мы создадим Equalizer Sink и назначим его «синком по умолчанию». Тогда WirePlumber, менеджер сессии, начнет подключать все приложения на наш Equalizer Sink.

Осталось решить, что же, какое приложение или какая сущность, будет выполнять саму обработку, что будет связано с этими двумя нодами, получать, обрабатывать и отдавать звук. Ноды может создавать любое приложение, используя PipeWire API, что и делает EasyEffects, например. Но мы же хотим от него избавиться! Помимо приложений, это могут делать модули PipeWire. Модули – это плагины, библиотеки формата .so, загружаемые в процесс PipeWire. В стандартной поставке PipeWire есть модуль filter-chain, который мы рассмотрим подробнее.

filter-chain создает две ноды, Sink и Stream, и обрабатывает звуковой поток, идущий между ними. Это именно то, что нам нужно – filter-chain позволяет применить к звуку любую обработку. filter-chain позволяет использовать внутри себя плагины LADSPA, плагины LV2, и самое главное – уже содержит набор встроенных фильтров, для которых не нужно ничего внешнего. Уже понятно, что если мы подключим LV2 плагины из набора LSP например, то можно вытворять со звуком все что угодно, т. к. это студийные плагины для DAW системы профессионального уровня. НО! НО! НО! Оказывается, что даже встроенными эффектами, без дополнительных плагинов вообще, уже можно делать очень многое!

И для начала мы сделаем графический эквалайзер на 15 полос. Для этого, надо создать вот такой конфиг-файл, по адресу ~.config/pipewire/pipewire.conf.d/eq.conf:

context.modules = [
    { name = libpipewire-module-filter-chain
        args = {
            node.description = "Equalizer Sink"
            media.name       = "Equalizer Sink"
            filter.graph = {
                nodes = [
                    {
                        type  = builtin
                        name  = eq_preamp
                        label = bq_highshelf
                        control = { "Freq" = 0 "Q" = 1.0 "Gain" = 0.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_1
                        label = bq_peaking
                        control = { "Freq" = 25.0 "Q" = 1.7 "Gain" = -10.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_2
                        label = bq_peaking
                        control = { "Freq" = 40.0 "Q" = 1.7 "Gain" = -10.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_3
                        label = bq_peaking
                        control = { "Freq" = 63.0 "Q" = 1.7 "Gain" = -9.0}
                    }
                    {
                        type  = builtin
                        name  = eq_band_4
                        label = bq_peaking
                        control = { "Freq" = 100.0 "Q" = 1.7 "Gain" = 3.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_5
                        label = bq_peaking
                        control = { "Freq" = 160.0 "Q" = 1.7 "Gain" = 3.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_6
                        label = bq_peaking
                        control = { "Freq" = 250.0 "Q" = 1.7 "Gain" = -2.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_7
                        label = bq_peaking
                        control = { "Freq" = 400.0 "Q" = 1.7 "Gain" = -5.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_8
                        label = bq_peaking
                        control = { "Freq" = 630.0 "Q" = 1.7 "Gain" = -5.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_9
                        label = bq_peaking
                        control = { "Freq" = 1000.0 "Q" = 1.7 "Gain" = -3.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_10
                        label = bq_peaking
                        control = { "Freq" = 1600.0 "Q" = 1.7 "Gain" = -3.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_11
                        label = bq_peaking
                        control = { "Freq" = 2500.0 "Q" = 1.7 "Gain" = -3.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_12
                        label = bq_peaking
                        control = { "Freq" = 4000.0 "Q" = 1.7 "Gain" = -5.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_13
                        label = bq_peaking
                        control = { "Freq" = 6300.0 "Q" = 1.7 "Gain" = -3.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_14
                        label = bq_peaking
                        control = { "Freq" = 10000.0 "Q" = 1.7 "Gain" = 0.0 }
                    }
                    {
                        type  = builtin
                        name  = eq_band_15
                        label = bq_peaking
                        control = { "Freq" = 16000.0 "Q" = 1.7 "Gain" = 0.0 }
                    }
                ]
                links = [
                    { output = "eq_preamp:Out" input = "eq_band_1:In" }
                    { output = "eq_band_1:Out" input = "eq_band_2:In" }
                    { output = "eq_band_2:Out" input = "eq_band_3:In" }
                    { output = "eq_band_3:Out" input = "eq_band_4:In" }
                    { output = "eq_band_4:Out" input = "eq_band_5:In" }
                    { output = "eq_band_5:Out" input = "eq_band_6:In" }
                    { output = "eq_band_6:Out" input = "eq_band_7:In" }
                    { output = "eq_band_7:Out" input = "eq_band_8:In" }
                    { output = "eq_band_8:Out" input = "eq_band_9:In" }
                    { output = "eq_band_9:Out" input = "eq_band_10:In" }
                    { output = "eq_band_10:Out" input = "eq_band_11:In" }
                    { output = "eq_band_11:Out" input = "eq_band_12:In" }
                    { output = "eq_band_12:Out" input = "eq_band_13:In" }
                    { output = "eq_band_13:Out" input = "eq_band_14:In" }
                    { output = "eq_band_14:Out" input = "eq_band_15:In" }
                ]
                inputs = [ "eq_preamp:In" ]
                outputs = [ "eq_band_15:Out" ]
            }
            capture.props = {
                node.name   = "effect_input.eq6"
                media.class = Audio/Sink
                audio.channels = 2
                audio.position=[FL FR]
            }
            playback.props = {
                node.name   = "effect_output.eq6"
                node.passive = true
                audio.channels = 2
                audio.position=[FL FR]
            }
        }
    }
]

Разберем его подробнее. name = libpipewire-module-filter-chain – подключаем волшебный модуль filter-chain. media.name = "Equalizer Sink" - название ноды, которое мы увидим в графе pipewire, и в GUI типа pavucontrol или kmix. Далее в массиве nodes перечислены фильтры, через которые пройдет звук. Здесь мы используем эффект eq_preamp как общий регулятор громкости эквалайзера, и 15 раз bq_peaking - каждый из них реализует одну из 15 полос нашего графического эквалайзера. Тут же задаем параметры полос – Freq это средняя частота полосы в герцах, Q - добротность, Gain - уровень этой полосы в децибелах. Частоты и добротности я задал примерно стандартные для 2/3 октавного эквалайзера (свиснул из qmmp). Значения Gain настройте как угодно, под ваши потребности.

Далее идет массив links - это соединения между нодами эффектов, которых у нас 16. Они должны быть соединены по цепочке, друг за другом, что и сделано.

И в конце, описываются параметры двух нод, которые добавятся в граф PipeWire, о чем я писал выше. capture.props это поисание ноды Equalizer Sink, на которую будут подключаться все пиложения. playback.props – свойства выходной ноды, которая будет выводить обработанный звук в звуковую карту.

После того, как вы добавите этот конфиг-файл на его место, надо перезапустить демон pipewire или перезагрузиться, или выйти-войти в GUI-сеанс. Перезапустить PipeWire можно командой systemctl --user restart pipewire.

После перезапуска PipeWire, в pavucontrol на вкладке «Устройства вывода» должно добавиться устройство Equalizer Sink. Если включить птичку «Установить по умолчанию» напротив него, то все приложения начнут выводить звук через наш эквалайзер. Для того, чтобы отключить эквалайзер, надо включить эту птичку на любое другое устройство, то которое там было до добавления эквалайзера, у меня это «Встроенное аудио Аналоговый стерео».

То же самое можно делать через плазмоид регулятора громкости в KDE Plasma. Там добавится устройство Equalizer Sink и можно будет переключить радиокнопку на него.

Основной недостаток этого всего один – нет GUI для руления настройками! Чтобы их изменить, надо, в простейшем случае на сегодня, изменить числа в конфиге и перезапустить PipeWire.

Вот и все! В следующий раз мы создадим более сложные эффекты, и разберем вопрос, можно ли рулить настройками по-живому, без перезапуска PipeWire.

Часть 2

★★★★

Проверено: hobbit ()
Последнее исправление: dataman (всего исправлений: 8)

Ну и чтобы изучить их самому в процессе, хехехе

Молодец, девиз всех учителей с ютуба :)) С интересом жду продолжения. Когда-то уже скрещивал его в ladspa эффектами, но об этом надо отдельно.

Только pipewire. One love. Как тебе такое, Илон Маск @R_He_Po6oT?

Слушаю, и верю каждому твоему слову :) Я взял это на карандашик. Хм. В конце ты теперь просто обязан запилить конциг с гитарной обработкой :)))

Недостаток этого всего основной один - нет GUI для руления настройками! Чтобы их изменить, надо, в простейшем случае на сегодня, изменить числа в конфиге и перезапустить pipewire.

Вот это огромная проблема. И ладно бы GUI, но почему они сделали так, что чтобы поменят настройки ladspa плагина надо перезапускать весь сервер? С пульсы так и тянется это безобразие. Я уже писал пайпваре, но никакого ответа так и не последовало.

Вот и все! В следующий раз мы создадим более сложные эффекты, и разберем вопрос, можно ли рулить настройками по живому, без перезапуска pipewire.

Лично я буду ждать. И если кто-то создаст тикет с требованием селать работу с эффектами нормальной, зовите меня, я поддержу, я обеими клешнями им там настучу.

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Забегая вперёд, там можно все, но мало инфы и все в экспериментальном состоянии, поэтому об этом постепенно.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

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

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

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

James_Holden ★★★★
() автор топика

Не угадал автора по заголовку и первому абзацу.

Наконец то эта ОС получила продуманную, сделанную по уму понимающими в теме людьми, и сделанную качественно звуковую систему.

Ага. Когда JACK сделали. Но статья не о нём :P

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

Спасибо, что без «ИИ»-картинок!

dataman ★★★★★
()
Ответ на: комментарий от CrX

Jack это несколько не то. Во-первых, он не подходит для десктопных задач, по причине своей идеологии «фиксированные настройки сервера, приложения должны в этот формат конвертировать как хотят, сами». Для десктопа нужно противоположное - «приложения выводят что хотят, сервер все конвертирует сам». Поэтому существовало двоевластие - jack + pulseaudio. И приходилось использовать лютые костыли типа бриджей, чтобы к примеру, у меня одновременно с гитарной обработкой играл подклад с ютуба через браузер. С midi опять же непонятки, потому что был alsa midi и jack midi и чтобы они работали друг с другом, надо опять же костыли.

pipewire просто решает все эти проблемы, так как поддерживает обе идеологии, по ситуации. А с pipewire-pulse еще и одновременно в одном лице.

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

James_Holden ★★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от CrX

Вообще, JACK был сделан настолько по уму и настолько толково, что например по Ardour рекомендовалось, при наличии любых проблем, выкинуть JACK и работать с alsa напрямую, и сразу Ardour начинал работать без коней.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Во-первых, он не подходит для десктопных задач

Для десктопных задач мне вообще всегда ALSA хватало.

pipewire просто решает все эти проблемы

Решает. Только это проблемы, созданные PulseAudio. Не было бы PulseAudio, не было бы многих из этих проблем. Только небольшую прослойку для блютуза написать (которую бы юзали только пользователи этого самого блютуза, а остальным оно нафиг не надо), о которой приложения бы даже не знали, и всё — не обязательно было городить это всё.

Это снижает минимально достижимую задержку на моей машине более чем в 2 раза по сравнению с jack

Странно. У меня наоборот на Jack задержка меньше. Чуть менее, чем в полтора раза правда, не в два, но всё равно.

Вообще, JACK был сделан настолько по уму и настолько толково, что например по Ardour рекомендовалось, при наличии любых проблем, выкинуть JACK и работать с alsa напрямую, и сразу Ardour начинал работать без коней.

Понимаю, что «УМВР» так себе аргумент, но не встречал. У меня Ardour и работал и работает с JACk прекрасно. При этом в остальное время я юзаю просто ALSA. Jack запускаю вместе с Ardour, когда занимаюсь звукозаписью и прочим смежным.

CrX ★★★★★
()
Ответ на: комментарий от CrX

только пользователи этого самого блютуза

Сейчас это практически все пользоваетели ноутбуков и мобильных девайсов - ибо спасибо тебе Кук гнездо для аудио джека не выпилили только ленивые. Да даже если не выпилили - смотрю весь офис в немаленькой конторке повыкинул уже наяиг не то что джековые гарнитуры но и специальные дрогущие USB-жабры для конференций и все поголовно сидят в блютуз ушах.

а остальным оно нафиг не надо

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

Qui-Gon ★★★★★
()
Ответ на: комментарий от CrX

Только небольшую прослойку для блютуза написать

Нельзя написать небольшую прослойку для блютуза. Блютуз предполагает обязательную необходимость переключения на лету на другую звуковую «карту», это принципиально отличается от того как работает alsa. Она в принципе не предполагает, что пользователю понадобится прыгать по картам не останавливая воспроизведение.

Поэтому, здесь нужен именно звуковой сервер как отдельный процесс, что и сделал Поттеринг.

James_Holden ★★★★
() автор топика

У частоты последней полосы эквалайзера нолик потерялся.

Основной недостаток этого всего один – нет GUI для руления настройками!

Всё как всегда.

thesis ★★★★★
()

Основной недостаток этого всего один – нет GUI для руления настройками! Чтобы их изменить, надо, в простейшем случае на сегодня, изменить числа в конфиге и перезапустить PipeWire.

Я что-то подобное делал ещё когда юзал просто ALSA, но имхо через EasyEffects просто удобнее.

Skullnet ★★★★★
()

я скажу, что PipeWire, сам голый, непосредственно, УЖЕ содержит все возможности для реализации эквалайзера, и не только эквалайзера, а вообще многого, что только может понадобиться делать со звуком?

Имеет ли «голый» PipeWire возможность включения выравнивания громкости (программной тонкомпенсации, компрессора) на уровне звука всей системы, да ещё и одновременно с работающим эквалайзером? Для «голой» Alsa, например, хоть и есть плагин выравнивания громкости alsaloudness, но он не может работать одновременно с включённым в ~/.asoundrc эквалайзером (а ведь вдобавок ко всему мне ещё и включенный в конфиге программный dmix нужен, чтобы параллельно звук из разных программ воспроизводился моей звуковой USB-картой). EasyEffects всё это может, но слишком сильно нагружает процессор и у неё неудобный интерфейс.

posixbit ★★
()
Ответ на: комментарий от posixbit

Вот с компрессором они немного маху дали, не включив его в builtin фильтры. Собираюсь туда закоммитить. Конечно можно подключить LADSPA компрессор и все, но все же это базовая штука.

Насчет тонкомпенсации не знаю даже, я не сторонник этой штуки.

По GUI напишу чуть позже, цель статей как раз раскрыть возможности создания GUI/CLI рулилок этим всем, и архитектурно там возможности заложены.

Но такие рулилки понадобятся только для настройки, сами эффекты работают внутри процесса pipewire в любом случае, в чем и огромное преимущество такого подхода.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от posixbit

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

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Но ноды эти работают паралельно, а тут уже будет последовательно и должно быть видимо одним устройством в микшере. Жду. Я два года назад копал, да бросил. Посмотрим, может что изменилось?

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Тут оказалось, что буквально в эти недели, в filter-chain впиливают несколько важных дополнительных builtin эффектов, например нормализацию по LUFS и вычисление квадратного корня (что нужно для RMS вычислений).

Поэтому, пока я скорее всего по компрессии, рассмотрю пример через внешний плагин, а после следующего релиза pipewire попробую сделать это на чисто builtin возможностях.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Это интересно. А это на выход? Или на вход? Вроде раньше у них разделение было. И что с перезапуском плагинов?

И ещё такой вопрос - фильтры (встроенные) в простое обрабатывают канал? Или останавливаются? Ladspa, я так понимаю, молотят постоянно.

builtin возможностях.

Чего как нерусский, пиши - билтических посибиляциях. :) я тут тоже в английский залипаю.

R_He_Po6oT ★★★★★
()
Последнее исправление: R_He_Po6oT (всего исправлений: 1)
Ответ на: комментарий от R_He_Po6oT

А это на выход? Или на вход?

Можно и туда и туда повесить, я пока в примерах ориентируюсь на выход.

И что с перезапуском плагинов?

Сегодня если успею, будет вторая часть, по рулению без перезапуска.

И ещё такой вопрос - фильтры (встроенные) в простое обрабатывают канал? Или останавливаются? Ladspa, я так понимаю, молотят постоянно.

Вроде не молотят, но это надо уточнить. Вообще они мало жрут и трудно понять.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Тогда когда я читал это всё, не могли останавливаться, но в планах было. Если к ноде не подключено ничего, он останавливает работу. Энергосбережение и всякое такое.

А со статьёй не торопись. Мы люди терпеливые. Минут пятнадцать у тебя ещё есть :)

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Я себе вот так сделал, а плагины накидываю через Carla.

# /usr/share/pipewire/pipewire.conf

{ factory = adapter
    args = {
        factory.name     = support.null-audio-sink
        node.name        = "virt-mic"
        node.description = "Virtual Microphone"
        media.class      = "Audio/Source/Virtual"
        audio.position   = "FL,FR"
        monitor.passthrough = true
    }
}
{ factory = adapter
    args = {
        factory.name     = support.null-audio-sink
        node.name        = "virt-hp"
        node.description = "Virtual Headphones"
        media.class      = "Audio/Sink"
        audio.position   = "FL,FR"
    }
}
Virt-mic выставил в системе микрофоном по умолчанию, а virt-hp выставляю если надо в team speak например, чтобы не портить звук во всём софте сразу.

Dr64h ★★★
()
Последнее исправление: Dr64h (всего исправлений: 2)

изменить числа в конфиге и перезапустить PipeWire.

Этот твой пипвире делали жопорукие дебилы. Может быть поэтому EasyEffects приходится делать хаки в обход этого гениального поделия?

no-such-file ★★★★★
()
Ответ на: комментарий от Dr64h

Сколько пробовал EasyEffects, никогда стабильно не работал, а ресурсов жрёт - вагон.

ЯХЗ, УМВР на пульсе. Пипвайер этот пусть повзрослеет, тогда поглядим. Лет через 10.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Как раз на Пульсе пытался его использовать, получал конские задержки и пшш-пшш артефакты, перешёл на Пайп, задежки пропали, но от артефактов в EasyEffects это не спасло, так и перешёл с него на Карлу.

Dr64h ★★★
()
Ответ на: комментарий от no-such-file

Этот твой пипвире делали жопорукие дебилы

Да нет же. Pipewire делали нормальные люди. «Дебилы», прости конечно, это некоторые коментаторы, которые делают неверные поспешные выводы раньше выхода последующих частей серии статей, тред и даже ОП не читают внимательно, сразу отвечают.

Ничего личного, просто факт )))

James_Holden ★★★★
() автор топика
Ответ на: комментарий от Dr64h

На Карле нещитово. И этот метод с самого начала у них работал. Я не хочу целую Карлу запускать. Зачем? Да гуй этой штуке нужен только пока отладишь. Ну и в микшеры бы встроили крутилки параметров эффектов. А музыкальный софт пусть остаётся музыке.

R_He_Po6oT ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.