LINUX.ORG.RU

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

 , ,


0

2

Спатиалайзер для наушников

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

И возникает существенная проблема - а на что должна быть расчитана запись, на прослушивание в наушниках, или в колонках? Индустрия выбирает колонки, как основной источник звука, и все делается в расчете на них. А в наушниках мы будем слышать неправильное стерео, сильно искаженное.

Но - у нас же есть pipewire, поэтому не беда, сейчас мы это исправим! В этой и следующей статье, мы заставим звучать наушники как колонки, а колонки как наушники (ну почти)!

ТЕОРИЯ

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

В простейшем случае, можно просто подмешать левый сигнал в правый с пониженной громкостью, и наоборот. Есть готовые устройства для наушников (кроссфидер) которые это делают. В наушниках станет возможно слушать первые альбомы Beatles)) но радикально ничего не изменится - звуки все равно будут внутри головы, а не вокруг, как с настоящими колонками.

Для того, чтобы имитировать звучание колонок на более серьезном уровне, давайте разберемся, а как вообще человек определяет, с какой стороны идет звук - слева, справа, спереди, сзади? Как работает локализация источника звука?

Форма наших ушей и форма нашей головы такова, что она оказывает влияние на звук в зависимости от того, с какой стороны идет звук! Проще говоря, воспринимаемый ухом баланс низких, средних, высоких частот будет меняться, если колонку перемещать вокруг вашей головы! Ушная раковина работает как эквалайзер, который меняет звук в зависимости от положения источника звука.

Второй фактор - задержки между звуком в правом и левом ухе. Если источник ближе к левому уху, оно будет получать звуковую волну раньше, и наоборот.

Третий фактор - разница в громкости между левым и правым ухом.

Вот эти три фактора определяют для нас ощущение в пространстве места источника звука. Теперь, если мы хотим сделать спатиалайзер, то есть имитатор источника звука, расположенного где-то вокруг нас с заданными координатами, нам нужна математическая функция, которая на вход получает необработанный, исходный звук, имеет параметры - направление (азимут) и расстояние до источника звука, и на выход выдает обработанный звук, измененный так же, как его бы изменила наша ушная раковина и форма черепа, если бы он шел из заданной точки! Причем, на выходе мы должны получать два канала - для левого наушника, и для правого, потому что все источники звука мы слышим двумя ушами.

Такая функция называется HRTF - Head Related Transfer Function, или ее подвариант DTF - Directional Transfer Function (содержит только разницу между ушами, по сравнению с HRTF, это не сильно важные пока тонкости реализации). Откуда ее взять, как получить?

Берем вас. Вставляем вам в ушные каналы микрофоны. Теперь через ваши уши будете слышать не вы, а шайтан-машина! Сажаем вас в заглушенную лабораторию, где вокруг вас расставлено огромное количество колонок, по кругу. И начинаем воспроизводить тестовый сигнал с каждой колонки по очереди и записывать звук с микрофонов. Для каждой записи, помечаем под каким азимутом стояла колонка. Так мы получаем набор импульсных откликов уха-головы (HRIR, Head Related Impulse Response), для каждого направления на колонку, когда она перед вами, влево под 5 градусов, влево под 10 градусов и так далее. Это запись того, что слышат ваши уши.

Дальше эти HRIR записи обрабатываются, пересчитываются и получается HRTF или DTF. Это все сохраняется в файл по стандарту SOFA.

Теперь мы можем сделать обратный процесс, если у нас есть этот SOFA файл! Мы можем взять музыку, левый стерео канал, задать координаты виртуальной левой колонки, пропустить звук через HRTF, и получить измененный, окрашенный звук для левого и правого наушника, который обманывает уши, заставляет их думать, что источник звука - вот там вот! Имитируем правую колонку так же, можно задние для 5.1 системы, боковые для 7.1, что угодно! И вы услышите окружающий звук через простые наушники!

Фантастика! Но есть ложка дегтя. Стоить такой обмер вашей головы будет столько, что вы не захотите это делать)) Поэтому, максимум что мы можем иметь - чужая HRTF другого человека, или какая-то обобщенная HRTF «для всех». Которую заморочились и сняли. Вы будете слышать через чужие уши! А уши это такая зараза, что у каждого человека они разные. Поэтому, идеальной точной локализации вы не получите, но эффект все равно достаточно сильный и крутой.

ПРАКТИКА

Теперь мы можем реализовать спатиалайзер - он должен загружать HRTF (или DTF) из SOFA файла, пропускать исходный стерео звук через HRTF, задаем для него координаты виртуальных стерео колонок перед нами, и получаем звук в наушниках, как из колонок (в какой-то мере). И намного более правильную стерео сцену.

Такой спатиалайзер уже есть во всех основных ОС, в андроид смартфонах это называется 3D Effects, в Windows не помню как, но начиная с Windows 10 это доступно в системном микшере просто. В Linux - хм хм, вы видели? Нет? Что-то не находите? Как всегда…

Хорошая новость - на самом деле теперь и в Linux есть все средства для того чтобы сделать спатиалайзер, ведь его встроили в pipewire! Плагин filter-chain, которому посвящены эти статьи, содержит эффект SOFA, который загружает SOFA файлы и делает нужную нам обработку. В параметрах эффекта, можно задать азимут направления на виртуальный источник, и расстояние до него.

Плохая новость - никто не включил в pipewire сами SOFA файлы! Их просто нет в комплекте, ищи где хочешь. Благо, найти их не сложно. Есть ресурс https://www.sofaconventions.org/ и там море ссылок на свободно доступные HRTF и DTF, снятые учеными в лабораториях для нас!

Я использую вот этот файл https://sofacoustics.org/data/database/ari/dtf%20b_nh2.sofa (прямая ссылка). Там рядом их еще море, отличаются тем, что их сняли с ушей разных людей. Выбор файла - поле для экспериментов.

Теперь напишем конфиг файл, который создает две виртуальные колонки перед нами. Сначала разберем важные куски из этого файла, полный листинг файла и куда его помещать, будет в конце статьи.

Азимут у них будет 30 градусов от направления «вперед», это теоретически идеальная расстановка стерео колонок по принципу равностороннего треугольника. Еще создадим две задние колонки, для ощущения окружающего звука и глубины, на них подадим тот же стерео звук, только тише.

{
  type = sofa
  label = spatializer
  name = spFL
  config = {
    filename = "/home/curufinwe/dtf_b_nh2.sofa"
  }
  control = {
    "Azimuth"    = 30.0
    "Elevation"  = 0.0
    "Radius"     = 1.0
  }
}

В filename указываем путь, где лежит sofa файл. Азимут - направление на виртуальный источник, прямо вперед это 0 градусов, влево это 90 градусов, сзади 180, справа 270. Elevation - угол подъема, не имеет значения, в нашем sofa файле нет информации о вертикальной плоскости. Radius - расстояние до источника, тоже не имеет значения, этот файл не содержит информации о расстоянии. Работает только азимут.

В начале цепочки нам понадобятся эффекты copy, потому что у нас будет по два sofa эффекта для каждого канала - для передних виртуальных колонок, и для задних. После sofa эффектов мы получаем по 4 сигнала на каждый канал наушников, смешиваем их при помощи mixer, задаем громкости для передних «колонок» 0.5, для задних «колонок» 0.3.

Если громкость задних сделать 0, то будем слышать чистую имитацию стерео колонок впереди вас.

Практика прослушивания показала, что конечно, ощущение колонок далеко не полностью реалистичное, звук только немного выходит вперед и в стороны из головы, но при сравнении с реализациями в других ОС - оно работает не хуже, точно так же! Идеала пока нигде нет, к нему можно приблизиться, если снять HRTF с вашей личной головы.

Полный конфиг-файл, содержимое этого листинга надо поместить в файл по адресу ~/.config/pipewire/pipewire.conf.d/spatializer.conf и перезапустить pipewire.

context.modules = [
    { name = libpipewire-module-filter-chain
        args = {
            node.description = "Spatializer"
            media.name       = "Spatializer"
            filter.graph = {
                nodes = [
                    {
                        type = builtin
                        label = copy
                        name = copyL
                    }
                    {
                        type = builtin
                        label = copy
                        name = copyR
                    }
                    {
                        type = sofa
                        label = spatializer
                        name = spFL
                        config = {
                            filename = "/home/curufinwe/dtf_b_nh2.sofa"
                        }
                        control = {
                            "Azimuth"    = 30.0
                            "Elevation"  = 0.0
                            "Radius"     = 1.0
                        }
                    }
                    {
                        type = sofa
                        label = spatializer
                        name = spFR
                        config = {
                            filename = "/home/curufinwe/dtf_b_nh2.sofa"
                        }
                        control = {
                            "Azimuth"    = 330.0
                            "Elevation"  = 0.0
                            "Radius"     = 1.0
                        }
                    }
                    {
                        type = sofa
                        label = spatializer
                        name = spRL
                        config = {
                            filename = "/home/curufinwe/dtf_b_nh2.sofa"
                        }
                        control = {
                            "Azimuth"    = 150.0
                            "Elevation"  = 0.0
                            "Radius"     = 1.0
                        }
                    }
                    {
                        type = sofa
                        label = spatializer
                        name = spRR
                        config = {
                            filename = "/home/curufinwe/dtf_b_nh2.sofa"
                        }
                        control = {
                            "Azimuth"    = 210.0
                            "Elevation"  = 0.0
                            "Radius"     = 1.0
                        }
                    }
                    {
                      type = builtin
                      label = mixer
                      name = mixL
                      control = {
                        "Gain 1" = 0.5
                        "Gain 2" = 0.5
                        "Gain 3" = 0.3
                        "Gain 4" = 0.3
                      }
                    }
                    {
                      type = builtin
                      label = mixer
                      name = mixR
                      control = {
                        "Gain 1" = 0.5
                        "Gain 2" = 0.5
                        "Gain 3" = 0.3
                        "Gain 4" = 0.3
                      }
                    }
                ]
                links = [
                    { output = "copyL:Out"  input="spFL:In" }
                    { output = "copyR:Out"  input="spFR:In" }
                    { output = "copyL:Out"  input="spRL:In" }
                    { output = "copyR:Out"  input="spRR:In" }
                    { output = "spFL:Out L"  input="mixL:In 1" }
                    { output = "spFL:Out R"  input="mixR:In 1" }
                    { output = "spFR:Out L"  input="mixL:In 2" }
                    { output = "spFR:Out R"  input="mixR:In 2" }
                    { output = "spRL:Out L"  input="mixL:In 3" }
                    { output = "spRL:Out R"  input="mixR:In 3" }
                    { output = "spRR:Out L"  input="mixL:In 4" }
                    { output = "spRR:Out R"  input="mixR:In 4" }
                ]
                inputs = [ "copyL:In" "copyR:In" ]
                outputs = [ "mixL:Out" "mixR:Out" ]
            }
            capture.props = {
                node.name   = "effect_input.spatializer"
                media.class = Audio/Sink
                audio.channels = 2
                audio.position=[FL FR]
            }
            playback.props = {
                node.name   = "effect_output.spatializer"
                node.passive = true
                audio.channels = 2
                audio.position=[FL FR]
            }
        }
    }
]

★★★★

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

Индустрия выбирает колонки, как основной источник звука, и все делается в расчете на них.

Тут, мне кажется, чрезмерно категоричное утверждение
Всё-таки, спотифай, эппл-мюзик и вот это вот всё. Все музыку на айфонах слушают. Уж современные релизы по-любому проверяют на совместимость с наушниками при мастеринге.
Вот стереоальбомы Битлз - это боль. Факт. Но там и на колонках можно с непривычки дар речи потерять.
А вообще, за статью - ррреспектище!

ist76 ★★★★★
()

Напомните вечером почитать :)

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

Совместимость, конечно, есть на всей музыке начиная с 70-х наверное, но полностью она раскрывается именно на колонках

Я слушаю много современного и все равно, колонки это другие эмоции. Ничего не могу поделать.

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

Колонки-то громче)
Их не только через ушные раковины слышишь, да плюс - отражения от комнаты.
Это как на гитаре в наушниках играть и в кабинет. Совершенно другие ощущения. И потом, наушники же низ не умеют?

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

Хм хм хм

Что значит низ. Ну 20 герц ты легко услышишь, но ушами, а не телом. Как это назвать. Умеют, но не так. И это не исправить никакими DSP фокусами.

Вообще, с басом там весьма интересно, есть такой дикий прикол который во многих затычках, чтобы был БАСССС из пукалок. Хочу рассмотреть чуть позже в статье.

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

Для тех кто никогда никаких плагинов к pipewire не подключал неплохо бы привести команды, что делать с файлами настроек из статьи.

praseodim ★★★★★
()

По теме, а что никто не придумал как обмерять ушные раковины и голову, чтобы потом генерировать из этих данных sofa-файл или выбирать наиболее подходящий?

P.S. Тема вообще крутая, затронут пласт знаний о которых вообще не в курсе был.

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

Из первых трех статей понятно, я уже не стал еще раз на них ссылаться, не знаю стоит ли

Этот файл просто надо положить в нужную папку, и перезагрузиться. pipewire все подхватит сам. Потом в pavucontrol/kmix или что у пользователя там, выбрать Spatializer дефолтным устройством вывода.

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

а что никто не придумал как обмерять ушные раковины и голову

Обмерять - ты имеешь в виду чисто геометрически? Насколько я понимаю, сейчас такого нет, слишком сложно потом смоделировать.

Вот эти файлы, по моей ссылке, просто лежат с разных голов снятые под номерами, и я не нашел инфы, какие конкретно геометрические параметры головы для какого.

Плюс тут надо еще учесть, что в локализации большую роль играет то, что человек видит глазами. Тот же сталкер с ютуба проводил эксперименты над аудиофилами, когда с завязанными глазами человек не мог сказать, где щелкнули пальцами - спереди или сзади.

И еще очень важно - при повороте головы, звук настоящего источника меняется соответственно, а виртуального - нет. Это опять же рушит четкую локализацию. Но тут вроде есть решения, которые отслеживают повороты головы.

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

Была алса - надо было сделать фигню, которая использует алсу, но сама не умеет в звук и назвать ее пульса. А потом сделать пайпваер, который использует алсу и эмулирует пульсу. Это трындец

А как же jack audio? Зачем городить столько звуковых серверов, которые функционально одинаковые? Только-только пульса перестала мозг еб#ть, как придумали какую-то другую фигню, на которую срочно надо переходить

Пульса же умеет в плагины и в сеть. Не нравится формат плагинов? Ну так перепишите пульсу под новые плагины. Зачем городить новый звуковой сервер? Такое ощущение, что как только звуковой сервер стабилизируется - его выкидывают и заменяют какой-то другой фигней, которая следующие 10 лет стабилизируется

PS: вангую, что эта «киллер-фича» описанная в статье, есть не что иное, как BS2B DSP. Которому уже лет 25 и запускается она одной строчкой в пульсе:

load-module module-ladspa-sink sink_name=crossfeed master=alsa_output.pci-0000_00_1b.0.analog-stereo plugin=bs2b label=bs2b control=700,4.5
serg002 ★★★
()
Последнее исправление: serg002 (всего исправлений: 8)
Ответ на: комментарий от serg002

Была алса

Хватит ныть. ALSA это дрова на звуковуху, pipewire и pulseaudio это звуковые серверы. В Windows и OS X ровно такая же архитектура в целом, и по-другому нельзя сделать никак. А если кто-то думает что можно - у вас эффект Даннинга-Крюгера. Изучите матчасть и не нойте, и чушь не порите.

BS2B DSP

Не городи ерунды.

Зачем городить новый звуковой сервер?

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

Наконец, это нормально, адекватно и по уму сделанный звуковой сервер для Linux. Впервые в истории.

Pulseaudio и jack больше не нужны, не имеют смысла, нужны пока лишь как legacy, для случаев когда старое приложение некорректно работает с pipewire.

который использует алсу и эмулирует пульсу

Ох лол (((

ALSA это дрова звуковухи, ну блина вытатуируйте уже себе на лбу, или на заднице это, люди! Ну сколько можно! Чтобы выводить звук в звуковуху, тебе понадобятся ее дрова, вот чудеса то а? ААааааааа!

А если у тебя беспроводные наушники/колонки, то никакая ALSA не используется вообще, от слова совсем! Прикинь!

Он не эмулирует пульсу! У pipewire свой отдельный полноценный API, для всех задач достаточно только его, но не все приложения пока его поддерживают.

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

Есть pipewire-jack, который предоставляет API jack. Ставится и запускается как отдельная служба если это надо.

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

спатиалайзер

Он же «спейшалайзер», от «space», не? Корявый транслит выходит, как ни крути.

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

Не опять, а снова. Раньше такого не было, pipewire с рождения выпиливали на мороз первым делом, после установки системы. Про alsa api любой разработчик, писавший на нем, тоже пояснит много интересного о межполовых отношениях.

jack норм еще на фоне этого, но он жёстко сделан по pro audio юзкейсы, поэтому в бытовом применении не использовался, да его и бытовые приложения не поддерживают.

А тут с pipewire вообще красота - одно кольцо чтобы править всеми.

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

Лично мое мнение - надо перейти на английский и не дурить людям голову)))

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

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

фактически устоялось

Ну да, гуглится. Что ж, поздравим русский язык с очередным самбуфером.

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

Была алса - надо было сделать фигню, которая использует алсу, но сама не умеет в звук и назвать ее пульса.

От этого неверного утверждения идут остальные неверные выводы.

Были звуковые драйверы (алса) и зоопарк из разных приблуд для вывода звука из приложений через них (dmix, arts, esd, jack, pulseaudio,pipewire).

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

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

Не городи ерунды.

Тут даже в гугл идти не надобноть bs2b 2.2.1

ALSA это дрова звуковухи, ну блина вытатуируйте уже себе на лбу, или на заднице это, люди!

Так ведь до появления пульсы на алсе весь звук работал. Как так, без звукового сервера и работал?

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

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

А, так она даже не эмулирует, а просто работает поверх. Т.е мне нужно поставить пульсу да? Ставим пульсу, пайпваер, чтобы работали приложения, которые не поддерживают пайпваер. Вообще красота! Т.е, если я не поставлю пульсу, то у меня 99% приложений не будут звук играть

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

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

Ну не надо тебе - не пользуйся, не хочешь читать ходи невеждой. Тебя никто не заставляет. Я - пас. Иди мимо.

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

Что делать всё равно не понятно. Где копипаста в терминал или куда-то там? Нету? Ну тогда не нужно.

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

Видишь в заголовке написано - часть 4? Это, наверное, что-то означает. Что бы могло значить? Ну, наверное, есть еще 3 части.

Что с этим всем делать написано в 1 части:

Надо создать папку

~/.config/pipewire/pipewire.conf.d/

и положить туда файл с содержимым, которое приведено в статье (в конце статьи полный листинг файла). В конце каждой статьи я привожу полный листинг файла.

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

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

Слушай, ты сам сказал, что pipewire работает через api pulseaudio. Значит оно пульсу не эмулирует, а работает поверх

Ты ответь, чтобы работали приложения, которые используют pulseaudio, нужно устанавливать пульсу, чтобы pipewire через апи прокидывало звук в пульсу?

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

Слушай, ты сам сказал, что pipewire работает через api pulseaudio

Слушай, я ничего подобного не говорил, это дикая чушь которую я не знаю как ты придумал, а если ты вот настолько не понимаешь текст, то я боюсь тебе вообще что-то говорить, ты же все перевернешь и вообще все запутаются. Я не знаю, попробуй еще раз почитать что я говорил, например.

Ты ответь, чтобы работали приложения, которые используют pulseaudio, нужно устанавливать пульсу, чтобы pipewire через апи прокидывало звук в пульсу?

Я тебе русским языком написал. Надо устанавливать pipewire-pulse, это отдельный пакет от самого pipewire, но это не «настоящая» pulseaudio, а просто маленькое дополение к pipewire из его же комплекта, которое дает API pulseaudio. Само pulseaudio устанавливать не надо, от слова совсем.

То же самое с jack. Ставится pipewire-jack, работает как прослойка, дающая jack API, настоящий jack ставить не надо.

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

чтобы pipewire через апи прокидывало звук в пульсу?

Ну ты подумай, что ты пишешь

API нужно, чтобы ПРИЛОЖЕНИЕ, которое написано под pulseaudio а не под pipewire, могло работать с pipewire. Само pipewire работает непосредственно поверх драйверов ALSA, ему никакое pulseaudio не может быть нужно, зачем??

Если приложение, например плеер QMMP, уже содержит модуль вывода в pipewire (через его родной API), то ему достаточно голого pipewire, даже не нужно pipewire-pulse. Но пока еще не все приложения поддерживают pipewire напрямую.

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

По поводу голой ALSA и того что там «весь звук работал».

Конечно, ALSA естественно позволяет выводить звук, это его прямое предназначение, если pulseaudio и pipewire может через него выводить звук, то может и любое приложение, например тот же QMMP.

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

Во-первых - микширование потоков. Одно приложение захватить звуковуху, остальные не смогут выводить. Да, есть костыль под названием dmix, если ты посмотришь как именно он работает то поймешь почему это костыль, который позволяет микшировать потоки от разных приложений.

Но!!! Все приложения, при работе с dmix, должны отдавать поток только в одном формате, в котором настроен сам dmix! Например, частота дискретизации 48000 Гц разрядность 16 бит, значит твой плеер, браузер, мессенджер, блимкалка должны выводить поток именно 48000 Гц 16 бит и никак иначе. А если ты слушаешь mp3 или flac файл с частотой дискретизации 44100 Гц 24 бита, твой плеер обязан сам, как хочет, конвертировать поток в 48000 Гц 16 бит.

С pulseaudio и pipewire, приложение может отдавать поток с какими угодно параметрами, звуковой сервер берет на себя конвертацию в один общий для всех результирующий формат, потому что это просто отдельное приложение! Отдельное от твоего плеера и всех выводящих звук программ! А dmix работает внутри каждого процесса плеера и приложений, которые выводят звук. Внутрь каждого подтягивается экземпляр dmix, проще говоря.

Далее, если мы захотим прикрутить цепочку плагинов, как в этих статьях, к голой ALSA. Это можно сделать, как ты знаешь. Но! Эти плагины будут работать внутри процесса плеера и каждого приложения, воспроизводящего звук! Дубликаты всей цепочки плагинов внутри каждого процесса приложений, выводящих звук! Без звукового сервера, у тебя нету отдельного от всех процесса, куда можно загрузить плагины. А со звуковым сервером - они загрузятся один раз, в процесс звукового сервера, и все.

И, например, если поставить простейшую задачу - чтобы был общесистемный эквалайзер, подключенный LADPSA плагином к голой ALSA, и при этом был dmix, то еще большой вопрос, как это сделать, какой такой плагин будет сочетаться с dmix и как вообще рулить настройками такого эквалайзера по живому.

Далее, играет музыка, теперь мы подключаем bluetooth наушники. 1) звук на bluetooth устройство идет вообще не через звуковуху, ALSA тут как бы вообще уже не при делах, а используется BlueZ. 2) Тогда придется эмулировать ALSA API поверх BlueZ. 3) Бесшовно, налету переключиться со звуковухи на bluetooth устройство вообще будет никак нельзя, потому что в ALSA API вообще не предусмотрено какое-либо переключение, про bluetooth оно не знает ничего и не обязано знать, это драйверы звуковухи, а не блютуза.

А если есть звуковой сервер - то он и обеспечивает бесшовное для приложения переключение как между разными звуковухами, так и между bluetooth утсройствами. Это необходимый слой асбстракции между приложениями и физическими устройствами, которых может быть несколько!

То есть, подводя итог - выводится звук может и через голую ALSA, если у тебя одна звуковуха, нет блютуза, не нужны DSP цепочки плагинов и все приложения сами конвертируют свой поток под настройки dmix. А если этого не достаточно, а в 2025 году почти для всех недостаточно, то придется использовать звуковой сервер, как и делается вообще во всех современных ОС.

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

Вспомнил старые добрые времена, когда очень радовался, что у меня audigy4 с аппаратным микшированием и никакие сервера нафиг не нужны
Кстати, а сейчас что-то нигде и не пишут, есть оно или нет

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

Для usb звуковух это вообще бессмысленно кмк, потому что при аппаратном микшере придется N потоков вместо одного пихать через интерфейс.

А для профзвука DAW все микширует сама, зачем ей аппаратные микшеры, как минимум плагины на мастер тогда не повесишь.

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

А, погоди

В винде что, до сих пор DAW захватывают монопольный доступ?

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

Мой фокусрайт умеет одновременно выводить звук с ютуба и из DAW по ASIO
ASIO, кмк, шлёт поток напрямую в железо. Типа, в этом и смысл.
Венда (через что там у неё) явно шлёт каким-то другим путём - про ASIO она вообще не в курсе
Старая EMU, что характерно, умела одновременно только что-то одно
Вот, кстати, и юзкейс

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

С pipewire любая поддерживаемая alsa карта, абсолютно, может выводить ютуб и что угодно одновременно с любой DAW, при этом задержка как в винде с asio.

Вот это юзкейс чтобы ставить линукс.

А в винде постоянно какие-то загоны.

Да и jack может, но надо запускать костыль небольшой.

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

Я вообще не понимаю смысла этого asio, если в линуксе и маке просто штатный сервер работает как с высокими, так и с низкими задержками.

Это просто доение людей на пустом месте, типа покупайте более дорогие карты с asio. Хотя технически, с низкими задержками любая встройка работает.

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

Не знаю. Что до доения - обычно, у карт с ASIO и потроха посерьёзнее. Может это эффект плацебо, может нет, но мне кажется, дело не столько в задержках, сколько в стабильности и общей производительности. В оффтопике некоторые DAW умеют и через DirectSound работать. И через ASIO4All. Задержки лично для меня не очень важны, записываю я всё равно с директ-мониторингом. А сводить можно и с задержками. Веселье же начинается, когда в проекте много дорожек, исерты, ауксы, что-то на мастере и т.п. Я, честно, не в курсе просто, кто-то пробовал собирать под линуксом проект на 20+ дорожек на встройке? Как оно, не тормозит, не падает, в звуке артефактов нет? Потому что в оффтопике - есть. И с ASIO4All и на совсем бомж-интерфейсах с настоящим ASIO от вендора. А на RME, как докладывают владельцы - всё стабильно как часы. Поэтому он и стоит как хорошие часы. Швейцарские. И вот кто виноват, система, кривой софт или железо? Я не знаю, мне самому интересно.

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

Что до доения - обычно, у карт с ASIO и потроха посерьёзнее

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

Задержки лично для меня не очень важны, записываю я всё равно с директ-мониторингом

Для меня теперь тоже, я окончательно отказался от игры через плагины, мой новый проект ушного гитарного усилителя позволяет играть с нулевой задержкой в наушники с аналоговой обработкой, при этом подавать туда же подклад из DAW, и одновременно писать DI с гитары в DAW. Задержка DAW вообще меня при этом не волнует.

Я, честно, не в курсе просто, кто-то пробовал собирать под линуксом проект на 20+ дорожек на встройке?

У меня слабый проц очень, на вот том синтовом треке Roxette порядка 10 дорожек, и проект грузит систему почти под завязку, временами заикается, когда загрузка проца прыгает под сотню. Но! Я не очень понимаю, причем же тут сама звуковуха. Ей то что, она просто получает сведенный поток от DAW, в любом случае, да хоть 50 дорожек. Я пока не вижу, за счет чего количество дорожек должно кардинально влиять на нагрузку на железо звуковухи.

Я может не прав, но я думаю, что если при работе с проектом загрузка проца не превышает 50%, то все будет плавно хоть на встройке. Главное чтобы железо компа тянуло.

А на RME, как докладывают владельцы - всё стабильно как часы.

Что значит на RME, у них вместо ЦПУ - RME всунуто? Вряд ли. Кто-нибудь с мегамонстром в качестве ЦПУ скажет что на встройке 20 дорожек в Ardour не тупит, ну и что теперь, о чем это говорит я не знаю.

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

а еще пайпварь можно научить самостоятельно запускать wireplumber и pipewire-pulse при старте, без всяких сустемд, очень удобно. Причем оно кажется будет еще и завершать их при финише, супервизор прямо

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

Там люди применяют мозг, на серьезном уровне. Аж непривычно.

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

Вот прямо сейчас на ноутбуке открыт проект на 39 дорожек, всё играет без малейших артефактов. Звук выводится через PipeWire, который для Reaper-а притворяется PulseAudio.

slepoy_pew
()

Есть ли GUI-приложения для настройки PipeWire, чтобы менять объём буфера, частоту дискретизации и вот это всё? Типа как qjackctl для jack? Чтобы не пердячиться со всеми этими конфигами.

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

Звучит абсолютно логично, но поступают сигналы с мест, что на практике всё сложнее. Очень может быть, что дело при этом - в драйверах. Или в ДАВе. Или в чём-то ещё. Хочется разобраться.
Кстати, ещё ведь как может быть: под линуксом, мягко говоря, меньше людей всерьёз музыку сводит. Те у кого в оффтопике вылезает всякое необычное, их, возможно, всего 5%, а в абсолютных числах это дофига.
Из своего точно заметил, если например сэмплы в проекте в другой частоте, или импульсы, если пользуешься оверсемплингом в некоторых плагинах - обязательно жди беды.

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

Есть ли GUI-приложения для настройки PipeWire, чтобы менять объём буфера, частоту дискретизации и вот это всё? Типа как qjackctl для jack?

Тем же qjackctl или из DAW. В Ardour например это менять можно.

Своего чего-то пока нет (((

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

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

Ну это же чисто нагрузка на проц, в этих кейсах именно DAW или плагин делает ресемплинг. Звуковуха должна получать все в формате проекта уже, по идее.

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

Из консоли это вот так

$ pw-metadata -n settings 0 clock.force-rate 96000
$ pw-metadata -n settings 0 clock.force-quantum 128

Я просто перед работой с DAW запускаю баш-скрипт и он это настраивает.

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

Видишь в заголовке написано - часть 4? Это, наверное, что-то означает. Что бы могло значить? Ну, наверное, есть еще 3 части.

Нету ссылок на предыдущие части. Выглядит так, как будто их нету.

Полный конфиг-файл, содержимое этого листинга надо поместить в файл по адресу ~/.config/pipewire/pipewire.conf.d/spatializer.conf и перезапустить pipewire.

Есть один момент

                       config = {
                           filename = "/home/curufinwe/dtf_b_nh2.sofa"
                       }

/home/curufinwe ? А ~/ не сработает? Просто /home/curufinwe сработает только для пользователей curufinwe. Если «поместить и перезапустить», как сказано.

А где брать dtf_b_nh2.sofa? Нужно найти 3 и перечитывать 4 стати размером с Войну и мир?

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

А ~/ не сработает?

Должно работать

А где брать dtf_b_nh2.sofa?

Да нет же, прямо в этой статье написано, на самом видном месте

Я использую вот этот файл https://sofacoustics.org/data/database/ari/dtf%20b_nh2.sofa (прямая ссылка)

Прямую ссылку даже сразу дал, заботился о вас, а вы все равно не видите…

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

У меня по гайду вываливается следующее: debian stable

Jan 26 02:13:04 debian-home pipewire[32381]: mod.filter-chain: invalid plugin type 'sofa'
Jan 26 02:13:04 debian-home pipewire[32381]: mod.filter-chain: can't load graph: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32381]: pw.conf: 0x55f3b32fd1a0: could not load mandatory module "libpipewire-module-filter-chain": Invalid argument
Jan 26 02:13:04 debian-home pipewire[32381]: default: failed to create context: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32387]: mod.filter-chain: invalid plugin type 'sofa'
Jan 26 02:13:04 debian-home pipewire[32387]: mod.filter-chain: can't load graph: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32387]: pw.conf: 0x560692f441a0: could not load mandatory module "libpipewire-module-filter-chain": Invalid argument
Jan 26 02:13:04 debian-home pipewire[32387]: default: failed to create context: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32414]: mod.filter-chain: invalid plugin type 'sofa'
Jan 26 02:13:04 debian-home pipewire[32414]: mod.filter-chain: can't load graph: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32414]: pw.conf: 0x556b544e11a0: could not load mandatory module "libpipewire-module-filter-chain": Invalid argument
Jan 26 02:13:04 debian-home pipewire[32414]: default: failed to create context: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32421]: mod.filter-chain: invalid plugin type 'sofa'
Jan 26 02:13:04 debian-home pipewire[32421]: mod.filter-chain: can't load graph: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32421]: pw.conf: 0x5640cbb001a0: could not load mandatory module "libpipewire-module-filter-chain": Invalid argument
Jan 26 02:13:04 debian-home pipewire[32421]: default: failed to create context: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32430]: mod.filter-chain: invalid plugin type 'sofa'
Jan 26 02:13:04 debian-home pipewire[32430]: mod.filter-chain: can't load graph: Invalid argument
Jan 26 02:13:04 debian-home pipewire[32430]: pw.conf: 0x5654137231a0: could not load mandatory module "libpipewire-module-filter-chain": Invalid argument
Jan 26 02:13:04 debian-home pipewire[32430]: default: failed to create context: Invalid argument
Jan 26 02:13:05 debian-home systemd[3905]: Failed to start pipewire.service - PipeWire Multimedia Service.
serg002 ★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.