Не воспроизводится звук с OSS /dev/dsp1

Вопрос или проблема

Я работаю с встраиваемой системой 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
  1. удалите все нестандартные параметры конфигурации ядра, которые не связаны с snd-pcm-oss. Вам нужно эмулировать OSS поверх ALSA; только ALSA имеет настоящие драйверы аппаратного обеспечения.
  2. При загрузке модуля 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:

  1. Конфигурация OSS и ALSA: Вы правильно включили функциональность OSS в ядре. Тем не менее, необходимо убедиться, что модули OSS эмулируют соответствующие ALSA устройства правильно. При загрузке модуля snd-pcm-oss, необходимо указать, на какое устройство ALSA следует перенаправлять /dev/dsp, так как ядро не сможет угадать это автоматически. Рекомендуется использовать параметр модуля для явного указания ALSA устройства, с которым будет работать OSS.

  2. Эксклюзивный доступ: Звуковые устройства в Linux могут работать в эксклюзивном режиме. Если любое приложение или служба уже удерживают файл /dev/dsp, другие приложения не смогут получить к нему доступ, что и может стать причиной ошибки "Device is busy". Убедитесь, что никакое другое приложение (или экземпляр вашего приложения) не выполняется и не использует звуковые устройства.

  3. Использование а-ля AOSS или PADSP: Такие обертки, как aoss для ALSA или padsp (для PulseAudio), могут быть полезны. Эти утилиты позволяют приложение, ориентированное на OSS, взаимодействовать с ALSA или PulseAudio без необходимости прямого обращения к системе ALSA. Вы можете попробовать запустить ваше приложение через aoss или padsp, чтобы устранить проблему с несовместимостью.

Рекомендованные шаги для решения проблемы

  1. Проверьте загруженные модули: После загрузки системы выполните команду lsmod | grep snd, чтобы убедиться, что необходимые звуковые модули правильно загружены.

  2. Указать ALSA устройство для OSS:

    • В файле конфигурации модуля OSS укажите соответствующее ALSA устройство. Например, если используете modprobe, вы можете указать параметры при загрузке:
      modprobe snd-pcm-oss pcmC0D0p
  3. Запустите приложение с оберткой:

    aoss <имя_вашего_приложения>
  4. Проверка доступности устройства: Убедитесь, что все устройства в /dev/snd доступны и не заняты. Запустите:

    fuser /dev/dsp /dev/dsp1

    Это покажет, какие процессы используют эти устройства.

  5. Логирование и отладка: Если проблема не решается, попробуйте увеличить уровень ведения журнала ALSA для диагностики. Это можно сделать с помощью следующих команд:

    echo "1" > /proc/asound/oss/oss_debug

Заключение

Проблема с отсутствием звука при использовании /dev/dsp1 на вашем встроенном Linux устройстве может быть связана с неправильной конфигурацией OSS или с эксклюзивным доступом к звуковым устройствам. Следуя указанным шагам, вы сможете устранить проблемы и правильно настроить звуковую подсистему для успешного воспроизведения звука. Обсуждение с разработчиками приложения, использующего OSS, также может привести к предложению обновления их программного обеспечения для поддержки ALSA как современного звукового интерфейса.

Оцените материал
Добавить комментарий

Капча загружается...