Учебно-методические материалы для студентов кафедры АСОИУ

Как работает звук в Linux

В статье приводится обобщенное описание модели звуковой подсистемы ОС Linux. Кратко рассмотрены функции и задачи ее основных компонентов (ALSA, OSS, Xine и др.) и связи между ними.

В настоящее время существует проблема со звуковой подсистемой в Linux, и она вовсе не в том, что звук не всегда работает. Проблема — в «переусложненности». Это сразу станет понятно, если вы попробуете набросать схему связей между компонентами звуковой посистемы в Linux, от аудиофайла до ваших колонок, — такая диаграмма скоро станет напоминать слипшиеся макароны. Однако это будет скорее вашим заблуждением. Технология работы со звуком в Linux не сложнее каких-либо других технологий.

Если представить звуковую подсистему Linux в виде модели, подобно тому, как это сделано в OSI/ISO или в сетевых приложениях, то будет заметна очевидная разница (рис. 1). Такая модель будет напоминать не слоеный пирог, а, скорее, вулкан в разрезе, т.к. в ней можно найти низкоуровневые функции, которые позволяют разработчикам практически напрямую обращаться к аппаратным компонентам и которые обычно должны быть скрыты, а с другой стороны — высокоуровневые функции, доступные ядру.

Как работает звук в Linux: модель системы

Рис. 1. Модель звуковой подсистемы в Linux

Например, протокол Open Sound использовался на уровне ядра для непосредственной связи со звуковым оборудованием, а сейчас он применяется для совместимости и расположен над ALSA. Сама система ALSA имеет как стек уровня ядра, так и API для разработчиков, смешивающие функции оборудования и драйверов со свойствами проигрывания объемного звука и аудиокодеками. Похоже, пока с этим приходится мириться.

Компоненты звуковой подсистемы в Linux

ALSA

Входы: PulseAudio, Jack, GStreamer, Xine, SDL, ESD

Выходы: Hardware, OSS

Как сказала Мария фон Трапп: «Позвольте начать с самого начала». Применительно к современным Linux-системам, этим началом будет Advanced Linux Sound Architecture (ALSA). Это модуль ядра, представляющий аудиофункции компонентам системы. Однако, это более чем обычный драйвер: ALSA работает как микшер, обеспечивает совместимость с другими слоями, представляет API для программистов и, при этом, работает с низкими задержками, сопоставимыми с аналогами проприетарных систем.

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

ALSA отвечает за транспонирование аппаратных возможностей в программные средства, доступные мультимедийным приложениям. Созданная на смену OSS, ALSA устраняет многие недостатки предыдущей системы, наиболее примечательным из которых является невозможность одновременного воспроизведения от нескольких источников. ALSA же способна мультиплексировать звук программно или аппаратно и поддерживает до 8 звуковых карт, включая и MIDI (зависит от оборудования).

В чем ALSA сильнее всего отличается от типичного драйвера модуля/устройства ядра, так это в том, что вы можете настроить практически все (от уровней многопоточного воспроизведения до частот дискретизации, битовой глубины и эффектов, применяемых в реальном времени), создав собственный файл конфигурации. Это, кстати, позволяет «подправить» громкость системы, в тех случаях, когда вам кажется, что Linux выдает слишком тихий звук. Прочитать, как это сделать, можно здесь: http://askubuntu.com...low-sound-issue-fixed-with-changing-alsa-config. Кстати, причины, объясняющие, почему тихий звук в Windows, хорошо описаны здесь: http://ocomp.info/tihiy-zvuk-kak-uvelichit-gromkost.html.

Относительная прозрачность, гибкость и эффективность сделали ALSA стандартом де-факто для аудио в Linux.

PulseAudio

Входы: GStreamer, Xine, ALSA

Выходы: ALSA, Jack, ESD, OSS

Если вы думаете, что после установив ALSA все станет простым и ясным, то вы ошибаетесь. ALSA покрывает большинство вопросов со звуком в Linux на локальной машине, но вы можете всретить трудности иного рода, — из области PulseAudio. Эта система позволяет преодолеть разрыв между аппаратным и программным обечспечение, локальными и удаленными компьютерами, а также содержанием аудиопотоков. То, что ALSA делает с несколькими звуковыми картами, PulseAudio делает с сетевыми источниками.

GStreamer

Входы: Phonon

Выходы: ALSA, PulseAudio, Jack, ESD

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

Jack

Входы: PulseAudio, GStreamer, ALSA

Выходы: OSS, FFADO, ALSA

Несмотря на преимущества открытых конфигураций (типа PulseAudio), все они предполагают прямую передачу звука от приложения на устройства вывода. Jack является «прослойкой», этаким эквивалентом удаленному вызову процедур для аудио, что позволяет создавать аудиоприложения из различных компонентов.

FFADO

Входы: Jack

Выходы: Audio hardware

Некоторое время назад на ряде профессиональных и полупрофессиональных устройств использовался интерфейс FireWire. У него были свои преимущества и недостатки. Один из них в том, что в отличие от USB, для Firewire требуется особый контроллер и, соответственно, драйвер. Сложность протокола потребовала выделения его поддержки в отдельный уровень (а не включения в ALSA) и появился проект FreeBOB, преемником которого стал проект FFADO, который был поддержан многими производителями устройств с интерфейсом FireWire.

Xine

Входы: Phonon

Выходы: PulseAudio, ALSA, ESD

В иерархии аудиоподсистемы Linux Xine — своего рода музейный экспонат. Многие вспомнят это название, глядя на DVD-диски с фильмами, которые продавались с предзаписанным туда же одноименным плейером.

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

Xine может выводить аудио через ALSA и PulseAudio, с другой стороны, через бэк-энд, к нему могут подключаться много других приложений. Наиболее известными, пожалуй являются фронт-энды Gxine и Totem для Gnome и Phonon для KDE.

Phonon

Входы: Приложения Qt/KDE

Выходы: GStrieamer, Xine

Phohon был разработан, чтобы облегчить жизнь разработчикам и пользователям путем удаления некоторых из все возрастающих системных сложностей. Он начинался как дополнительный уровень абстракций для приложений KDE4, однако разработчикам пришла в голову идея поместить Phonon в QT и использовать не только для KDE, но и в других решениях на платформе QT. Впоследствие поддержка Phonon была исключена из QT, поскольку появилось много критических замечаний, основное из которых в том, что Phonon не предлагает ничего нового. Однако, можно предполагать, что в KDE Phonon будет использоваться на протяжении всего жизненного цикла KDE4.

Прочие

Существует много других решений, наряду с приведенными выше, включая ESD, SDL, PortAudio и др. Система ESD (Enlightenment Sound Daemon) долгое время была звуковым сервером для среды Gnome. KDE-аналог ESD, Art's, не получил признания, так как вызывал больше проблем, чем решал. С другой стороны, аудиофункции SDL (Simple DirectMedia Layer) остаются востребованными среди разработчиков кросс-платформенных игровых приложений. PortAudio — еще одна кросс-платформенная библиотека, наиболее приметным приложением на ее основе является аудиоредактор Audacity.

И, наконец, OSS — Open Sound System. Поддержка на уровне ядра для этой системы исключена, хотя и не полностью, начиная с версии 2.4. Часть функций все еще поддерживается для совместимости с имеющимися приложениями. Однако на не-Linux системах OSS все еще можно найти в качестве основной.

Резюме

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

CC-BY-CA Анатольев А.Г., 27.12.2016