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?
Jawaban:
Saya pikir alasan ini tidak berfungsi untuk Anda adalah karena antarmuka itu sudah usang. Anda biasanya tidak dapat menulis audio menggunakan
/dev/dsp
lagi, setidaknya tanpa menjadi rumit.Ada program yang akan melakukannya untuk Anda pada sistem Anda:
padsp
. Ini akan memetakan/dev/audio
atau/dev/dsp
file ke sistem Server Audio baru.Jalankan terminal dan masuk ke mode root dengan
sudo su
.Lalu, saya akan ke
cat /dev/urandom
dan pipa output kepadsp
dan menggunakantee
perintah 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:
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!
sumber
sudo
hak istimewa tidak diperlukan untuk ini.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 menjalankanpulseaudio
sementara perintah ini aktif dan benar mendengar "noise".EDIT (6 Agt 2019): Dalam versi yang lebih lama dari perintah saya juga punya
padsp tee
sesuatu antaracat
danaplay
. 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.sumber
padsp tee
diperlukan (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). @geremiapadsp tee
hal 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.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
sumber
Apakah daemon suara (mis.
pulseaudio
) Memegang kunci pada perangkat? Saya pikir Anda bisa mencari tahu apakah ada hal lain yang bisa ditanganilsof
.sumber
grep
danlsof
.pulseaudio
menggunakan/dev/snd/controlC0
tetapi tidak aktif/dev/snd/pcmC0D0p
. Saya melakukan pemeriksaan ganda dengan/var/lock
mencari apakah ada file untuk kunci pada perangkat.ls -al
memberitahu bahwa folder tersebut kosong. Jadi saya kira tidak ada kunci pada pcmC0D0pTL; DR: Parameter perangkat harus ditetapkan sebelum membaca atau menulis data.
Selangkah demi selangkah:
Buka perangkat PCM. Misalnya:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. Setelah terbuka, PCM dalamOPEN
kondisi.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 dalamSETUP
kondisi. Lihat pcm_set_config () dari TinyALSA untuk kode.Pengaturan
ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
danPERIODS
cukup. Parameter lainnya adalah varian dari ini, kecualiBUFFER_SIZE
bahwa di beberapa perangkat dapat diatur ke non kelipatanPERIOD_SIZE
.Panggilan
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
untuk menyiapkan perangkat dan variabel runtime ALSA. Setelah ini, PCM dalamPREPARED
kondisi.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.
sumber
snd_pcm_read()
dansnd_pcm_write()
, byte dikonversi ke bingkai .