Генерация случайного шума для развлечения в / dev / snd /

41

Недавно я изучал зачарованную папку / dev. Я хочу записать случайные данные на аудиоустройство, чтобы создать шум.

Я использую ALSA.

Поэтому я приказываю cat передать некоторые случайные данные в файл воспроизведения в папке / dev ...

 cat file-of-random-data > /dev/snd/pcmC0D0p

тогда я получаю то, что кажется ошибкой от кошки

 cat: write error: File descriptor in bad state

Как я могу это исправить, чтобы услышать восхитительную статическую игру с моей звуковой карты?

Джоунс
источник
1
Я думаю, что вам нужно отправить случайные данные PCM , или, может быть, вам нужно сначала настроить устройство с несколькими ioctl - вы не можете просто сбросить случайные байты.
Жиль "ТАК - перестань быть злым"
@ Жиль Согласно Википедии, .wav - это PCM, и я получаю точно такой же результат, когда заменяю случайный файл на файл .wav. Я буду исследовать настройку некоторых входных / выходных элементов управления.
Джонс
У кого-нибудь есть указатель на учебник о том, как настроить некоторые ioctl? Для того, что называется ioctls, я думал, что ALSA как API должен обеспечивать интерфейс для ввода и вывода?
Джонс
Вот рабочий пример того, как записать данные
PCM

Ответы:

46

Я думаю, что причина этого не работает для вас, потому что этот интерфейс устарел. Вы обычно не можете писать аудио, используя /dev/dspбольше, по крайней мере, не будучи хитрым.

Существует программа , которая будет выполнять это для вас на вашей системе: padsp. Это сопоставит файл /dev/audioили /dev/dspс новой системой Audio Server.

Запустите терминал и войдите в режим root с помощью sudo su.

Затем я собираюсь направить cat /dev/urandomвывод padspи использовать teeкоманду для отправки данных /dev/audio. Вы получите тонну мусора в своем терминале, так что вы можете перенаправить на /dev/null.

Когда вы в суперпользователе, попробуйте эту команду:

cat /dev/urandom | padsp tee /dev/audio > /dev/null

Вы можете даже попробовать другие устройства, такие как мышь: например, Use: /dev/psauxили драйвер usb. Вы даже можете запустить свою память через это: /dev/mem

Надеюсь, это проясняет, почему это не сработало раньше.

Лично я обнаружил, что мышь и память гораздо интереснее, чем игра в случайную статическую игру!

Крис Томас
источник
1
Большое спасибо! Это то, что я искал. Ответили целых 7 месяцев после публикации вопроса! :-)
Джонс
3
Кажется, что sudoпривилегии не требуются для этого.
Айрин
2
большое спасибо. я нашел двоичные файлы странно интересными. такие вещи, как / usr / bin / ls / usr / bin / gnome-терминал / usr / bin / mysql
don bright
хм, странно, 'tee' может сделать это, но 'dd of = / dev / audio' не может.
Jasen
@Jasen dd может писать слишком много за раз. padsp имитирует / dev / audio, чтобы перенаправить его через alsa. dd без padsp даже не увидит / dev / audio, если в ядре не включена эмуляция OSS (а по умолчанию это не так). И я думаю, что запись большого блока, намного большего, чем буферы в драйвере, может даже потерпеть неудачу.
Пол Стелиан
8

cat /dev/urandom | aplay это команда, которую нужно набрать. Если вы не в группе «audio», вы можете добавить к sudo префикс aplay. Это также не мешает работе демонов (я работал, pulseaudioкогда эта команда была активной, и правильно слышал «шум»).

РЕДАКТИРОВАТЬ (6 августа 2019 г.): В более старой версии команды у меня тоже было что- padsp teeто между catи aplay. Теперь, когда я действительно работаю в этой области, я понимаю, что в этом нет абсолютно никакого смысла. Кроме того, я знаю, что обновленная команда (видимая в начале этого ответа) работает, потому что я использую ее несколько раз в день на работе.

Пол Стелян
источник
6
Я использую ALSA, и «padsp tee» не нужен.
Геремия,
1
В моем опыте pulseaudio (и того, что использует Ubuntu, когда PA не работает) это padsp teeбыло необходимо (у меня был точный 12.04.2 в то время) Дело в том, что вы не должны пытаться выгружать данные непосредственно на устройства, даже если вы были пользователем root ( Насколько я знаю, мало файлов доступно для чтения и ни одного файла в папке / dev), потому что вы можете либо получить ошибку (в лучшем случае, которая встречается чаще при каждом обновлении), либо вызвать сбой ядра, либо даже сломать устройство, в редких случаях. Для этого нужно использовать непривилегированные элементы, такие как aplay (требуется аудиогруппа или root, к сожалению). @geremia
Пол Стелиан
Забавно, но теперь я вижу, что эта padsp teeвещь вообще не имеет никакого смысла. На работе я использую нечто подобное без этой строки, чтобы проверить, что я делаю успехи в написании аудио драйвера. Буду обновлять мой ответ.
Пол Стелиан
3

Попробуйте / dev / audio или одно из других устройств в / dev / snd. Не все они являются приемниками аудиоданных, возможно, вы поймали микшер, микрофон или что-то еще

Стефан Ноак
источник
1
Спасибо за ответ. Согласно / proc / asound / devices / dev / snd / pcmC0D0p является правильным устройством для воспроизведения аудио (отсюда и «p»)
Джонс
1
Кроме того, я не уверен, но может ли быть несколько файлов "dev" для воспроизведения? У меня нет '/ dev / audio'. Я думаю, что / dev / audio 'как-то связан с OSS, который используется в старых ядрах (до 2.5)
Джонс
2

Звуковой демон (например pulseaudio) удерживает блокировку на устройстве? Я думаю, что вы можете узнать, есть ли что-нибудь еще, с помощью этого lsof.

jmtd
источник
1
Спасибо за полезное предложение. У меня был чек, используя grepи lsof. pulseaudioиспользует, /dev/snd/controlC0но не включен /dev/snd/pcmC0D0p. Я дважды проверил, /var/lockнашел ли файл для блокировки устройства. ls -alговорит, что папка пуста. Так что я думаю, что нет блокировки на pcmC0D0p
Джонс
@jones Удержание блокировки на элементе управления может быть достаточным для блокировки всей карты, в зависимости от драйвера. (извините за ответ через 8 лет, теперь я сам это узнал)
Пол Стелян
0

TL; DR: параметры устройства должны быть установлены до чтения или записи в него данных.

Шаг за шагом:

  1. Откройте устройство PCM. Например: fd = open("/dev/snd/pcmC0D0p", O_RDWR). После открытия PCM находится в OPENсостоянии.

  2. Установите параметры с помощью ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p). Структура аппаратных параметров имеет маски (каждый бит является значением) и интервалы (диапазон [минимум, максимум]). Параметры, которые не устанавливаются, должны быть заполнены (все биты / значения установлены для масок; полный диапазон для интервалов). После установки аппаратных параметров PCM находится в SETUPсостоянии. См. Pcm_set_config () TinyALSA для кода.

    Установка ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZEи PERIODSдостаточно. Другие параметры являются их вариантами, за исключением того, BUFFER_SIZEчто в некоторых устройствах может быть установлено не кратное PERIOD_SIZE.

  3. Вызов ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)для подготовки устройства и переменных времени выполнения ALSA. После этого PCM находится в PREPAREDсостоянии.

  4. Начните чтение (захват) или запись (воспроизведение).

Минимальное приложение для чтения или записи на устройство PCM будет иметь большую часть своего кода вокруг манипулирования аппаратными параметрами.

Рикардо Биль Паскуали
источник
Я не уверен, действительно ли работает чтение / запись, так как aplay использует (по крайней мере, в системе, на которой я разрабатываю) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...), а не фактический вызов write () при воспроизведении. Есть ли у ALSA обертка, которая берет точки входа для чтения / записи и переводит их в ioctl?
Пол Стелиан
@PaulStelian Да. Смотрите определение файловых операций для PCM . В snd_pcm_read()и snd_pcm_write(), байты преобразуются в кадры .
Рикардо Биль Паскуали