Коли переді мною постало завдання програти паралельно кілька аудіо-файлів на Cubian, я ще про це не здогадувався. Вже багато років у лінуксі проблема мікширування звуку відсутня: і ALSA вміє це нативно, і безліч саунд-серверів пропонують свої послуги на будь-який смак і гаманець.
Виявилося, що проблема є, і вона обширніша, ніж я припускав спочатку.
Проблема № 1. Вирішено. Phonon и pulseaudio
Отже, вперше я зіткнувся з розглянутою проблемою, коли писав додаток на QT. Як звуковий API було обрано phonon. І, варто було мені запустити додаток вперше, як я виявив, що аудіо-драйвери від sunxi не вміють мікшувати звук. Збентежений цією обставиною, я встановив пульс... і не отримав ніякого результату. Точніше, результати були різними: то клацання і хрипіння, то повна тиша. Залежно від того, які ще пакунки встановлювалися. Перепробувавши всі доступні саунд-демони (а їх у дебіані виявилося не так багато), я повернувся на пульс, тому що проблема так і не вирішилася і, очевидно, лежала десь глибше.
Для тих, хто в налаштування pulseaudio ніколи не вдавався, я зроблю невелике
відступ
Пульс може працювати в двох режимах: системний і користувацький. Розглянемо обидва окремо:
1. Системний. Не рекомендується на багатокористувацьких системах. Чому - дивіться документацію, там про це докладно. У разі вбудованих систем цілком придатний і іноді навіть оптимальний. Фонова служба самостійно займає аудіоустрій і дає доступ (в тому числі, до налаштувань звуку) всім користувачам з групи pulse-access (а не pulse, це важливо).
Щоб увімкнути цей режим у дебіані, вам слід увімкнути параметр у файлі/etc/default/pulseaudio: PULSEAUDIO_SYSTEM_START=1. Далі, вилучаємо з групи audio всіх користувачів, крім pulse. Прибиваємо всі сесійні екземпляри pulseaudio, якщо такі були, і запускаємо сервіс pulseaudio. Щоб користувач міг користуватися звуком, додаємо його в групу pulse-access.
2. Сесійний. Працює як на багатокористувальницьких, так і на вбудованих системах. Але треба розуміти, що якщо драйвери вашої карти не вміють мікшувати, в кожен конкретний момент звук зможе грати тільки один користувач. Типово, у дебіані увімкнено цей режим. Щоб користувач міг взаємодіяти зі звуковою картою, його треба додати до групи audio
Тому що в контексті більш глобальної проблеми деякі неочевидні моменти можуть сильно ускладнити життя.
Коли перша ітерація не принесла бажаного результату, я вирішив з'ясувати, що знає про цю проблему гугль. Гугль відповідав скупо і неохоче. Я зміг з'ясувати тільки те, що vlc-backend фонона використовувати не варто, треба використовувати gstreamer (для мене це було дещо дивно, тому що я завжди вважав vlc основним медіа-движком).
В результаті, перша проблема була вирішена зовсім вже чорною магією: установкою пакета gstreamer0.10-plugins-ugly. І фонон заграв.
Проблема № 2. Невирішена. VoIP и pulseaudio
Другим завданням було по одній команді відправляти на аудіовихід потік з VoIP-а, а по іншій - програвати аудіофайл. Перша частина вирішується астериском з chan_alsa. Але chan_alsa повністю займає пристрій і не віддає, поки не вивантажиш модуль. Тому знову пульс.
Цього разу все виявилося кумедніше: chan_alsa робить з пульсом щось таке, що поки його не вивантажиш, звук не грає ні він сам, ні будь-який інший додаток. При запуску пульсу з докладним дебагом вдається виловити помилку, вся суть якої зводиться до «у вас криві драйвера картки, відправте ось ці дані розробникам драйверів». Ну, раз проблема в драйверах ALSA, я вирішив спробувати OSS. Цього разу звук навіть був, але з такими перервами, що затія відразу втратила сенс.
Так як все це відбувалося на тлі вже вирішеної першої проблеми і відмінно грає sox'a, я подумав, що проблема не стільки в драйверах, скільки в модулі астериска, і вирішив замінити його... наприклад, на linphone. Коли проблема в точності повторилася з софтфоном, виникли підозри, що справа не в конкретному додатку, а... ну, може бути в ресемплінгу війпового аудіопотоку в рідній для картки PCM.
Оскільки завдання програвати звук одночасно з різних джерел в цьому випадку не було, а linphone займає пристрій тільки на час безпосередньо програвання звуку, було вирішено видалити зі схеми пульс.
Незважаючи на те, що саме завдання було вирішено, проблема виведення войп-аудіопотоку через пульс залишилася. І якщо хтось знайде її рішення, я буду дуже вдячний.