Menghasilkan suara acak untuk bersenang-senang di / dev / snd /

41

Baru-baru ini saya telah menjelajahi folder enchanted / dev. Saya ingin menulis beberapa data acak ke perangkat audio untuk menghasilkan suara.

Saya menggunakan ALSA.

Jadi saya memerintahkan cat untuk mem-pipe beberapa data acak ke file playback di folder / dev ...

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

maka saya menerima apa yang tampaknya menjadi kesalahan dari kucing

 cat: write error: File descriptor in bad state

Bagaimana saya bisa memperbaikinya sehingga saya bisa mendengar permainan statis yang enak dari kartu suara saya?

jones
sumber
1
Saya pikir Anda perlu mengirim data PCM acak , atau mungkin Anda perlu mengatur perangkat dengan beberapa ioctl terlebih dahulu - Anda tidak bisa hanya membuang byte acak.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Menurut Wikipedia, .wav adalah PCM dan saya mendapatkan hasil yang persis sama ketika mengganti file acak dengan file .wav. Saya akan menyelidiki pengaturan beberapa kontrol masuk / keluar.
jones
Apakah seseorang memiliki petunjuk untuk tutorial tentang cara mengatur beberapa ioctls? Untuk sesuatu yang disebut ioctls, saya pikir ALSA sebagai API harus menyediakan antarmuka untuk input dan output?
Jones
Berikut ini adalah contoh kerja bagaimana menulis data PCM langsung ke file perangkat: github.com/igor-liferenko/pcm
Igor Liferenko

Jawaban:

46

Saya pikir alasan ini tidak berfungsi untuk Anda adalah karena antarmuka itu sudah usang. Anda biasanya tidak dapat menulis audio menggunakan /dev/dsplagi, setidaknya tanpa menjadi rumit.

Ada program yang akan melakukannya untuk Anda pada sistem Anda: padsp. Ini akan memetakan /dev/audioatau /dev/dspfile ke sistem Server Audio baru.

Jalankan terminal dan masuk ke mode root dengan sudo su.

Lalu, saya akan ke cat /dev/urandomdan pipa output ke padspdan menggunakan teeperintah untuk mengirim data /dev/audio. Anda akan mendapatkan satu ton sampah di terminal Anda, jadi Anda mungkin ingin mengalihkan ke /dev/null.

Setelah Anda menggunakan superuser, coba perintah ini:

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

Anda bahkan mungkin ingin mencoba dengan perangkat lain, seperti mouse Anda: Gunakan /dev/psaux:, misalnya atau driver usb. Anda bahkan dapat menjalankan memori Anda melalui itu: /dev/mem

Semoga ini menjelaskan mengapa itu tidak berhasil sebelumnya.

Secara pribadi, saya menemukan mouse dan memori jauh lebih menarik daripada bermain statis acak!

Chris Thomas
sumber
1
Terima kasih banyak! Ini yang saya cari. Menjawab 7 bulan penuh setelah memposting pertanyaan! :-)
jones
3
Tampaknya sudohak istimewa tidak diperlukan untuk ini.
iyrin
2
Terima kasih banyak. saya menemukan biner menjadi sangat menarik. hal-hal seperti / usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql
don bright
hmm, aneh, 'tee' bisa melakukan ini tetapi 'dd = / dev / audio' tidak bisa.
Jasen
@Jasen dd mungkin menulis terlalu banyak dalam satu waktu. padsp mensimulasikan / dev / audio untuk mengarahkan ulang melalui alsa. dd tanpa padsp bahkan tidak akan melihat / dev / audio kecuali jika emulasi OSS dalam kernel diaktifkan (dan secara default tidak). Dan saya pikir menulis blok besar, jauh lebih besar daripada buffer dalam driver, bahkan bisa gagal.
Paul Stelian
8

cat /dev/urandom | aplay adalah perintah yang perlu diketik. Jika Anda tidak berada dalam grup "audio", Anda dapat mengawali aplay dengan sudo. Ini juga tidak mengganggu daemon apa pun (saya menjalankan pulseaudiosementara perintah ini aktif dan benar mendengar "noise".

EDIT (6 Agt 2019): Dalam versi yang lebih lama dari perintah saya juga punya padsp teesesuatu antara catdan aplay. Sekarang saya benar-benar bekerja di lapangan saya menyadari bahwa itu sama sekali tidak masuk akal. Juga, saya tahu perintah yang diperbarui (yang terlihat sekarang di awal jawaban ini) berfungsi karena saya menggunakannya beberapa kali sehari di tempat kerja.

Paul Stelian
sumber
6
Saya menggunakan ALSA, dan "padsp tee" tidak perlu.
Geremia
1
Dalam pengalaman pulseaudio saya (dan apa pun Ubuntu menggunakan ketika PA turun) yang padsp teediperlukan (saya punya tepat 12.04.2 pada waktu itu) Masalahnya adalah Anda tidak boleh mencoba untuk membuang data langsung ke perangkat, bahkan jika Anda root ( Sejauh yang saya tahu beberapa file dapat dibaca dan tidak ada yang dapat ditulis dalam folder / dev), karena Anda bisa mendapatkan kesalahan (dalam kasus terbaik, yang menjadi lebih umum dengan setiap pembaruan), crash kernel atau bahkan merusak perangkat, dalam kasus yang jarang terjadi. Seseorang harus menggunakan elemen yang tidak memiliki hak istimewa, seperti aplay, untuk melakukan ini (sayangnya, grup audio atau root diperlukan). @geremia
Paul Stelian
Lucu bagaimana sekarang saya melihat bahwa padsp teehal itu sebenarnya tidak masuk akal sama sekali. Di tempat kerja saya menggunakan sesuatu yang serupa tanpa garis itu untuk menguji bahwa saya membuat kemajuan dengan menulis driver audio. Sekarang akan memperbarui jawaban saya.
Paul Stelian
3

Coba / dev / audio atau salah satu perangkat lain di bawah / dev / snd. Tidak semuanya merupakan data audio sink, Anda mungkin telah menangkap mixer, mikrofon, atau sesuatu

Stefan Noack
sumber
1
Terima kasih balasannya. Menurut / proc / asound / devices / dev / snd / pcmC0D0p adalah perangkat yang tepat untuk pemutaran audio (karenanya 'p')
jones
1
Juga, saya tidak yakin, tetapi bisakah ada beberapa "file" dev untuk diputar? Saya tidak punya '/ dev / audio' Saya pikir '/ dev / audio' ada hubungannya dengan OSS yang digunakan pada kernel lama (sebelum 2.5)
jones
2

Apakah daemon suara (mis. pulseaudio) Memegang kunci pada perangkat? Saya pikir Anda bisa mencari tahu apakah ada hal lain yang bisa ditangani lsof.

jmtd
sumber
1
Terima kasih atas saran yang bermanfaat. Saya sudah cek, menggunakan grepdan lsof. pulseaudiomenggunakan /dev/snd/controlC0tetapi tidak aktif /dev/snd/pcmC0D0p. Saya melakukan pemeriksaan ganda dengan /var/lockmencari apakah ada file untuk kunci pada perangkat. ls -almemberitahu bahwa folder tersebut kosong. Jadi saya kira tidak ada kunci pada pcmC0D0p
jones
@ jones Memegang kunci pada kontrol mungkin cukup untuk mengunci seluruh kartu, tergantung pada driver. (maaf sudah menjawab setelah 8 tahun, sekarang saya belajar sendiri)
Paul Stelian
0

TL; DR: Parameter perangkat harus ditetapkan sebelum membaca atau menulis data.

Selangkah demi selangkah:

  1. Buka perangkat PCM. Misalnya: fd = open("/dev/snd/pcmC0D0p", O_RDWR). Setelah terbuka, PCM dalam OPENkondisi.

  2. Setel parameter dengan ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p). Struktur parameter perangkat keras memiliki topeng (setiap bit adalah nilai) dan interval (kisaran [minimum, maksimum]). Parameter yang tidak disetel harus lulus diisi (semua bit / nilai ditetapkan untuk topeng; rentang penuh untuk interval). Setelah mengatur parameter perangkat keras, PCM dalam SETUPkondisi. Lihat pcm_set_config () dari TinyALSA untuk kode.

    Pengaturan ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZEdan PERIODScukup. Parameter lainnya adalah varian dari ini, kecuali BUFFER_SIZEbahwa di beberapa perangkat dapat diatur ke non kelipatan PERIOD_SIZE.

  3. Panggilan ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)untuk menyiapkan perangkat dan variabel runtime ALSA. Setelah ini, PCM dalam PREPAREDkondisi.

  4. Mulai membaca (menangkap) atau menulis (pemutaran).

Aplikasi minimal untuk membaca atau menulis ke perangkat PCM akan memiliki sebagian besar kode di sekitar manipulasi parameter perangkat keras.

Ricardo Biehl Pasquali
sumber
Saya tidak yakin apakah karya baca / tulis yang sebenarnya, karena aplay menggunakan (setidaknya pada sistem yang saya kembangkan) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...) dan bukan panggilan tulis () aktual pada pemutaran. Apakah ALSA sendiri memiliki pembungkus yang mengambil titik masuk baca / tulis dan menerjemahkannya ke ioctl?
Paul Stelian
@PaulStelian Ya. Lihat definisi operasi file untuk PCM . Dalam snd_pcm_read()dan snd_pcm_write(), byte dikonversi ke bingkai .
Ricardo Biehl Pasquali