ALSA: откройте устройство PCM в общем режиме



Я хочу воспроизвести некоторые звуковые данные с помощью ALSA на устройство PCM. В качестве примера я скачал Этот пример и запустил его на своем ПК. Он прекрасно работает, когда ни один другой процесс в настоящее время не использует звуковую карту. Но он ничего не воспроизводит, когда какой-то другой процесс использует аудиоустройство (например, медиаплеер, воспроизводящий песни) и показывает следующую ошибку -



Playback open error: Device or resource busy


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



Я также попробовал обратный путь - сначала запустил пример, а затем попытался начать песню. В этом случае медиаплеер остается бездействующим, показывая "бездействие" рядом с индикатором прогресса (я использую Banshee). Я предполагаю, что snd_pcm_open получает исключительное право на ресурс устройства, так что никакой другой процесс не может его использовать.



Но я не хочу этого. Я хочу воспроизводить звук на аудиоустройстве без необходимости исключительные права, так что другие процессы в ПК могут совместно использовать то же самое устройство для вывода аудио данных.



Как я могу это сделать? Как открыть устройство PCM, чтобы другие процессы могли использовать то же самое устройство?

615   4  

4 ответов:

Я не мог найти способ разделить устройство между несколькими процессами. Я попытался использовать плагин dmix для объединения нескольких потоков воспроизведения с помощью конфигурационного файла .asoundrc, но это почему-то не сработало. Я попытался использовать устройство default моей звуковой карты, но это тоже не сработало. В соответствии с рекомендацией в списке рассылки ALSA я попытался открыть устройство по умолчанию, используя default:CARD=x в качестве параметра имени устройства для функции snd_pcm_open, что приводит к ошибке device not found в моей системе. По-видимому нет никакого способа сделать это (если кто-то может найти способ, пожалуйста, обновите этот ответ).

Вместо того, чтобы использовать ALSA, я использовал PulseAudio next, который решил мою проблему.

Проверьте файл / dev / sndstat (если у вас включен уровень совместимости с ОС). В нем должны быть перечислены аудиоустройства, соответствующие устройствам ALSA в вашей системе. А также вы можете проверить /proc / asound / devices, чтобы получить функции каждого устройства.

Попробуйте получить доступ к различным устройствам воспроизведения (в вашем примере это "plughw:0,0" открыт), выбрав различные имена для snd_pcm_open(): Это из здесь:

Plughw: карта, устройство . Оба имеют в качестве параметров карту (Строка идентификатора или числовое значение индекс), устройства и, при необходимости, подустройства оборудования для доступа.

Может быть, вы могли бы использовать Джека: http://jackaudio.org/

Проблема с ALSA тогда заключалась в отсутствии плагина микшера, вставленного в вывод по умолчанию. В последних версиях ALSA этого больше не происходит, так как dmix плагин теперь включен в выходной путь по умолчанию.

(Вы можете воссоздать общую звуковую карту неприятности для себя, если вы возитесь с ~/.asoundrc, или если вы обходите микшер, говоря приложению использовать непосредственно аппаратный штекер. Обратите внимание, что некоторые приложения, такие как JACK, будут пытаться использовать аппаратное обеспечение напрямую, если нет велели поступить иначе.)

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

В настоящее время, плагин dmix ALSA сделает это за вас, так что вы можете избавиться от промежуточного программного обеспечения, такого как PulseAudio и разъемы, пока вам действительно не понадобятся неосновные функции звуковой системы, которые они предоставляют.

Для справки, Посмотрите некоторые .asoundrc документация .

Comments

    Ничего не найдено.