Генерація випадкового шуму для розваги в / dev / snd /


41

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

Я використовую ALSA.

Тому я доручаю кішці передавати деякі випадкові дані у файл відтворення у папці / dev ...

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

то я отримую те, що видається помилкою від кота

 cat: write error: File descriptor in bad state

Як я можу це виправити, щоб почути смачну статичну гру зі своєї звукової карти?


1
Я думаю, вам потрібно надсилати випадкові дані PCM , або, можливо, вам потрібно спочатку налаштувати пристрій за допомогою кількох йоктлів - ви не можете просто скинути випадкові байти.
Жил 'ТАК - перестань бути злим'

@Gilles За даними Wikipedia, .wav - це PCM, і я отримую точно такий же результат, коли замінюю випадковий файл на .wav-файл. Я буду досліджувати налаштування деяких елементів керування введення-виведення.
Джонс

Хтось має вказівник для підручника про те, як налаштувати якісь йоктили? Щось під назвою ioctls, я думав, що ALSA як API повинен надавати інтерфейс для введення та виведення?
Джонс

Ось робочий приклад, як записати дані pcm безпосередньо у файл пристрою: github.com/igor-liferenko/pcm
Ігор Ліферко,

Відповіді:


46

Я думаю, що причина цього не працює для вас в тому, що цей інтерфейс застарів. Зазвичай ви не можете писати аудіо, використовуючи /dev/dspпринаймні, принаймні, не піддаючись хитрості.

Існує програма , яка буде виконувати це для вас на вашій системі: padsp. Це відобразить карту /dev/audioабо /dev/dspфайл у новій системі аудіосервера.

Запустіть термінал і перейдіть в кореневий режим за допомогою sudo su.

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

Отримавши суперусер, спробуйте виконати цю команду:

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

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

Сподіваюсь, це пояснює, чому вона раніше не працювала.

Особисто я виявив, що миша та пам'ять набагато цікавіші, ніж грати у випадкові статики!


1
Дуже дякую! Це те, що я шукав. Відповів повних 7 місяців після публікації питання! :-)
приєднується

3
Здається, sudoдля цього не потрібні пільги.
ійрін

2
дуже дякую. Я знайшов бінарні файли дивно цікавими. такі речі, як / usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql
don яскравий

Хм, дивно, "tee" може це зробити, але "dd of = / dev / audio" не може.
Ясен

@Jasen dd може писати занадто багато часу. padsp імітує / dev / audio, щоб перенаправити його через alsa. dd без padsp навіть не побачить / dev / audio, якщо не включена емуляція OSS в ядрі (і за замовчуванням це не так). І я думаю, що написання великого блоку, набагато більшого, ніж вбудовані драйвери, може навіть провалитися.
Пол Стеліан

8

cat /dev/urandom | aplay це команда, яку потрібно набрати. Якщо ви не входите до групи "аудіо", ви можете встановити префікс aplay за допомогою sudo. Це також не заважає жодним демонам (я працював, pulseaudioпоки ця команда була активною і правильно чула "шум".

EDIT (6 серпня 2019 р.): У старшій версії команди я також мав padsp teeріч між catі aplay. Тепер, коли я фактично працюю в цій галузі, я розумію, що це абсолютно не мало сенсу. Крім того, я знаю, що оновлена ​​команда (одна, видима зараз на початку цієї відповіді) працює, тому що я її використовую кілька разів на день на роботі.


6
Я використовую ALSA, і "padsp tee" не потрібен.
Геремія

1
З мого досвіду pulseaudio (і все, що Ubuntu використовує, коли PA знижується), що padsp teeбуло потрібно (я в той час був точним 12.04.2). Справа в тому, що ви не повинні намагатися скидати дані безпосередньо на пристрої, навіть якщо ви були root ( наскільки я знаю, декілька файлів читаються і жодного не можна записати у папці / dev), тому що ви можете отримати помилку (в кращому випадку, яка стає все частішою з кожним оновленням), зламати ядро ​​або навіть зламати пристрій, у рідкісних випадках. Для цього слід використовувати непривілейовані елементи, як-от aplay (на жаль, потрібна звукова група або root). @geremia
Paul Stelian

Смішно, як зараз я бачу, що ця padsp teeріч насправді не має жодного сенсу ВСЕ. На роботі я використовую щось подібне без цього рядка, щоб перевірити, що я просуваюся в написанні аудіодрайвера. Тепер оновлю мою відповідь.
Пол Стеліан

3

Спробуйте / dev / audio або на іншому пристрої в / dev / snd. Не всі вони є мийками для аудіоданих, можливо, ви зловили мікшер, мікрофон чи щось таке


1
Дякую за відповідь. Згідно з / proc / asound / devices / dev / snd / pcmC0D0p - це правильний пристрій для відтворення аудіо (звідси 'p')
приєднується

1
Крім того, я не впевнений, але чи можуть бути декілька розроблених "файлів" для відтворення? У мене немає '/ dev / audio' Я думаю '/ dev / audio' має щось спільне з OSS, який використовується на старих ядрах (до 2,5)
Jones

2

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


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. Після цього ПКМ знаходиться в PREPAREDстані.

  4. Почніть читання (зйомка) або запис (відтворення).

Мінімальний додаток для читання або запису на ПКМ буде мати більшість свого коду навколо апаратних маніпуляцій з параметрами.


Я не впевнений, що фактична робота читання / запису працює, оскільки aplay використовує (принаймні, у системі, в якій я розвиваюсь) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...), а не фактичний виклик write () при відтворенні. Чи сама ALSA має обгортку, яка приймає точки введення читання / запису і переводить їх в ioctl?
Пол Стеліан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.