Путівник по джунглям звукових АРІ в Linux

Під час міні-конференції, присв'яченій темі аудіо, що відбулась під час конференції Linux Plumbers вияснилась одна річ: програмістам часто буває складно вирішити, які саме зі звукових АРІ і для яких саме цілей слід використовувати при створенні аудіо-програм для Linux. Давайте спробуємо розібратись у цих джунглях:

Що ви хочете зробити?

* Я хочу написати ще один медіа програвач!

Використовуйте GStreamer! (Однак, якщо ви маєте намір писати лише під KDE — скористайтесь альтернативним варіантом — Phonon).

* Я хочу додати до своєї програми звукові сповіщення подій!

Використовуйте libcanberra, встановлюйте звукові файли у відповідності до специфікацій XDG по звукових темах та їх іменуванню (однак, якщо ви маєте намір писати лише для KDE — можете використати в якості альтернативи KNotify, хоча, той має трохи інше призначення).

* Я хочу створювати професійні аудіо редактори, програми звукозапису, роботи з MIDI і синтезатори!

Використовуйте JACK і/або повний інтерфейс ALSA.

* Мені необхідне просте відтворення і захоплення аудіо PCM!

Використовуйте безпечну частину ALSA.

* Я хочу додати звук до своєї гри!

Для повноекранних ігор використовуйте API з бібліотеки SDL, а для простих ігор зі стандартним графічним користувацьким інтерфейсом штибу GTK+ або Qt — libcanberra.

* Я хочу написати мікшер!

Використовуйте той рівень, з яким безпосередньо збираєтесь працювати: якщо хочете забезпечити підтримку вдосконалених програмних мікшерів — скористайтесь API управління гучністю PulseAudio. Для забезпечення ж підтримки апаратних мікшерів, використовйте API мікшера ALSA.

* Я хочу написати аудіо-програму проміжного рівня!

Використовуйте повний стек ALSA.

* Мені необхідно написати аудіо-програму для вбудованих систем!

Для технічного застосування, за звичай, підходить безпечна частина ALSA, однак, усе залежить від конкретного випадку.

Хочете знати більше про різні звукові API?

GStreamer

GStreamer — де-факто, стандарт для систем управління медіа-потоками на робочих станціях Linux. Він підтримує кодування та декодування аудіо та відеопотоків. Його можна застосовувати для найрізноманітніших цілей: від простого відтворення аудіофайлів до складних систем мовлення по мережі. GStreamer підтримує широкий діапазон кодеків і звукових підсистем. GStreamer не дуже підходить для простого відтворення PCM і для додатків, які працюють з малою затримкою або в реальному масштабі часу. GStreamer переносимий і може використовуватися не тільки в Linux. Серед підтримуваних звукових підсистем: ALSA, OSS і PulseAudio. [Довідник та посібник по програмуванню]

libcanberra

libcanberra — звуковий API для абстрактних подій. У ньому реалізовані специфікації XDG по звукових темах і їх іменуванню. libcanberra розроблена для GNOME, але сама по собі не залежить від GNOME, GTK+ або GLib і може використовуватися в інших стільничних середовищах. Окрім простого інтерфейсу для відтворення аудіофайлів, libcanberra забезпечує кешування (що дуже корисно для мережних тонких клієнтів) і дозволяє передавати різні метадані звуковим підсистемам, що можна використовувати для створення додаткових зручностей для користувача (наприклад, для озвучування подій позиціювання) і для поліпшення сприйняття. libcanberra підтримує різні звукові підсистеми і може портуватись на системи, відмінні від Linux. Серед підтримуваних звукових підсистем — ALSA, OSS, PulseAudio і GStreamer. [Довідник по API]

JACK

JACK — звукова систем для комутації професійних аудіо-додатків і апаратних виходів. Основний акцент робиться на низькій затримці сигналу і комутації між додатками. Ця система не потрібна для звичайної робочої станції або для вбудованих систем. Від цього API не буде користі, якщо вам потрібна просте відтворення PCM. JACK підтримує різні звукові підсистеми, але краще всього працює з ALSA. JACK можна переносити на інші ОС. Серед підтримуваних звукових підсистем — ALSA та OSS. [<a href=« jackaudio.org/files/docs/html/index.html»Довідник по API]

Повний інтерфейс ALSA

ALSA — це API для відтворення і запису PCM-аудіо в Linux. ALSA в основному працює з обладнанням, хоча підтримуються й інші звукові підсистеми (з деякими обмеженнями, див. нижче). Назва ALSA застосовується, як до драйверів ядра Linux, так і до бібліотеки користувацького простору, яка їх використовує. Бібліотека ALSA повнофункціональна і переносима (з деякими обмеженнями). Повний API ALSA може здатися дуже складним і великим. Проте, він підтримує практично усі функції сучасного звукового обладнання. Частина функціональності програмного інтерфейсу ALSA обмежується підтримкою обладнання ядром Linux (на відміну від програмних звукових серверів та драйверів користувацького серещовища, таких, як аудіо для Bluetooth і FireWire) і драйверами для Linux. [Довідник по API]

Безпечна частина ALSA

Лише частина повного API ALSA працює з усіма звуковими підсистемами, які підтримуються ALSA. Рекомендується дотримуватися цієї безпечної частини, при написанні програм для ALSA, які повинні бути переносимими, не старіти і залишатись сумісними із звуковими серверами, Bluetooth-аудіо і FireWire-аудіо. Нижче детально описується, які з функцій ALSA вважаються безпечними. Безпечна частину API ALSA — слушна абстракція для переносимого базового відтворення і запису PCM, яка використовується не лише для пристроїв, які підтримуються драйвером ядра ALSA. Серед підтримуваних звукових підсистем — пристрою драйвера ядра ALSA, OSS, PulseAudio і JACK.

Phonon і KNotify

Phonon — високорівнева абстракція для систем потокового відтворення, таких, як GStreamer, але цим її функціональність не обмежується. Підтримується декілька звукових підсистем. KNotify — система для «повідомлень» у широкому сенсі, не лише звукових. Проте, у ній поки що не підтримуються специфікації XDG по звукових темах і їх іменуванню, а також не підтримується кешування або передача метаданих оповіщення звукової підсистеми нижнього рівня. KNotify підтримує різні підсистеми для відтворення звуку через Phonon. Обидва API специфічні для KDE/Qt і для додатків за межами KDE/Qt їх краще не використовувати. [[Довідник по API Phonon] Довідник по API KNotify]

SDL

SDL — переносимий API, що використовується в основному для розробки повноекранних ігор. Серед іншого він включає в себе і переносимий аудіоінтерфейс. Серед звукових підсистем, підтримуваних SDL — OSS, PulseAudio і ALSA. [Довідник по API]

PulseAudio

PulseAudio — звукова система для Linux-десктопів і вбудованих оточень, яка працює у просторі користувача, зазвичай, поверх ALSA. PulseAudio підтримує наскрізний тракт передачі, роздільний рівень гучності для різних додатків, озвучування просторових повідомлень, дозволяє на льоту перемикати звукові потоки між пристроями і виконувати багато інших високорівневі операції. PulseAudio додає до аудіо-стеку Linux модель безперебійного відтворення (див. glitch-free). PulseAudio не підходить для професійних систем роботи з аудіо. PulseAudio можна перенести на системи, відмінні від Linux. У PulseAudio є власний API, а також підтримка безпечної частини ALSA, а також обмежена, заснована на LD_PRELOAD сумісність з OSS. Серед підтримуваних PulseAudio звукових підсистем — OSS і ALSA. Також є можливість взаємодії з JACK. [<a href=« www.libsdl.org/cgi/docwiki.cgi»Довідник по API]

OSS

Open Sound System — низькорівневий PCM API, який підтримується багатьма Unix-системами, у тому числі й Linux. Спочатку це була стандартна аудіо-система Linux, сучасні ядра Linux підтримують третю версію API, OSS3. OSS3 вважається застарілим і був повністю замінений на ALSA. Вже з'явився OSS4, наступник OSS3, але він практично не грає ніякої ролі для Linux, і не підтримується в стандартних ядрах і поширених дистрибутивах. OSS API працює на низькому рівні, на основі прямих звернень до інтерфейсів ядра за допомогою ioctl(). Тому його незручно використовувати і практично не можна віртуалізувати для використання в аудіо-системи поза ядром, таких, як звукові сервери (наприклад, PulseAudio) або драйвери простору користувача (наприклад, Bluetooth або FireWire-аудіо). Модель з урахуванням затримок в OSS3 взагалі не можна вірно перетворити для програмних звукових серверів, а також виникають проблеми з обладнанням, підключеним не по шині PCI, наприклад по USB. Окрім того, OSS не конвертує, не перерозподіляє або перекодує типи дискретизації при необхідності. Це означає, що клієнтські програми, які повинні підтримувати OSS, зобов'язані утримувати повний набір утиліт для конвертації, перепризначення і перекодування на той випадок, якщо обладнання не підтримує апаратно потрібні параметри дискретизації. Серед сучасних звукових адаптерів часто зустрічається підтримка лише S32LE на 48 кГц. Якщо передбачається, що клієнтська програма для OSS завжди відтворює звук з дискретизацією S16LE на 44,1 кГц, нічого не вийде. OSS3 можна перенести на інші Unix-сумісні ОС, але з урахуванням деяких відмінностей. В OSS також немає нормальної підтримки багатоканального звуку та іншої функціональності сучасних аудіо-систем. OSS застарів, його не слід використовувати для нових додатків. У ALSA та PulseAudio є обмежена сумісність з OSS, заснована на LD_PRELOAD. [Керівництво по програмуванню]

Усі звукові системи і API, перераховані вище, підтримуються у всіх популярних сучасних дистрибутивах. Для підтримки libcanberra може знадобитися останній випуск вашого дистрибутиву для розробників.

Усі звукові системи і API, перераховані вище, підходять для розробки комерційних додатків з закритим кодом, оскільки усі вони ліцензовані під LGPL або більш ліберальними ліцензіями, або ж до клієнтської частини не включаються бібліотеки.

Коли і де слід використовувати той чи інший API?

GStreamer

GStreamer добре підходить для високорівневих задач. Наприклад, якщо вам необхідно відтворити аудіофайл або відеопотік, не хвилюючись про несуттєві деталі на рівні кодеків або PCM.

libcanberra

libcanberra ліпше за всього підходить для озвучування вводу у користувацьких інтерфейсах або для відтворення простих звукових файлів для звукових сповіщень.

JACK

JACK добре підодит для професійних програм аудіозапису або ж у випадках, коли є необхідність у прехресній комунікації між додатками.

Повний інтерфейс ALSA

Повний інтерфейс ALSA ліпше використовувати для програм «пиріжкового рівня», або ж у випадках, коли ви збираєтесь використовувати спецефічні можливості обладнання, які можуть знадобитись для завдань аудіозапису.

Безпечний інтерфейс ALSA

Безпечний інтерфейс ALSA добре підходитьд ля програм, які займаються записом/відтворенням простих PCM-даних з апаратних пристроїв або програмних звукових систем.

Phonon і KNotify

Phonon і KNotify слід використовувати у додатках KDE/Qt для високорівневого відтворення медіа-даних та простих звукових сповіщень.

SDL

SDL підходить для повноекранних ігор.

PulseAudio

На даний момент, API PulseAudio слід використовувати лише для додатків, які повинні забезпечувати функціональність, специфічну для звукового сервера (наприклад, мікшер) або ж, якщо рівень абстракції виводу PCM вже реалізований у додатку і є сенс додати підтримку PulseAudio для мінімізації кількості рівнів у аудіо-стеці.

OSS

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

ЧаП

А, як щодо ESD і NAS?

ESD s NAS застарілі, і, як API, і, як звуковий демон. Не використовуйте їх для розробки нових програм.

ALSA не портується!

Це неправда! Насправді, бібліотека простору користувача піддається портуванню, до її складу навіть входить звукова підсистема для аудіопристроїв OSS. Немає реальних причин, які б заважали використовувати бібліотека ALSA на інших Unix-подібних системах.

Для мене найважливішою є переносимість! Що робити?

На жаль, наразі немає PCM API, який дійсно добре піддається портуванню (тобто, на Win32), котрий можна було б вам порекомендувати. Описані вище системі більш-менш придатні до портуванню, принаймні на інші Unix-подібні ОС. Однак, це зовсім не означає, що для усіх їх доступні підходящі підсистеми. Якщо для вас важлива переносимість на Win32 та MacOS, можливо, варто пошукати рішення, яке не згадується вище, або ж допомогти у доробці однієї з вищеописаних систем. Жодна із систем (за виключенням OSS) не прив'язана жорстко до ядра Linux або ж будь якої іншої Unix-подібної операційної системи.

А, як щодо PortAudio?

Не думаю, що PortAudio — хороший API для Unix-подібних операційних систем. Не може його порекомендувати, але вирішувати вам.

Чому ви так ненавидите OSS4?

Я нічого не ненавиджу. Просто не думаю, що OSS4 — серйозний вибір, особливо для Linux. Під Linux він є абсолютно безкорисний, адже є ALSA.

Ви ідіот і нічого в цьому не розумієте!

Ви праві, не розумію. Однак, тим не менше, це не забороняє мені давати вам поради. Ха!

Я створив новий проектик, який реалізує чудовий рівень абстракції для аудіо та мультимедіа!

Вибачте, але цього не достатньо. Я перераховую тут програми, які точно підходять, і достатньо добре підтримуються.

Висновок

Ясна річ, це лише базові рекомендації, які можуть лише направити вас у вірному напрямку. У кожному конкретному випадку потреби різні, відповідно і не розглянуті тут варіанти можуть бути доцільними. Тільки ви самі можете визначити, що з написаного мною застосовуватиметься для вашого програмного забезпечення.

Тут згадувалися лише ті програмні системи, які вважаються стабільними і були загальнодоступними на момент написання. Сподіваюся, у майбутньому можна буде розповісти про більш доречну і переносиму заміну безпечної частини функцій ALSA. Я збираюся періодично оновлювати цей текст для внесення оновленої інформації.

Якщо ви вважаєте, що я забув згадати якесь практичне застосування чи важливий API, напишіть мені або залиште коментар. Однак вважаю, що усе вище викладене є досить вичерпним, і якщо щось пропущено, то швидше за все навмисне.

Окрім того, враховуйте те, що я беру участь у розробці PulseAudio і libcanberra, а також вношу невеликий внесок у ALSA, GStreamer і деякі інші з перерахованих систем. Так, я упереджений.

Так, і, будь ласка, розміщуйте посилання на цей матеріал. Я хочу, щоб цей посібник був широко відомим у Linux-співтоваристві. Дякую!

Автор: Lennart Poettering, A Guide Through The Linux Sound API Jungle

Коментарі 2

mamantoha - 01 вересня 2009, 00:06

Пізнавально. Спасибі за переклад!

Від початку мучило питання

Чому ви так ненавидите OSS4?

Нажаль я в цьому не розбираюсь. Але висновок

Ви ідіот і нічого в цьому не розумієте!

напрошується сам собою.

А взагалі до якості звуку в лінуксі є деякі претензії. Хоча у порівнянні з ситуацією, яка була 5 років назад, Linux у цьому плані пішов далеко вперед.

lemon - 01 вересня 2009, 16:13

звукова підсистема на лінуксі це тихий жах

чому не можна це краще уніфікувати? там враппер якийсь поставити чи ще щось?

за питання-відповідь — +1 :)))

Коментувати
© 2009 - 2018, Розробка - соціальна ІТ спільнота.
Контакти: info@rozrobka.com
Правила користування