ALSA: открытие и закрытие PCM на лету - PullRequest
2 голосов
/ 18 декабря 2010

У меня есть программа, которая выполняет следующее:

  1. Открывает PCM по умолчанию с snd_pcm_open () function
  2. Отправляет сэмплы для воспроизведения звука
  3. Закрывает PCM с помощью функции snd_pcm_close ()

Программа периодически воспроизводит любые звуковые запросы, которые она получает, но иногда при открытии происходит сбой и возвращается «Устройство или«Ресурс занят».Обычно это происходит, когда есть много звуковых файлов.Однако закрытый звонок всегда успешен.Я предположил бы, что, если закрытие было успешным, PCM был бы немедленно доступен для любого использования.Я также должен добавить, что в системе больше ничего не используется, используя звук.

Возможно ли, что ALSA по-прежнему необходимо очистить некоторые ресурсы после закрытия?Разве интерфейс PCM не предназначен для частого открытия и закрытия?Большинство примеров в Интернете открывают поток PCM при запуске и закрывают его при завершении работы.

1 Ответ

2 голосов
/ 18 декабря 2010

Не закрывайте и не открывайте это часто. Вы можете использовать

snd_pcm_open() и snd_pcm_close() только один раз (начало и конец приложения) и используйте это, если вы хотите сбросить свои потоки:

snd_pcm_drop()

и

snd_pcm_prepare()

Обычно это вообще не должно быть проблемой, поскольку dmix может обрабатывать несколько потоков. Однако, если вы используете прямой доступ hw: 0, шаг close () может быть в некотором роде асинхронным, что немедленное открытие () может работать не слишком хорошо.

...