Есть два способа ответить на этот вопрос.
- Либо попробуйте заставить jack работать с pulseaudio ... остальная часть этого вопроса объяснит, как это сделать.
- Или... не пытайтесь использовать как pulseaudio, так и jack, просто замените их на трубопроводную проволоку: предполагается, что pipewire будет "новым pulseaudio" (я думаю, в некоторых моментах он должен заменить pulseaudio, и он уже гораздо менее глючный, чем pulseaudio, и поддерживает больше опций Bluetooth). Pipewire эмулирует как pulseaudio, так и jack одновременно и может легко использоваться с pulseaudio/ qjackctl/... для соединения приложений pulseaudio и jack вместе (в принципе, pipewire не делает большой разницы между приложениями pulseaudio и jack ... большую часть времени я даже не уверен, работает ли приложение, которое я использую, под управлением jack или pulseaudio). Если вы действительно хотите испытать боль и использовать pulseaudio + jack... остальная часть этого вопроса для вас.
Некоторое время назад я написал команду, и кто-то сообщил мне, что после того, как он попробовал все решения здесь, ему не повезло. Но это решение сработало для него, поэтому я опубликую его здесь на случай, если кому-то еще можно будет помочь. NB: Я не утверждаю, что это решение является самым элегантным, но для меня оно неплохо справилось со своей задачей:
- Я могу запустить / остановить jack, просто нажав кнопку start / stop, и переключение между pulseaudio и pavucontrol происходит автоматически.
- он автоматически подключает все текущие игровые программы к разъему (вот почему существует этот уродливый grep, дайте мне знать, если у вас есть лучшее решение).
- это также гарантирует, что приложение pulseaudio также может использовать микрофоны
Это решение может быть немного улучшено путем правильной выгрузки модулей при выходе из Jack, возможно, с помощью предложенного уродливого grep здесь, но на самом деле я не нашел для себя никакой пользы.
Обратите также внимание, что я даю довольно подробные инструкции о том, как отлаживать такие проблемы.
Мое решение (см. теорию ниже, чтобы понять, почему оно работает / терпит неудачу, и отладить любую потенциальную проблему)
Устанавливать:
$ sudo apt install jack2 pavucontrol qjackctl pulseaudio-module-jack.
Запустите qjackctl:
$ qjackctl
Нажмите на Setup
, и убедитесь, что выходной интерфейс правильный (например, если у вас есть выход HDMI, эта проверка может быть важна). В моем случае я просто использую значение по умолчанию и вернусь сюда, если у меня возникнут какие-то проблемы позже.
Затем на вкладке дополнительно я заменил префикс сервера jackd
с pasuspender -- jackd
. Предполагается, что это говорит pulseaudio временно разрешить Джеку управлять звуковой картой. Я не уверен, действительно ли это необходимо, но, думаю, это не повредит:
Затем на вкладке "Параметры" введите Execute script after Startup
следующий код:
pactl load-module module-jack-sink && pactl load-module module-jack-source && pactl set-default-sink jack_out && pacmd set-default-source jack_in && pacmd list-sink-inputs | grep index | sed 's/ *index: *//g' | xargs -I{} pacmd move-sink-input "{}" jack_out
Цель этой команды - создать новые выходные данные (приемник) для pulseaudio, которые указывают на jack, чтобы включить этот новый приемник по умолчанию (все вновь открытые приложения будут записывать в jack), а также изменить выходные данные всех существующих приложений, чтобы убедиться, что они указывают на jack.
Затем, чтобы убедиться, что pulseaudio перезапускается при закрытом разъеме, я также добавил в поле Execute script after Shutdown
:
pacmd suspend false
Вот и все! Теперь вам просто нужно сохранить, нажав на Apply
и нажать на Start
для начала Джек:
Вы должны увидеть что-то подобное, если это работает (и, конечно, никаких ошибок):
Немного теории, чтобы понять, почему это работает или почему это терпит неудачу
Таким образом, по сути, вы не можете воспроизводить звук, потому что только одна программа может воспроизводить звук одновременно на одной и той же звуковой карте. Поэтому, когда Джек играет, pulseaudio блокируется. Теперь также выясняется, что большинство настольных приложений могут взаимодействовать с pulseaudio, но не с Jack. Так что, когда Джек включен, у вас просто больше нет звука. Хитрость заключается в том, чтобы направить трафик pulseaudio на разъем с помощью чего-то подобного:
application -> pulseaudio -> Jack -> sound card
Обратите внимание, что все ссылки должны быть правильно настроены. Теперь мы увидим, как они настроены и как проверить, правильно ли они настроены.
Итак, чтобы создать ссылку pulseaudio -> Jack
мы собираемся загрузить модуль, который создает новый приемник pulseaudio (т.Е. виртуальное устройство вывода), называемый Jack sink
: таким образом, любые приложения, записываемые в этот приемник, будут перенаправлены на Jack. У вас может быть несколько уже существующих приемников, например, один для внутреннего аудио, а если у вас есть Bluetooth-гарнитура, у вас может быть и один приемник для нее. Чтобы проверить, на каком приемнике на самом деле воспроизводится приложение, установите и запустите pavucontrol
(pavucontrol
в любом случае это очень полезно для всех вещей, связанных со звуком, поскольку вы можете управлять практически всем с его помощью). Вы можете просмотреть список приемников на вкладке с именем like Input devices
(извините, если перевод плохой), в моем случае у меня сейчас есть 2 раковины (разъем еще не загружен):
Если у вас только один приемник, вы можете не увидеть ничего интересного, но если у вас несколько приемников, вы можете проверить на первой вкладке, какое приложение воспроизводится на каком приемнике (здесь вы видите, что firefox воспроизводится на моей bluetooth-гарнитуре), и вы можете изменить его, если это необходимо:
Так что, если у вас есть какие-то проблемы, вы можете:
- ссылка
pulseaudio -> jack
: убедитесь, что у вас есть приемник, соответствующий разъему (если нет, попробуйте выполнить команду вручную pactl load-module module-jack-sink
это должно было выполняться автоматически. Если это не удастся, убедитесь, что вы установили pulseaudio-module-jack
, и в конечном итоге перезапустить pulseaudio, просто убив его killall pulseaudio
. Не беспокойтесь, не нужно перезапускать pulseaudio, он возрождается автоматически.). Также убедитесь, что громкость не равна 0% и что канал не отключен:
- ссылка
application -> pulseaudio
: убедитесь, что ваши приложения записываются на этот приемник. Если нет, вы можете вручную изменить приемник (но сценарий запуска должен был автоматически изменять приемник) таким образом:
- ссылка
jack -> sound card
: Если у вас все еще есть проблемы (эта часть также может касаться проблем, возникающих у вас с программным обеспечением, которое записывает на jack напрямую, например zynaddsubfx
), ознакомьтесь с Graph
часть Джека:
Вы должны начать с того, что все узлы будут упакованы вместе, но вы можете переместить их, чтобы их было легче увидеть. Затем убедитесь, что все приложения, которые вы хотите использовать, подключены к system
(в моем случае zynaddsubfx
не был подключен автоматически). ПРИМЕЧАНИЕ: если у вас более старая версия QJackctl, то вместо этого у вас могут быть вкладки. Но это то же самое: у вас будут зеленые входы / выходы на вкладке "Разъем", которые вы можете подключить вручную, фиолетовые будут на вкладке "Alsa", а красные - на вкладке "MIDI" ... но на самом деле все внешние MIDI-устройства, которые вы подключаете, появятся на вкладке Alsa: причина в том, что существует два вида "MIDI": устаревший Alsa Midi (порты являются глобальными для системы) и более поздний Jack Midi (каждое приложение может иметь свой собственный midi-входы/выходы).
- Проблемы с MIDI: Теоретически, чтобы получить midi, вы можете просто подключить фиолетовые входы к фиолетовым входам (или на вкладке Alsa в более старой версии, да, я знаю, это странно, что вам нужно перейти на вкладку Alsa, а не Midi, чтобы получить Midi (!!!), но это из-за разницы между Alsa MIDI и более поздним, но менее используемым Jack Midi). Однако оказывается, что по каким-то странным причинам,
zynaddsubfx
имеет некоторые странные значения по умолчанию и будет отображаться как "Midi /red" вместо "Alsa /green", что делает невозможным подключение к внешнему midi-устройству. Точнее, если вы запустите zynaddsubfx
из командной строки без какой-либо опции или с:
zynaddsubfx -I alsa -O jack
(что означает ввод с Alsa MIDI, вывод на разъем) это не должно быть проблемой, вы сможете подключить MIDI-устройства:
Однако, если вы запустите его графическим способом, автоматически запустится запись Jack по умолчанию zynaddsubfx -I jack -O jack
вместо... И у него будет проблема с тем, что zynaddsubfx
ввод будет создан на вкладке red/MIDI, в то время как фактическое внешнее MIDI-устройство находится на вкладке violet/Alsa. Таким образом, это означает, что вы не сможете сопоставить свою внешнюю midi-клавиатуру с zynaddsubfx
:
Поэтому решение состоит в том, чтобы запустить zynaddsubfx
использование командной строки без параметров или с zynaddsubfx -I alsa -O midi
и все должно работать!