Linux две звуковых карты

JACK и несколько звуковых карт

JACK — единственная звуковая система для UNIX систем, позволяющая коммутировать звуковые потоки на уровне приложений (самая распространённая на сегодняшний день система — Pulse Audio — умеет коммутировать звук только на уровне устройств, то есть можно перекинуть MP3-проигрыватель со внутренней звуковой карты на внешнюю, но нельзя перекинуть в Skype). Поэтому JACK является основой рабочей станции любого интернет-радиовещателя, использующего Linux.

Основная проблема JACK в том, что он умеет работать только с одной звуковой картой. Для вещания обычно используется внешнее звуковое устройство, подключаемое по USB, или USB микрофон, потому что встроенные в ноутбуки или другие компьютеры звуковые карты, какими крутыми бы они ни были, дают отвратительный звук с сильными шумами. Для переключения между внешним и внутренним устройствами нужно перезапускать JACK, а в случае с использованием внешнего USB микрофона вообще не ясно: проигрывать в него нельзя и проигрывать, получается, не во что.

Уточнение: при постоянном использовании JACK со внешним USB микрофоном можно использовать ключи -P и -C командной строки; использовать разные карты для ввода и вывода звука JACK умеет. Однако если нужно отключать микрофон на ходу, то без описанной здесь схемы не обойтись.

Пара слов об архитектуре JACK

Здесь надо сделать отступление и вкратце объяснить, как работает коммуникация в JACK. JACK оперирует портами. У звуковой карты обычно есть два выходных порта: левый и правый, называются они «system:playback_1» и «system:playback_2», и есть два входных порта: «system:capture_1» и «system:capture_2» (это микрофон или линейный вход, я не знаю как они делятся между собой).

Включение внешней звуковой карты в JACK

Для того, чтобы JACK увидел ещё одну звуковую карту, используются утилиты alsa_in и alsa_out , которые создают новые порты и тупо ретранслируют туда вход или выход указанной звуковой карты. (Этот подход оказался для меня несколько неожиданным: я долго пытался найти способ «скрестить» две звуковые карты средствами ALSA — и нашёл, но он оказался слишком сложным для моего понимания.)

Итак, чтобы подружить JACK и внешнюю звуковую карту, достаточно запустить alsa_out , указав её имя:

Чтобы узнать имя звуковой карты, используется утилита aplay :

$ aplay -L front:CARD=Intel,DEV=0 HDA Intel, ALC269 Analog Front speakers . front:CARD=USB,DEV=0 E-MU 0202 Front speakers 

(В этом примере видны две карты: «Intel» и «USB», эти названия и следует указывать в качестве значений параметра -d .)

Читайте также:  Linux crontab user file

Теперь в списке портов видны два новых:

$ jack_lsp system:playback_1 system:playback_2 . alsa_out:playback_1 alsa_out:playback_2 

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

$ jack_connect "MPlayer .*:out_0" "alsa_out:playback_1" $ jack_connect "MPlayer .*:out_1" "alsa_out:playback_2" 

Если теперь убить процесс alsa_out или отключить внешнюю звуковую карту — она перестанет издавать звук, приложение alsa_out завершится, но больше ничего плохого не произойдёт: программы, работающие со звуком, не зависнут и JACK перезапускать нужды не будет.

Автоматическая коммутация

JACK не умеет сам определять что с чем коммутировать (философия UNIX: JACK не этим занимается). Для автоматизации этого процесса используется утилита jack.plumbing , которая обычно висит в фоне и коммутирует потоки в соответствии с правилами из специального текстового файла, который называется ~/.jack.plumbing . Автоматическая отправка MPlayer во внешнюю и внутреннюю звуковые карты выглядит так:

# внутренняя карта (connect "MPlayer .*:out_0" "system:playback_1") (connect "MPlayer .*:out_1" "system:playback_1") # внешняя карта (connect "MPlayer .*:out_0" "alsa_out:playback_1") (connect "MPlayer .*:out_1" "alsa_out:playback_1") 

Теперь при подключении внешней звуковой карты MPlayer сразу будет начинать играть через неё, в дополнение ко внутренней. (Можно использовать во втором блоке директиву connect-exclusive , тогда при подключении ко внешней карте он будет отключен от внутренней, однако на практике при проведении прямых эфиров эксклюзивное подключение бесполезно, т.к. MPlayer должен играть и в звуковую карту, и в Skype, и в эфир радиостанции — это как минимум три неэксклюзивных направления; на практике проще временно заглушить внутреннюю карту с помощью утилит alsamixer или amixer .)

Примерный алгоритм работы

Для начала прямого эфира у меня есть скрипт, который выполняет следующие действия:

  1. Глушит внутреннюю карту утититой amixer .
  2. Запускает в фоновом режиме утилиты jack.plumbing , alsa_out и alsa_in , если они не запущены.
  3. Запускает в фоновом режиме darkice (вещание в радиостанцию).
  4. Запускает утилиту jack_meter для наблюдения за уровнем записи.

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

Источник

Линукс: используем 2 звуковые карты

Так случилось, что у меня наушники со встроенной звуковой картой и USB подключением. По установке Gentoo возникла необходимость упорядочить использование нужной мне звуковухи в той или иной программе. Оказалось, что необходим вдумчивый диалог с Гуглем.
Что интересно, имеет место быть полный разнобой конфигурационных настроек для разных программ и неочевидность параметров настройки для ОС.

Читайте также:  Как установить java линукс

Далее приведу свой файл «/etc/modprobe.d/alsa.conf» а также способы задания нужной звуковухи в mplayer, mpg321, amarok и skype.
Как говориться, добро пожаловать в наш зверинец.
Итак, прописываем обе звуковые карты и явно задаем им индексы. По умолчанию ставим наушники.

alias char-major-116 snd
alias char-major-14 soundcore
#
alias /dev/mixer snd-mixer-oss
alias /dev/dsp snd-pcm-oss
alias /dev/midi snd-seq-oss

## — ALSACONF version 1.0.14rc1 —
## card 1
alias snd-card-0 snd-usb-audio
alias sound-slot-0 snd-card-0

## card2
alias snd-card-1 snd-atiixp
alias sound-slot-1 snd-card-1

alias sound-service-1-0 snd-mixer-oss
alias sound-service-1-3 snd-pcm-oss
alias sound-service-1-12 snd-pcm-oss

options snd-usb-audio index=0 #индекс наушников
options snd-atiixp index=1 #индекс встроенной звуковой карты ноута

options snd cards_limit=3

После перезагрузки модулей (update-modules -f) и звука (/etc/init.d/alsasound restart) должно заработать по идее. Наушники определяются индексом 0 а встроенная карта индексом 1. Например, для настройки уровня звука надо набрать «alsamixer -c1» для встроенной звуковой карты. Для наушников можно без дополнительных параметров.

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

mplayer -ao alsa:device=hw=1.0 filename

Плохо, то что данный параметр явно не приведен в мануале и Гуглится тоже неважно.

Казалось бы, мы теперь знаем как задать звук для mpg321. Но не совсем! Для mpg321 немного по-другому:

mpg321 -a hw:1,0 filename

Как видим синтаксис почему-то уже другой. Ладно запомнили. Теперь попробуем сделать то же самое в amarok, xine или kaffein. Искомая строка теперь уже совсем другая! В нужном месте в окне настроек вводим:

А с какого, собственно говоря такой разнобой? Неужели нельзя выработать единый формат этих самых настроек, xml файл там, или еще что?
Ну, и наконец добрые слова в адрес Skype. С версии 1.4 кажется, там звуковая карта выбирается по имени из окна настроек.
Надеюсь сэкономить время тем, кто оказался в моей ситуации, хотя сейчас wiki движки гораздо полнее нежели 4 года тому назад и хорошо индексируются.
За рамками мини-обзора осталось, как привязать горячие клавиши к программам и WM-ам. Попробую об этом в другой раз написать.

Источник

Читайте также:  Linux see available memory

Несколько звуковых карт одновременно

Как вывести звук из разных программ (или нескольких копий одной программы) на разные звуковые устройства? У меня четыре звуковые карты и я хочу проигрывать на каждой свой сэмпл.

Есть ли, например, аудиоплееры, у которых в настройках можно выбрать выходное устройство?

Скорее придётся поискать плеер, у которого нельзя выбрать выходное устройство.

mplayer -ao alsa:device=hw=1.0 groovy.mp3

О, слава командной строке. Ладно, будем так обходиться, спасибо.

Зачем «обходиться»? Как выше уже писали: настройка устройства вывода есть почти у всех плееров. Выбирай любой понравившийся и смотри в настройках.

Можно поставить pavucontrol и там настраивать. Сам юзаю уже давно с двумя аудиокартами.

Можно править /etc/asound.conf и ~/.asound. Или ~/.asound2, я не помню. В Mageia Linux и Opensuse Linux есть GUI для этого файла, например чтобы мышкой сделать HDMI Audio устройством 0, а не 1.

Медиаплееры с выбором звуковой карты: SMplayer, VLC, Amarok, XMMS. Не знаю. Кажется, проще перечислить БЕЗ выбора: Banshee, Kaffeine, Totem.

В общем случае ответ на вопрос «как» зависит от того, альса у тебя или пульса. Это я так, на всякий случай, для обоих вариантов решения уже назвали.

Ну, например, в Rhythmbox устройство вывода не настраивается.

Установил много всяких аудиоплееров.

Cynthiune — настроек вывода нет.

Clementine — настроить можно, но проигрывать звук этот плеер отказался («Обнаружена общая ошибка потока GStreamer»). Или я чего-то в нём не понял.

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

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

Капец ты каких-то маргинальных плееров понаставил. Я про такие даже и не слышал (кроме ритмбокса, клементина и влс).

HerrWeigel ★★★★ ( 16.06.14 15:23:11 MSK )
Последнее исправление: HerrWeigel 16.06.14 15:23:55 MSK (всего исправлений: 1)

Источник

Оцените статью
Adblock
detector