ALSA: откройте устройство PCM в общем режиме
Я хочу воспроизвести некоторые звуковые данные с помощью ALSA на устройство PCM. В качестве примера я скачал Этот пример и запустил его на своем ПК. Он прекрасно работает, когда ни один другой процесс в настоящее время не использует звуковую карту. Но он ничего не воспроизводит, когда какой-то другой процесс использует аудиоустройство (например, медиаплеер, воспроизводящий песни) и показывает следующую ошибку -
Playback open error: Device or resource busy
Глядя на исходный код этого примера, я мог бы сказать, что функция snd_pcm_open в строке 882 является выбрасываю эту ошибку. Он находит устройство занятым, так как в данный момент его использует другой процесс.
Я также попробовал обратный путь - сначала запустил пример, а затем попытался начать песню. В этом случае медиаплеер остается бездействующим, показывая "бездействие" рядом с индикатором прогресса (я использую Banshee). Я предполагаю, что snd_pcm_open получает исключительное право на ресурс устройства, так что никакой другой процесс не может его использовать.
Но я не хочу этого. Я хочу воспроизводить звук на аудиоустройстве без необходимости исключительные права, так что другие процессы в ПК могут совместно использовать то же самое устройство для вывода аудио данных.
Как я могу это сделать? Как открыть устройство PCM, чтобы другие процессы могли использовать то же самое устройство?
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