LXF130:Linux-аудио

Материал из Linuxformat.

Перейти к: навигация, поиск

Содержание

Linux-аудио в деталях

Грэм Моррисон докопался до центра ядра Linux, разбираясь, почему звук несозвучен здравому смыслу.

Упрощенная схема типичных для Linux уровней аудио. Чем ниже уровень, тем ближе он к аппаратным средствам.

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

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

А вот в Linux­аудио такое бывает сплошь и рядом. Здесь даже нет четкого определения нижнего уровня, и между аппаратурой и ядром суетится несколько независимых друг от друга аудиотехнологий. Звуковая архитектура Linux – это скорее модель земной коры, чем сети: нижние уровни иногда извергаются на поверхность, вызывая оторопь, а верхние сползают и обнажают «пласты» нижележащих технологий, которым полагается быть скрытыми. Например, протокол Open Sound ранее использовался на уровне ядра для прямого диалога с аппаратурой, а теперь это слой совместимости поверх ALSA.

ALSA же представляет собой стек уровня ядра плюс API высокого уровня для программистов, смешавший драйверы и свойства аппаратных компонентов с функцией воспроизведения объемного звука или кодека MP3. Большинство дистрибутивов еще и громоздят над этим PulseAudio и GStreamer, и получается очаг нестабильности похлеще разлома Сан­Андреас в Калифорнии [эпицентр множества землетрясений, – прим. пер.].


ALSA

ВХОДЫ: PulseAudio, Jack, GStreamer, Xine, SDL, ESD
ВЫХОДЫ: аппаратура, OSS

Как говорится, танцевать начнем от печки. Для современного Linux­аудио этой «печкой» является ALSA (Advanced Linux Sound Architecture, Продвинутая звуковая архитектура Linux). ALSA связана с ядром Linux и обеспечивает работу со звуком для всех компонентов системы. Но ALSA – не просто драйвер ядра: она служит программным микшером, эмулирует совместимость для других аудиослоев, создает API для программистов и работает с такой низкой и стабильной латентностью, что способна конкурировать со своими эквивалентами ASIO (Audio Stream Input/Output) и CoreAudio из Windows и Mac OS X.

ALSA создавалась на замену OSS (Open Sound System). Однако драйвер OSS все же не умер: в ALSA предусмотрена совместимость со старыми приложениями, поддерживающими только OSS. Проще всего считать ALSA уровнем драйверов устройств в системе Linux­аудио. Вашей звуковой аппаратуре нужен соответствующий модуль ядра, с префиксом snd_, а тот надо загрузить и запустить. И чтобы услышать хоть какой­нибудь звук, не обойтись без драйвера ядра из ALSA. Вот почему ваш ноутбук так долго оставался «немым» – пока у кого­то не дошли руки написать для него звуковой драйвер. К счастью, в наше время большинство дистрибутивов Linux настраивают ваши устройства и модули автоматически.

ALSA переводит функциональность звуковой аппаратуры в программный API, которым прочие компоненты системы пользуются для манипуляции звуком. Эта архитектура создавалась для устранения недостатков OSS (и большинства аудиодрайверов того времени), а самым заметным из них была невозможность работы с аудиоустройством сразу нескольких приложений. Задача программного компонента ALSA – управление запросами к звуковым устройствам, с учетом возможностей этих последних.

Например, если вы хотите играть в какую­нибудь игру еще и под музыку из Amarok, ALSA нужно принимать оба потока аудио и либо микшировать их программно, либо отсылать их на аппаратный микшер звуковой карты. ALSA умеет управлять работой до 8 устройств одновременно, а иногда и обращается к аппаратным функциям MIDI, хотя это зависит от звукового драйвера вашего оборудования и по мере роста мощности компьютеров теряет актуальность.

В отличие от типичного модуля ядра/драйвера устройства, ALSA предоставляет возможность своей настройки. Здесь­то и проявляется сложность аудиосистемы Linux. Стоит лишь создать собственный файл настройки, и в конфигурации ALSA можно сменить практически все: от способа микширования потоков аудио и выбора аудиовыходов до частоты дискретизации, разрядности отсчетов звука и эффектов реального времени.

Относительная «прозрачность», эффективность и гибкость сделали ALSA стандартом де­факто; ее слой должна пройти любая другая инфраструктура аудио, чтобы добраться до звукового оборудования.

PulseAudio

ВХОДЫ: GStreamer, Xine, ALSA
ВЫХОДЫ: ALSA, Jack, ESD, OSS

Если вы решили, что ALSA упростила ситуацию с Linux­аудио, погодите радоваться. Конечно, ALSA в основном охватывает всю «матчасть» вашего компьютера по вводу/выводу звука, но вы должны прорваться через другой уровень сложности – вотчину PulseAudio. Данный компонент – попытка перебросить мост между аппаратурой и ПО, локальными и удаленными компьютерами, а также содержимым аудиопотоков. PulseAudio играет при передаче аудио через сеть такую же роль, как ALSA при работе с несколькими звуковыми картами. Благодаря своей гибкости, PulseAudio стал стандартом во многих дистрибутивах Linux.

Как и в ALSA, эта гибкость достигается за счет усложнения, что усугубляется выходом PulseAudio на пользователей. То есть рядовые пользователи с большей вероятностью запутаются в его паутине. Большинство дистрибутивов держат настройку PulseAudio за пределами досягаемости. Например, в последнем релизе Ubuntu вы и не заметите, что PulseAudio установлен. Щелкнув мышью по апплету микшера, чтобы настроить громкость звуковой карты, вы увидите панель ALSA, но по сути перед вами виртуальное устройство – вывод ALSA передается на PulseAudio и обратно на ALSA.

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

Если бы все приложения применяли PulseAudio, ситуация бы упростилась. Разработчики могли бы не беспокоиться о сложностях других систем, потому что PulseAudio обеспечивает кроссплатформенную совместимость. Но это же является основной причиной, объясняющей, почему существует так много разнообразных решений проблемы аудио. PulseAudio может работать на разных платформах, включая POSIX и Microsoft Windows. А значит, приложение, созданное на основе PulseAudio, а не ALSA, будет легко перенести на другие платформы.

Но ALSA и PulseAudio образуют некий симбиоз: второй нуждается в первом, чтобы «выжить» в Linux. PulseAudio настраивается как виртуальное устройство, соединенное с ALSA подобно аппаратному устройству. В этом PulseAudio походит на Jack: он тоже сидит между ALSA и рабочим столом и прозрачным образом перебрасывает между ними данные туда и обратно. PulseAudio применяет собственную терминологию: например, конечные пункты назначения при пересылке аудиоданных называются «стоками» [sinks]. Ими могут быть другие компьютеры сети или аудио-выходы вашей звуковой карты (благодаря виртуализации ALSA).

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

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

GStreamer

ВХОДЫ: Phonon
ВЫХОДЫ: ALSA, PhaseAudio, Jack, ESD

GStreamer вносит в Linux­аудио еще большую путаницу – потому что на первый взгляд, как и PulseAudio, не добавляет в эту смесь ничего нового. Это еще одна инфраструктура мультимедиа, до PulseAudio довольно популярная среди разработчиков, особенно для рабочего стола Gnome. Она предоставляет один из немногих простых способов установки и использования в Linux проприетарных кодеков. Кроме того, эта звуковая инфраструктура принята у разработчиков GTK, и можно даже найти версию для обработки аудио на коммуникаторах Palm Pre.

На схеме слоев GStreamer располагается поверх PulseAudio (который используется им для вывода звука в большинстве дистрибутивов), но ниже прикладного уровня. Уникальность GStreamer в том, что этот компонент не предназначен исключительно для работы с аудио и поддерживает различные форматы потоковой мультимедиа­информации, включая и видео – посредством модулей расширения.

Например, воспроизведение MP3 добавляется в системуза счет загрузки и установки дополнительного кодека, добавляемого как расширение GStreamer. Такими расширениями являются коммерческий MP3­декодер Fluendo, один из немногих официально лицензированных для Linux, а также проприетарные кодеки MPEG­2, H.264 и MPEG.

Jack

ВХОДЫ: PulseAudio, GStreamer, ALSA
ВЫХОДЫ: OSS, FFADO, ALSA

При всех преимуществах открытых конфигураций наподобие PulseAudio, они перекидывают звук между приложениями, предполагая, что оно проследует непосредственно на их выходы. Jack – это промежуточный уровень, играющий в мире аудио роль, аналогичную удаленным вызовам процедур [Remote Procedure Calls, RPC] в программировании. Благодаря Jack аудиоприложения можно строить, собирая из компонентов.

Лучший пример использования Jack – виртуальная студия звукозаписи, где одно приложение отвечает за захват аудио, а другое – за его обработку и наложение эффектов перед отправкой результирующего аудиопотока третьему приложению, в котором выполняется сведение и подготовка записи к релизу. Настоящая студия звукозаписи опутана целой паутиной кабелей с разъемами [jack]. Компонент Jack делает то же, но на программном уровне.

Слово Jack – это акроним от ‘Jack Audio Connection Kit’. Латентность Jack низка, то есть над аудиопотоком не выполняется никаких лишних операций, способных его затормозить. Но чтобы Jack приносил пользу, нужны аудиоприложения, специально подогнанные к соединениям Jack. Поэтому Jack не может просто заменить ALSA или PulseAudio, а должен работать поверх другой системы, которая генерирует звук и предоставляет физические входы.

Работая с Jack­совместимыми приложениями, вы можете направлять аудио и подключать входы любым удобным для вас способом. Например, выход VLC можно перенаправить на вход Audacity, чтобы записать поток в процессе его воспроизведения, или пропустить аудиопоток через JackRack – программный процессор сигналов, позволяющий нагромоздить целую гору эффектов в реальном времени, включая эхо (в том числе многократное пещерное) и придание голосу приятного тембра.

Эта гибкость создает фантастические возможности для рабочих станций, занимающихся цифровым звуком. Например, Ardour использует Jack для внутренних и внешних соединений, а эффект-процессор Jamin может служить одним из звеньев в цепочке процессов Jack. Jack – как бы программный эквивалент подключений в настоящей студии звукозаписи, и его реализация в Linux оказалась столь успешной, что даже перекочевала в Mac OS X.

FFADO

ВХОДЫ: Jack
ВЫХОДЫ: Аудиоаппаратура

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

Однако, в отличие от USB, где предусмотрен специальный стандарт обработки аудио без дополнительных драйверов, аудио-интерфейсы FireWire имеют индивидуальные драйверы. Сложности протокола FireWire затрудняют взаимодействие с ALSA, и для этого необходим отдельный уровень. Изначально данную задачу выполнял проект FreeBOB – ему повезло в том, что многие аудиоустройства FireWire применяли одинаковую аппаратуру.

FFADO – преемник FreeBOB, открывающий платформу драйверов для многих других типов звуковых устройств с интерфейсом FireWire. В конце 2009 года вышла вторая версия FFADO, с поддержкой ряда устройств от таких производителей оборудования, как Alesis, Apogee, ART, CME, Echo, Edirol, Focusrite, m­Audio, Mackie, Phonic и Terratec. Выбор поддерживаемых устройств в общем случаен; перед покупкой не помешает навести справки. Но многие из этих производителей помогают разработке драйверов, предоставляя свои устройства для использования и тестирования.

Еще одна выигрышная черта FFADO–интеграция ряда функций цифровой обработки сигналов при аппаратном микшировании в драйвер, дополненный графическим микшером для управления балансом различных входов и выходов. В отличие от микшера ALSA, управление аудиопотоками идет на оборудовании с нулевой латентностью, что идеально при записи «живого» звука.

По сравнению с остальными аудиоуровнями, FFADO только «перетасовывает» аудиопотоки между Jack и физическим звуковым оборудованием. «Обратного хода» от FFADO к PulseAudio или GStreamer нет, если только они не запущены вместе с Jack. Поэтому нельзя сделать FFADO основным уровнем аудио для воспроизведения музыки или фильмов – разве что вам по зубам установить все это и запустить Jack. Зато драйвер не обременен поддержкой разнообразных протоколов, поскольку большинство «серьезных» аудиоприложений уже включают в свой состав поддержку Jack по умолчанию; так что FFADO – один из лучших вариантов для использования в условиях студии звукозаписи.

Xine

ВХОДЫ: Phonon
ВЫХОДЫ: PulseAudio, ALSA, ESD

Мы переходим к узкоспециальной геологии Linux-аудио. Xine – своего рода «меловые отложения», остаток после «вымывания» прочих слоев. Большинству пользователей слово Xine знакомо: так называется очень удачный проигрыватель DVD, включенный во многие дистрибутивы, несмотря на свой почтенный возраст. Чем и обусловлено долголетие Xine.

Xine разбит на внутреннюю библиотеку для обработки медиа и интерфейс для общения с пользователем. Первая обязана своей живучестью умению воспроизводить уйму контейнерных форматов, включая AVI, Matroska и Ogg, а также десятки других, которые могут содержаться в этих контейнерах, в том числе AAC, Flac, MP3, Vorbis и WMA – благодаря привлечению ряда других библиотек. В итоге Xine действует как универсальная инфраструктура, дающая разработчикам наилучший охват совместимости без тревог о законности применения проприетарных кодеков.

Xine взаимодействует с ALSA и PulseAudio, передавая им свою выходную информацию, и число приложений, умеющих «общаться» с Xine напрямую, по­прежнему велико. Среди них наиболее популярны Gxine и Totem. Вдобавок Xine – движок по умолчанию для Phonon в KDE, встречаемый повсюду – от Amarok до Kaffeine.

Phonon

ВХОДЫ: Qt и приложения KDE
ВЫХОДЫ: GStreamer, Xine

Компонент Phonon разрабатывался, чтоб упростить жизнь и разработчикам, и пользователям за счет устранения ряда сложностей системы, и вступил в жизнь как еще один уровень абстракции аудио для приложений KDE 4, но идея оказалась столь хороша, что разработчики Qt включили его непосредственно в инструментарий Qt, на котором базируется и сама среда KDE.

От этого здорово выиграли разработчики кросс­платформенных приложений: появились шансы создать в Linux проигрыватель музыки с помощью Qt, а затем просто перекомпилировать его для Mac OS X или Windows, не задумываясь о применяемом звуковом оборудовании и способе воспроизведения музыки или обработки аудио в целевой ОС. Qt и Phonon взяли все это на себя, и автоматически передают аудиоданные CoreAudio API в Mac OS X или DirectSound в Windows. В Linux (в отличие от исходной версии Phonon в KDE) Qt-реализация Phonon передает данные на вход GStreamer – тот обеспечивает прозрачную поддержку кодеков.

Поддержка Phonon потихоньку изымается из инструментария Qt. Систему часто критиковали, в основном за чрезмерную упрощенность и отсутствие новизны. Впрочем, вполне вероятно, что поддержка все­таки протянет до конца жизненного цикла KDE 4.

Прочая компания

Существует еще немало технологий работы со звуком, в том числе ESD, SDL и PortAudio. Звуковой сервер для оконного менеджера Enlightenment (Enlighted Sound Daemon, ESD) долгое время применялся по умолчанию в графической оболочке Gnome. Потом Gnome перебрался на libcanberra (эта библиотека может общаться с ALSA, GStreamer, OSS и PulseAudio), а поддержку ESD в апреле 2009 прекратили. В KDE также имеется Arts, аналог ESD, хотя и менее популярный: он, пожалуй, создавал больше проблем, чем решал. Сейчас многие перешли на KDE 4, и об этом уже речи нет.

В качестве компонента аудиовывода библиотеки SDL также процветает SDL, применяемый в сотнях кросс­платформенных игр. SDL поддерживает массу функций, и это зрелая и стабильная технология. Еще одна кросс­платформенная аудиобиблиотека – PortAudio; к перечню доступных ОС она добавляет SGI, Unix и BeOS. Самый популярный потребитель PortAudio – музыкальный редактор Audacity, чем объясняется некоторая непредсказуемость его звукового вывода и качество поддержки Jack.

Наконец, есть еще OSS, Open Sound System. Начиная с версии ядра 2.4, система OSS более не является ключевым компонентом Linux­аудио, но это не пошатнуло ее позиций. Отчасти это связано с тем, что от OSS зависит много старых приложений, а также с тем, что, в отличие от ALSA, OSS работает не только с Linux, но и с другими ОС: есть даже версия для FreeBSD. Для 1992 года это была отличная система, но взамен ей практически везде рекомендуют ALSA. Система OSS определяла работу аудиосистемы в Linux, и, в частности, способ доступа к аудиоустройствам через дерево ioctl, как, например, в случае с /dev/dsp. ALSA реализует уровень совместимости с OSS, чтобы дать возможность старым приложениям работать с OSS без необходимости отказываться от текущей версии стандарта ALSA.

Проект OSS занимался экспериментами и с открытым кодом, и с проприетарными технологиями. На коммерческой основе проект до сих пор активно поддерживается компанией 4 Front Technologies. Последняя сборка OSS, OSS v. 4.2 Build 2002, вышла в ноябре 2009 года.

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию