Одним из новшеств Ubuntu 10.10 стал переход с «голой» ALSA на PulseAudio. Ранее постилось много советов прибить и удалить его для решения проблем, однако теперь PulseAudio стабилен, с ним не шипят колонки ;), и он способен на такое, что не снилось Alsa :)
В статье я с самого начала расскажу что это такое и как оно работает, а так же:
- Как переключить весь звук на USB-колонку на закрывая приложений (usb hotplug);
- Как выбрать порт звуковой карты для вывода звука (колонки ноутбука/наушника, LineOut/Наушники);
- Как выбрать профайл звуковой карты (маппинг физических портов: 5.1 или стерео+lineIn?);
- Как управлять громкостью и усиливать тихий сигнал (!);
- Как сделать Skype громче музыки?
И представлю своё решение, призванное упростить управление PulseAudio ;)
Кратко о PulseAudio
Обзор хорошо написан в нашей википедии. Приведу сводный список основных отличий от Alsa:
- PulseAudio — «слой звуковой абстракции», принимающий звуковой поток от приложений и передающий его Alsa;
- PulseAudio оперирует объектами и позволяет перенаправлять звуковой поток между ними (роутинг);
- PulseAudio — демон, обычно запускаемый от имени пользователя;
- Позволяет передавать звук по сети и «расшаривать» микрофоны, установленные на других компьютерах.
- Теперь при отключении USB-колонки ни одна прога не подвиснет, а будет переброшена на другую доступную карту :)
GUI инструменты
Если Вы читаете эту статью чтобы решить пару нюансов и не вникать — могу порекомендовать попробовать GUI-tools, описанные на странице PulseAudio. С помощью
pavucontrol
можно будет быстро выбрать устройство записи «по умолчанию» (Input Devices, кнопка справа «Set as fallback») и Skype будет работать :) Также pavucontrol
позволяет управлять громкостью общей и отдельных приложений. Основные понятия PulseAudio
Card, Sink & Source
Известно, что у звуковой карты два типа гнёзд: входы (line in, микрофон) и выходы (наушники, line out, S/PDIF). В типовой конфигурации для каждой имеющейся звуковой карты и её «гнёзд» PulseAudio создаёт следующие объекты:
- Card. Объект представляет физическую звуковую карту со всеми её входами и выходами;
- Sink (англ. низина) — «сток», принимающий звуковой поток. Представляет выход звуковой карты: линейный выход, наушники, колонки ноутбука;
- Source (англ. источник) — источник звука, создающий звуковой поток. Представляет вход звуковой карты: линейный вход, микрофон.
В PulseAudio задаётся «default Sink» и «default Source»: объекты, используемые по умолчанию для свежезапущенных приложений.
Замечу, что Sink не обязательно должен описывать физический порт звуковой карты: это абстракция приёмника потока звука. PulseAudio — штука высокоуровневая и позволяет создавать весьма «хитрые» объекты: например, Sink типа 'NULL' (реализуемый модулем PulseAudio module-null-sink) просто поглотит звук, а модуль module-pipe-sink позволит передавать звуковой поток через файл FIFO. Также можно создавать сетевые Sink'и, ведущие multicast-вещание или передающие звуковой поток определённому хосту. Всё это реализуется модулями PulseAudio.
Итак, звук проигрывается через «Sink», а записывается через «Source».
Sink-Input & Source-Output
- Sink-Input. Когда приложение, поддерживающее PulseAudio, собирается проигрывать звук — оно направляет свой вывод в один из объявленных Sink'ов и становится «входом Sink'a»: Sink Input. Приложение может создавать несколько потоков вывода, создавая отдельные Sink-Input'ы для каждого потока.
- Source-Output. Если же приложение собирается принимать звук из некоторого Source (звукозапись) — оно становится «выходом Source'а»: Source-Output.
Каждый Sink-Input по умолчанию связываться с одним из Sink'ов и передаёт звуковой поток. PulseAudio далее определяет с чем связан Sink (например, звуковая карта) и передаёт его по назначению.
Существует особый тип Source'а: Monitor. Для каждого Sink'а может быть создан отдельный монитор, позволяющий вести запись. Так, получается запись «звука из колонок».
Итак, медиаплеер создаёт Sink-Input, а Skype — и Sink-Input, и Source-Output.
module, client, sample
В рамках статьи — чисто информационные :)
- Module. Загруженный модуль PulseAudio. Например, загрузка module-alsa-sink с заданием пераметров, указывающих на устройство Alsa — создаст Sink, связанный с этим устройством. Существуют и другие модули, создающие объекты PulseAudio, позволяющие управлять им, использовать FIFO для обмена звуковым потоком и многое другое;
- Client. Приложение, подключившееся к PulseAudio. Может создавать потоки Sink-Input и Source-Output и управлять демоном PulseAudio.
- Sample. Звуковой сэмпл, загруженный в PulseAudio для быстрого воспроизведения. Может использоваться для проигрывания стандартных звуков. Например, x11 bell. Могут проигрываться по команде от модуля, клиента или из консоли.
ALSA → PulseAudio
Конечно же, сперва нужно убедиться что PulseAudio установлен и запущен:
sudo apt-get install pulseaudio
pulseaudio --start -D
Далеко не каждое приложение умеет работать с PulseAudio напрямую: обычно они умеют использовать Alsa. Для таких приложений нужно сообщить, чтобы Alsa перенаправляла их звуковые потоки к PulseAudio.
Для этого в файл
~/.asoundrc
вставляем следующие строки (Которые, кстати, вылечат микрофон Skype'а! если ещё отключить «Позволить скайп автоматически подстраивать громкость» — подсказывает aim):pcm.pulse { type pulse }
ctl.pulse { type pulse }
pcm.!default { type pulse }
ctl.!default { type pulse }
Первые две строки создадут виртуальные устройства ALSA с именем 'pulse' для ввода и вывода, а также устройство контроля (громкости). Следующие две — определяют их как «по умолчанию»: теперь все приложения вместо Alsa будут использовать PulseAudio через специальный плагин (и ничего не подозревать).
Для применения измений нужно перезапустить звуковые приложения. Свежезапущенные приложения подхватят изменения сами.
UPD: yuretsz подсказывает, что приложения, использующие OSS (
/dev/dsp
), нужно запускать через враппер padsp [options] PROGRAM [ARGUMENTS ...]
.Управление PulseAudio: pactl
Управление PulseAudio осуществляется с помощью команды pactl, про которую нельзя сказать что она удобная и продвинутая :) однако тренироваться будем с ней.
Осмотр владений
Для начала давайте посмотрим что у нас есть: какие объекты определены в PulseAudio. Рекомендую запустить фоновую музыку чтобы было на что смотреть :)
Команда
pactl list
покажет длинный список существующих объектов.У каждого объекта есть набор описывающих его полей, а также специальное поле «Properties»: список key-value свойств (обычно строковых).
У всех объектов есть index (Sink #0) — уникальный номер объекта определённого типа. Также многие объекты имеют имена (Name: ): index и Name можно использовать для обращения к конкретному объекту.
Рекомендую присмотреться к полям объектов Sink и Source: по умолчанию они описывают Ваше железо.
Покажу свой пример:
Sink #1 — Sink: вопроизводит звук State: RUNNING — Sink работает: через него проигрывается музыка Name: alsa_output.pci-0000_00_1b.0.analog-stereo — Уникальное имя Sink'а Description: Internal Audio Analog Stereo — Текстовое описание Sink'а Driver: module-alsa-card.c — Используемый "драйвер": модуль PulseAudio, создавший этот Sink Sample Specification: s16le 2ch 44100Hz — Параметры дискретизации, количество каналов, кодирование. Channel Map: front-left,front-right — Звуковые каналы Owner Module: 5 — index модуля, создавшего этот Sink Mute: no Volume: 0: 26% 1: 26% — Громкость обоих каналов 0: -35.42 dB 1: -35.42 dB balance 0.00 Base Volume: 100% — "Базовая громкость": указывает на некоторую "неусиленную" громкость устройства вывода 0.00 dB Monitor Source: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor — Имя "монитора", связанного с этим Sink (виртуальный Source: позволяет писать "звук с колонок") Latency: 161458 usec, configured 210000 usec — Параметры звукового лага Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY Properties: ... — Всякие свойства. Там можно увидеть имя устройства Alsa, куда этот Sink отдаёт звук Ports: — Порты Sink'а: соответствуют физическим портам звуковой карты analog-output: Analog Output (priority. 9900) — Выход наушников analog-output-speaker: Analog Speakers (priority. 10000) — Колонки ноутбука Active Port: analog-output-speaker — Текущий выбранный порт: музыка у меня играет из колонок ноута. Card #1 — Физическая звуковая карта Name: alsa_card.pci-0000_00_1b.0 Driver: module-alsa-card.c Owner Module: 5 Properties: ... Profiles: — Профили звуковой карты: выбранный пресет маппинга физических портов. output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority. 6000) output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority. 6060) output:iec958-stereo: Digital Stereo Duplex (IEC958) (sinks: 1, sources: 0, priority. 5500) output:iec958-stereo+input:analog-stereo: Digital Stereo (IEC958) Output + Analog Stereo Input (sinks: 1, sources: 1, priority. 5560) input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority. 60) off: Off (sinks: 0, sources: 0, priority. 0) Active Profile: output:analog-stereo+input:analog-stereo Source #1 — Source: позволяет записывать звук State: IDLE — Source бездействует: я ничего не записываю :) Name: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor Description: Monitor of Internal Audio Analog Stereo Driver: module-alsa-card.c Sample Specification: s16le 2ch 44100Hz Channel Map: front-left,front-right Owner Module: 5 Mute: no Volume: 0: 100% 1: 100% 0: 0.00 dB 1: 0.00 dB balance 0.00 Base Volume: 100% 0.00 dB Monitor of Sink: alsa_output.pci-0000_00_1b.0.analog-stereo — Этот Source создан как монитор 1го Sink'а: из него можно записывать то что слышно из колонок Latency: 0 usec, configured 1999818 usec Flags: DECIBEL_VOLUME LATENCY Properties: ...
pactl & pacmd
Кроме pactl существует другая утилита для управления PulseAudio:
pacmd
.Если к PulseAudio подключен модуль module-cli-protocol — создаётся UNIX-сокет на котором висит PulseAudio-shell. Это во многом похоже на telnet :)
Шелл принимает текстовые команды и исполняет их.
pacmd help
покажет список доступных команд.Проблема в том, что
pactl
умеет не всё, а pacmd
не так удобен в использовании. В дальнейшем будем придерживаться pactl
, однако если его функционала не хватит — используем pacmd
.В конце статьи я продемонстрирую собственную утилиту, работающую поверх стандартных: намного более функциональную и удобную :)
Card Profile: маппинг портов звуковой карты
У звуковой карты ограниченное количество разъёмов, а применений им может найтись масса: можно задействовать все под вывод звука 5.1 и оставить один для микрофона; или же оставить один джек под стерео-выход, зато получить входы для микрофона и линейный; или…
Увы, магия здесь не прокатит: наборы предустановлены производителем. Их список можно посмотреть в поле «Profiles» объекта «Card».
Для каждого профиля задаётся приоритет (priority): число, определяющее «степень привлекательности» именно этого профайла. По умолчанию PulseAudio выбирает профайл с наибольшим приоритетом.
Для каждого профайла указывается сколько Sink'ов и Source'ов он породит если его выбрать:
sinks: 1, sources: 0
.На данный момент нельзя изменить приоритеты, однако можно выбрать тот или иной профиль.
Подсматриваем в выводе
pactl list
имя карты и профиля, и выбираем:pactl set-card-profile 'alsa_card.pci-0000_00_1b.0' 'output:analog-stereo+input:analog-stereo'
Всё, порты карты переназначены.
Можно вообще выключить все разъёмы, выбрав профайл «off»:
pactl set-card-profile 'alsa_card.pci-0000_00_1b.0' 'off'
Sink Port: переключение звука на наушники
У одного Sink'а может быть несколько звуковых портов. Например, Sink созданный на основе звуковой карты ноутбука, может иметь два порта: встроенные колонки и выход на наушники.
Текущий порт Sink'а можно посмотреть в его поле
Active Port: analog-output-speaker
.Глядя на список Ports нужного объекта Sink, назначаем порт:
pactl set-sink-port 'alsa_output.pci-0000_00_1b.0.analog-stereo' 'analog-output'
и звук моментально перебрасывается на наушники, отключая колонки.
Аналогично для Source. Возможно, Ваш микрофон не работает в Skype именно из-за того что выбран не тот порт записи :)
Default Sink: звуковой выход по умолчанию
PulseAudio метит один из Sink'ов как «по умолчанию»: новые запущенные приложения по умолчанию будут проигрываться через него. Другими словами, если приложение при создании Sink-Input'а не выбирает Sink самостоятельно (например, из пользовательских настроек) — выбирается default-sink.
Sink по умолчанию можно посмотреть выполнив команду
pactl stat
:$ pactl stat
...
Default Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
Default Source: alsa_input.usb-046d_0802_0825F490-02-U0x46d0x802.analog-mono
Изменим его: смотрим имя нужного Sink'а и пишем:
pacmd set-default-sink '1'
Обратите внимание что
pacmd
в некоторых случаях позволяет использовать номера вместо длинных имён.Аналогично для Source. Кстати, неверно выбранный default-Source тоже может не давать общаться в Skype :)
Move Sink-Input: перемещение звукового потока
Этим действием можно перекинуть Sink-Input с одного Sink'а на другой. Таким образом можно перебросить музыку на только что подключенную USB-колонку.
Смотрим имена двух Sink'ов, находим нужный Sink-Input и пишем:
pactl move-sink-input 16 '1'
и звук Sink-Input#16 моментально переключается на Sink #1. Это может быть USB-колонка.
Увы, перебросить сразу все Sink-Input'ы с помощью
pactl
или pacmd
нельзя. В конце статьи будет решение.Source-Output также можно переключать между Source'ами.
Управление громкостью
Громкость в PulseAudio задаётся численно: 0..65535 (соответствует 0% и 100%), а также — сюрприз! — значения большие чем 100% вызывают усиление сигнала что незаменимо при просмотре фильмов с ненормализованной громкостью.
Здесь можно использовать index Sink'а:
pactl set-sink-volume '1' 100 # очень тихо! 100/65535 = 0,15%
pactl set-sink-volume '1' 65535 # 100%
pactl set-sink-volume '1' 78642 # 120% — усиление
pactl set-sink-mute '1' true # соседи могут засыпать
Усиление может вызывать clipping: всем известный «дребезг».
Аналогично можно управлять громкостью Source'ов.
UPD: с версии 0.9.15 появилась фича «FLAT_VOLUME» (её можно увидеть в Sink 'Flags'). При наличии этого флага громкость Sink'а автоматически устанавливается как максимальная громкость всех Sink-Input'ов. Отключить её можно так:
echo "flat-volumes = no" >> /etc/pulse/daemon.conf
Громкость приложений
С появлением Windows7 линуксоиды, не знакомые с PulseAudio, обзавидовались возможности регулировать громкость отдельных приложений :)
Теперь это возможно: смотрим index нужного Sink-Input'а и усиливаем отдельное приложение:
pactl set-sink-input-volume '16' 80000
Приостановка
Sink и Source можно «приостановить»:
pactl suspend-sink '1'
Конфиг
Когда Вам в голову придёт мысль добавить одну из этих команд в автозагрузку — немедленно выбросьте её! В таких случаях нужно использовать файл конфигурации PulseAudio.
Пример можно найти в файле
/etc/pulse/default.pa
. Обратите внимание на shebang #!/usr/bin/pulseaudio -nF
: это скрипт, синтаксис которого очень похож на команды, которые понимаем pacmd
.Для самообразования:
pacmd
— Запускает интерактивную консоль PulseAudiopacmd help
— список команд, на оффсайте- Модули PulseAudio
patricks
Замучавшись неудобством официальных утилит, ваш верный слуга написал свою утилиту для управления демоном PulseAudio :)
Особенности:
- Короткие, интуитивные команды
- Дозированная подача информации командой
ls
: теперь в терминал не будет вываливаться тонна информации (особенно properties) - Все объекты — в том числе порты и профайлы — можно задавать как по имени, так и по индексу
- Команда
set sink 0 port next
— можно не гадать номер порта и просто переключиться на следующий. Удобно для хоткея. - Наличие команды
mv sink 0 all
для перемещения всех звуковых потоков в нужный Sink (USB-Колонка)
Полакомиться можно на GitHub: ootync/Patricks
(файлы скрипта положить куда-нибудь и сделать симлинк на patricks.php)
Пример работы:
Посмотреть список Sink'ов. Текущий Sink выделен символом >:
ootync@rtfm ~ $ patricks ls sinks >Sink#0 <alsa_output.pci-0000_00_1b.0.analog-stereo> Sink#1 <alsa_output.pci-0000_00_2b.0.hdmi-stereo>
Внимательнее присмотретсья к Sink #0:
ootync@rtfm ~ $ patricks ls sink 0 Sink#0 <alsa_output.pci-0000_00_1b.0.analog-stereo> Is Default: yes Description: Internal Audio Analog Stereo State: RUNNING Driver: module-alsa-card.c Owner Module: Module#4 <module-alsa-card> Sample Spec: s16le 44100ch 2Hz Channel Map: front-left, front-right Mute: no Volume: 25% Base Volume: 100 Latency: 199703 Configured Latency: 210000 Flags: HARDWARE, HW_MUTE_CTRL, HW_VOLUME_CTRL, DECIBEL_VOLUME, LATENCY Ports: analog-output, analog-output-headphones Active Port: analog-output Monitor Source: Source#0 <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor> Id: 0 Name: alsa_output.pci-0000_00_1b.0.analog-stereo Proplist: 33 items
Внимательнее посмотреть на список портов Sink #0:
ootync@rtfm ~ $ patricks ls sink 0 ports >#0 analog-output: "Analog Output" prio=9900 #1 analog-output-headphones: "Analog Headphones" prio=9000
Переключить Sink #0 на следующий порт
ootync@rtfm ~ $ patricks set sink 0 port next Sink#0 <alsa_output.pci-0000_00_1b.0.analog-stereo>: analog-output-headphones
Перекинуть все Sink-Input'ы на следующий Sink (например, свежеподключенную USB-колонку)
ootync@rtfm ~ $ patricks mv sink next all Moving 1 inputs {65} to sink "alsa_output.pci-0000_00_1b.0.analog-stereo"... Sink#0 <alsa_output.pci-0000_00_1b.0.analog-stereo>: default sink
Ссылки
Настройка «от автора»
Примеры консольных команд
Описание модулей
FAQ
В следующей серии
- Конфиги PulseAudio
- Работа с модулями
- Работа с сэмплами
- Звук по сети, revisited
Сразу скажу что статья будет не скоро… сам ещё не всё понял :))