Вопрос или проблема
Я работаю с встраиваемой системой Linux (kernel-5.18.18).
Я включил ALSA в ядре и собрал библиотеки ALSA, утилиты ALSA и аудиоприложения в системе.
Я могу воспроизводить PCM-файл с помощью aplay
, это работает хорошо. Я могу изменять громкость динамика с помощью amixer
и alsamixer
, они тоже работают хорошо.
Затем я получил другое приложение, использующее /dev/dsp
в качестве аудиоустройства, поэтому я включил функции OSS
в ядре следующим образом,
CONFIG_SOUND=y
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_DMAENGINE_PCM=y
CONFIG_SND_JACK=y
CONFIG_SND_JACK_INPUT_DEV=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_PCM_TIMER=y
После загрузки системы в ней появились /dev/dsp
и /dev/dsp1
.
Приложение не смогло открыть /dev/dsp
с сообщением ‘Устройство занято. Оно может открыть
/dev/dsp1 нормально, но не может воспроизвести никакой звук, записывая в
/dev/dsp1`!
Я не знаю, почему так происходит и как это исправить.
Устройства в /dev/snd
следующие,
controlC0 pcmC0D0c pcmC0D1p pcmC0D3c pcmC1D0c pcmC1D1c timer
controlC1 pcmC0D1c pcmC0D2c pcmC0D4p pcmC1D0p pcmC1D1p
- удалите все нестандартные параметры конфигурации ядра, которые не связаны с
snd-pcm-oss
. Вам нужно эмулировать OSS поверх ALSA; только ALSA имеет настоящие драйверы аппаратного обеспечения. - При загрузке модуля
snd-pcm-oss
вам нужно указать, на какое устройство ALSA/dev/dsp
перенаправляется — ядро не может этого угадать и будет использоватьhw0,0
на стороне системы (и только если оно существует во время загрузки).
Я предполагаю, что ваша проблема в основном заключается в пункте 2 выше; вы неправильно настраиваете слой эмуляции OSS. Смотрите https://alsa.opensrc.org/Module_device_mapping_options о различных параметрах.
Обратите внимание, что на Linux OSS существует в течение некоторого времени — около 20 лет «все» (имеется в виду разработчики звуковых систем и «профессиональные» разработчики мультимедийных приложений) перешли на ALSA (потому что, сюрприз, абстракция звукового оборудования /dev/dsp просто не отражает реальность оборудования и реальные потребности пользователей). Логично предположить, что программа, которая зависит от /dev/dsp, либо
- очень-очень старая (20 лет!), либо
- изначально написана не для Linux (или и то, и другое).
Стоит сообщить тому, кто предоставляет вам эту программу OSS, что им нужно обновить свое программное обеспечение для использования ALSA или предложить вам что-то другое.
Ядро не имеет встроенного аудиосмешивания, поэтому, насколько я знаю, все звуковые устройства /dev (как ALSA, так и OSS) работают в «эксклюзивном» режиме — только одна программа может открывать их для записи. Это применяется не только к программам, пытающимся использовать одно и то же ALSA ‘hw’ устройство, но также (по той же причине) и между двумя подсистемами, поскольку устройство эмуляции OSS на самом деле является просто еще одним клиентом ALSA и его звук нужно смешивать вместе.
Не используйте эмуляцию OSS в режиме ядра. Если у вас есть какое-либо программное обеспечение, которому требуется /dev/dsp, запускать его нужно через обертку пользовательского пространства, такую как aoss
(для простого ALSA) или padsp
(для PulseAudio или PipeWire). Обертка ‘aoss’ и библиотека ‘libaoss.so’ являются частью тех же инструментов ALSA, что и aplay или alsamixer.
Ответ или решение
Проблема с воспроизведением звука через OSS (/dev/dsp1) в встроенной системе на Linux
Введение
Ваша проблема со звуковым выводом через устройства OSS, такие как /dev/dsp1
, на встроенной Linux системе (ядро 5.18.18), требует особого внимания к конфигурации звуковой подсистемы. Ваша текущая настройка ALSA и OSS может быть неполной или неправильно сконфигурированной.
Подробный анализ проблемы
На основе вашего описания, есть несколько ключевых моментов, которые могут объяснить отсутствие звука при попытке воспроизводить его через /dev/dsp1
:
-
Конфигурация OSS и ALSA: Вы правильно включили функциональность OSS в ядре. Тем не менее, необходимо убедиться, что модули OSS эмулируют соответствующие ALSA устройства правильно. При загрузке модуля
snd-pcm-oss
, необходимо указать, на какое устройство ALSA следует перенаправлять/dev/dsp
, так как ядро не сможет угадать это автоматически. Рекомендуется использовать параметр модуля для явного указания ALSA устройства, с которым будет работать OSS. -
Эксклюзивный доступ: Звуковые устройства в Linux могут работать в эксклюзивном режиме. Если любое приложение или служба уже удерживают файл
/dev/dsp
, другие приложения не смогут получить к нему доступ, что и может стать причиной ошибки "Device is busy". Убедитесь, что никакое другое приложение (или экземпляр вашего приложения) не выполняется и не использует звуковые устройства. -
Использование а-ля AOSS или PADSP: Такие обертки, как
aoss
для ALSA илиpadsp
(для PulseAudio), могут быть полезны. Эти утилиты позволяют приложение, ориентированное на OSS, взаимодействовать с ALSA или PulseAudio без необходимости прямого обращения к системе ALSA. Вы можете попробовать запустить ваше приложение черезaoss
илиpadsp
, чтобы устранить проблему с несовместимостью.
Рекомендованные шаги для решения проблемы
-
Проверьте загруженные модули: После загрузки системы выполните команду
lsmod | grep snd
, чтобы убедиться, что необходимые звуковые модули правильно загружены. -
Указать ALSA устройство для OSS:
- В файле конфигурации модуля OSS укажите соответствующее ALSA устройство. Например, если используете
modprobe
, вы можете указать параметры при загрузке:modprobe snd-pcm-oss pcmC0D0p
- В файле конфигурации модуля OSS укажите соответствующее ALSA устройство. Например, если используете
-
Запустите приложение с оберткой:
aoss <имя_вашего_приложения>
-
Проверка доступности устройства: Убедитесь, что все устройства в
/dev/snd
доступны и не заняты. Запустите:fuser /dev/dsp /dev/dsp1
Это покажет, какие процессы используют эти устройства.
-
Логирование и отладка: Если проблема не решается, попробуйте увеличить уровень ведения журнала ALSA для диагностики. Это можно сделать с помощью следующих команд:
echo "1" > /proc/asound/oss/oss_debug
Заключение
Проблема с отсутствием звука при использовании /dev/dsp1
на вашем встроенном Linux устройстве может быть связана с неправильной конфигурацией OSS или с эксклюзивным доступом к звуковым устройствам. Следуя указанным шагам, вы сможете устранить проблемы и правильно настроить звуковую подсистему для успешного воспроизведения звука. Обсуждение с разработчиками приложения, использующего OSS, также может привести к предложению обновления их программного обеспечения для поддержки ALSA как современного звукового интерфейса.