ALSA: открыть устройство PCM в режиме совместного использования - PullRequest
7 голосов
/ 17 ноября 2011

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

Playback open error: Device or resource busy

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 09 декабря 2011

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

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

1 голос
/ 01 января 2018

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

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

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

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

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

1 голос
/ 17 ноября 2011

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

1 голос
/ 17 ноября 2011

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

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

plughw: карта, устройство . Оба имеют в качестве параметров карту (строку идентификатора или числовой index), устройство и, при необходимости, вспомогательное устройство оборудования, к которому осуществляется доступ.

...