LINUX.ORG.RU

Cannot open OSS audio device /dev/dsp


0

0

В одной программке (HSLab из пакета HTK Toolkit) при попытке начать запись с микрофона, возникает ошибка:

ERROR[+6006] InitAudi: Cannot open OSS audio device /dev/dsp
FATAL ERROR - Terminating program HSLab

При этом другие программы, например, Audacity, работают на запись с микрофона.

В директории /dev/ отсутствует объект dsp


[root@testbed ~]# ls /dev/dsp
ls: cannot access /dev/dsp: No such file or directory
[root@testbed ~]# ls /dev/d*
/dev/dm-0 /dev/dm-1 /dev/dm-2 /dev/dm-3 /dev/dvd /dev/dvdrw

/dev/disk:
by-id by-label by-path by-uuid

/dev/dri:
card0 controlD64
[root@testbed ~]# uname -a
Linux testbed 2.6.32.16-150.fc12.i686.PAE #1 SMP Sat Jul 24 05:25:42 UTC 2010 i686 i686 i386 GNU/Linux

Я в этом не очень разбираюсь, поэтому, хотелось бы не только решить проблему, но и пополнить багаж знаний: что вообще это всё означает?

P.S. Большое спасибо за подсказки!!!



Последнее исправление: Dims2000 (всего исправлений: 1)

Ответ на: комментарий от Deleted

В кратце: во многих современных UNIX-подобных ОС для вывода звука используется интерфейс OSS (Open Sound System). А в Linux'е когда-то давно с OSS перешли на ALSA (Advanced Linux Sound Architecture). /dev/dsp - это девайс для работы с OSS. В ALSA есть эмуляция интерфейса OSS и находится она в модуле ядра snd-pcm-oss.

Deleted
()
Ответ на: комментарий от Deleted

> и находится она в модуле ядра snd-pcm-oss

Спасибо, понятно.

А эти «модули ядра», они одинаковы для всех дистрибутивов, как и само ядро?

У меня получилось так:

[root@testbed ~]# modprobe snd-pcm-oss [root@testbed ~]# ls /dev/dsp /dev/dsp

А как правильно сделать, чтобы модуль snd-pcm-oss загружался автоматически?

И как можно в подобных случаях узнать, какие вообще бывают модули ядра? Получить какой-то их список, описание что они делают?

Dims2000
() автор топика
Ответ на: комментарий от Deleted

А, понятно, валяются в /lib/modules/<имя ядра>

Dims2000
() автор топика

Есть другой способ - padsp твоя_программа, тогда будет задействован эмулятор OSS из пульсаудио (а в 12-й федоре пульсаудио по умолчанию присутствует). Что будет работать лучше - сложно сказать, я бы попробовал и то, и то.

vga ★★
()
Ответ на: комментарий от Deleted

Я должен поместить скрипт в /etc/sysconfig/modules

Надо самому написать или есть какая-то автоматизированная процедура? Если я склонирую имеющийся у меня там


[root@testbed modules]# ls
bluez-uinput.modules
[root@testbed modules]# cat bluez-uinput.modules
#!/bin/sh

if [ ! -c /dev/input/uinput ] ; then
exec /sbin/modprobe uinput >/dev/null 2>&1
fi


это будет правильно?

Dims2000
() автор топика
Ответ на: комментарий от vga

> Есть другой способ - padsp твоя_программа

Круто! А сработает ли если моя программа вызывает кучу других программ и обращаться к OSS будут они?

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

А эти «модули ядра», они одинаковы для всех дистрибутивов, как и само ядро?

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

У меня получилось так:

[root@testbed ~]# modprobe snd-pcm-oss [root@testbed ~]# ls /dev/dsp /dev/dsp

Для теста работоспособность можешь попробовать выполнить

cat /dev/urandom >/dev/dsp
Из колонок должен пойти шум.
А как правильно сделать, чтобы модуль snd-pcm-oss загружался автоматически?
В Fedora смотри /etc/modprobe.d/dist-oss.conf.

И как можно в подобных случаях узнать, какие вообще бывают модули ядра? Получить какой-то их список, описание что они делают?

Cписок всех доступных модулей:

modprobe -l
Список загруженных модулей и их зависимостей:
lsmod
Краткая информация о модуле:
modinfo $MODULENAME

Deleted
()
Ответ на: комментарий от Deleted

Я сделал так:


[root@testbed modules]# ls
bluez-uinput.modules oss.module
[root@testbed modules]# cat oss.module
#!/bin/sh

if [ ! -c /dev/dsp ] ; then
exec /sbin/modprobe snd-pcm-oss >/dev/null 2>&1
fi

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

это будет правильно?

Честно говоря - хз. Но думаю можно и так. В общем попробуй =).

Deleted
()
Ответ на: комментарий от Dims2000

Теоретически да, там LD_PRELOAD кажется, он будет для всех. Но я сам на «запись» не пробовал, просто не сталкивался с таким софтом, на «воспроизведение» у меня работало (правда уже и не помню, что это за софт был).

vga ★★
()
Ответ на: комментарий от Dims2000

Есть другой способ - padsp твоя_программа

Да кстати, этот способ лучший, если он работает с твоей программой.

А сработает ли если моя программа вызывает кучу других программ и обращаться к OSS будут они?

Да, если они не собраны статически и не работают с OSS каким-нибудь хитрожопым способом.

Deleted
()
Ответ на: комментарий от Deleted

Большое спасибо за ликбез! Особенно понравилась возможность пустить шум в колонки! Линукс рулеззз! :)

Dims2000
() автор топика
Ответ на: комментарий от Deleted

Вота чё написано:

[root@testbed modprobe.d]# cat dist-oss.conf # OSS Sound Support # This has been disabled in F11 onwards because it can interfere with the # PulseAudio sound service (a legacy OSS application can prevent PulseAudio # applications from playing sound by preventing PulseAudio from (re-)opening # the sound device). To re-enable support, uncomment the following line: # # install snd-pcm /sbin/modprobe --ignore-install snd-pcm && /sbin/modprobe snd-pcm-oss && /sbin/modprobe snd-seq-device && /sbin/modprobe snd-seq-oss

Поэтому я свой скрипт уберу и раскомменчу тут...

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

Сразу предупрежу: если ты будешь использовать ядрёную эмуляцию OSS, то у тебя одновременно работать с аудиоустройством (выводить или записывать звук) сможет только одна программа. Это ограничение OSS.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.