Tạo tiếng ồn ngẫu nhiên cho vui trong / dev / snd /


41

Gần đây tôi đã khám phá thư mục bùa mê / dev. Tôi muốn ghi một số dữ liệu ngẫu nhiên vào một thiết bị âm thanh để tạo ra một số tiếng ồn.

Tôi đang sử dụng ALSA.

Vì vậy, tôi hướng dẫn mèo chuyển một số dữ liệu ngẫu nhiên vào tệp phát lại trong thư mục / dev ...

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

sau đó tôi nhận được những gì có vẻ là một lỗi từ con mèo

 cat: write error: File descriptor in bad state

Làm cách nào để khắc phục điều này để tôi có thể nghe một số phát tĩnh tuyệt vời từ card âm thanh của mình?


1
Tôi nghĩ rằng bạn cần gửi dữ liệu PCM ngẫu nhiên hoặc có thể bạn cần thiết lập thiết bị với một vài ioctls trước - bạn không thể kết xuất các byte ngẫu nhiên.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Theo Wikipedia, .wav là PCM và tôi nhận được kết quả chính xác tương tự khi thay thế tệp ngẫu nhiên bằng tệp .wav. Tôi sẽ điều tra thiết lập một số điều khiển vào / ra.
jones

Có ai đó có một con trỏ cho một hướng dẫn về cách thiết lập một số ioctls? Đối với một cái gì đó gọi là ioctls, tôi nghĩ ALSA là một API nên cung cấp giao diện cho đầu vào và đầu ra?
jones

Dưới đây là một ví dụ hoạt động về cách ghi dữ liệu pcm trực tiếp vào tệp thiết bị: github.com/igor-liferenko/pcm
Igor Liferenko

Câu trả lời:


46

Tôi nghĩ lý do điều này không hiệu quả với bạn là vì giao diện đó không được dùng nữa. Bạn thường không thể viết âm thanh bằng cách sử dụng /dev/dspnữa, ít nhất là không bị khó khăn.

Có một chương trình sẽ thực hiện điều này cho bạn trên hệ thống của bạn : padsp. Điều này sẽ ánh xạ /dev/audiohoặc /dev/dsptệp vào hệ thống Máy chủ âm thanh mới.

Bật thiết bị đầu cuối và vào chế độ root với sudo su.

Sau đó, tôi sẽ chuyển cat /dev/urandomvà đưa đầu ra vào padspvà sử dụng teelệnh để gửi dữ liệu tới /dev/audio. Bạn sẽ nhận được một tấn rác trong thiết bị đầu cuối của mình, vì vậy bạn có thể muốn chuyển hướng đến /dev/null.

Khi bạn đang ở trong siêu người dùng, hãy thử lệnh này:

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

Bạn thậm chí có thể muốn thử với các thiết bị khác, như chuột của bạn: Sử dụng : /dev/psaux, ví dụ hoặc trình điều khiển usb. Bạn thậm chí có thể chạy bộ nhớ của bạn thông qua nó: /dev/mem

Hy vọng điều này làm rõ lý do tại sao nó không hoạt động trước đây.

Cá nhân, tôi thấy chuột và bộ nhớ thú vị hơn nhiều so với chơi tĩnh ngẫu nhiên!


1
Cảm ơn rất nhiều! Đây là những gì tôi đang tìm kiếm. Đã trả lời đầy đủ 7 tháng sau khi đăng câu hỏi! :-)
jones

3
Có vẻ như các sudođặc quyền không được yêu cầu cho việc này.
iyrin

2
cảm ơn rất nhiều. tôi tìm thấy nhị phân là thú vị kỳ lạ. những thứ như / usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql
don sáng

hmm, lạ, 'tee' có thể làm điều này nhưng 'dd of = / dev / audio' thì không thể.
Jasen

@Jasen dd có thể viết quá nhiều tại một thời điểm. padsp mô phỏng / dev / audio để chuyển hướng nó qua alsa. dd không có padsp thậm chí sẽ không nhìn thấy / dev / audio trừ khi mô phỏng OSS trong kernel được bật (và theo mặc định là không). Và tôi nghĩ rằng việc viết một khối lớn, lớn hơn nhiều so với bộ đệm trong trình điều khiển, thậm chí có thể thất bại.
Paul Stelian

8

cat /dev/urandom | aplay là lệnh cần được gõ. Nếu bạn không thuộc nhóm "âm thanh", bạn có thể bắt đầu phát lại bằng sudo. Điều này cũng không can thiệp vào bất kỳ trình tiện ích nào (Tôi đang chạy pulseaudiotrong khi lệnh này đang hoạt động và nghe chính xác "tiếng ồn".

EDIT (ngày 6 tháng 8 năm 2019): Trong một phiên bản cũ hơn của lệnh tôi cũng có một padsp teeđiều giữa cataplay. Bây giờ tôi đang thực sự làm việc trong lĩnh vực này, tôi nhận ra rằng nó hoàn toàn vô nghĩa. Ngoài ra, tôi biết lệnh được cập nhật (lệnh hiện có ở đầu câu trả lời này) hoạt động vì tôi sử dụng nó nhiều lần trong ngày tại nơi làm việc.


6
Tôi sử dụng ALSA và "padsp tee" không cần thiết.
Geremia

1
Theo kinh nghiệm pulseaudio của tôi (và bất cứ điều gì Ubuntu đang sử dụng khi PA bị tắt) padsp teelà bắt buộc (tôi đã có chính xác 12.04.2 tại thời điểm đó) Điều bạn không nên cố gắng đổ dữ liệu trực tiếp vào thiết bị, ngay cả khi bạn đã root ( theo như tôi biết, có rất ít tệp có thể đọc được và không thể ghi được trong thư mục / dev), bởi vì bạn có thể gặp lỗi (trong trường hợp tốt nhất, phổ biến hơn với mỗi bản cập nhật), làm hỏng kernel hoặc thậm chí làm hỏng thiết bị, Trong một số ít trường hợp. Thật không may, nên sử dụng các yếu tố không có đặc quyền, như aplay, để làm điều này (không may là nhóm âm thanh hoặc root). @geremia
Paul Stelian

Thật buồn cười làm sao bây giờ tôi thấy rằng padsp teethứ thực sự không có ý nghĩa gì cả TẤT CẢ. Trong công việc, tôi sử dụng một cái gì đó tương tự mà không có dòng đó để kiểm tra rằng tôi đang tiến bộ bằng cách viết trình điều khiển âm thanh. Bây giờ sẽ cập nhật câu trả lời của tôi.
Paul Stelian

3

Hãy thử / dev / audio hoặc một trong các thiết bị khác dưới / dev / snd. Không phải tất cả chúng đều là dữ liệu âm thanh, bạn có thể đã bắt gặp một bộ trộn, micrô hoặc một cái gì đó


1
Cảm ơn vi đa trả lơi. Theo / Proc / asound / thiết bị / dev / snd / pcmC0D0p là thiết bị phù hợp để phát lại âm thanh (do đó 'p')
jones

1
Ngoài ra, tôi không chắc chắn, nhưng có thể có nhiều "tập tin" dev để phát lại không? Tôi không có '/ dev / audio' Tôi nghĩ '/ dev / audio' có liên quan đến OSS được sử dụng trên các hạt nhân cũ (trước 2.5)
jones

2

Là một daemon âm thanh (ví dụ pulseaudio) giữ một khóa trên thiết bị? Tôi nghĩ rằng bạn có thể tìm ra nếu có bất cứ điều gì khác có xử lý thông qua nó lsof.


1
Cảm ơn lời đề nghị hữu ích. Tôi đã có một kiểm tra, sử dụng greplsof. pulseaudiođang sử dụng /dev/snd/controlC0nhưng nó không bật /dev/snd/pcmC0D0p. Tôi đã kiểm tra hai lần bằng cách đi /var/locktìm xem có tệp nào bị khóa trên thiết bị không. ls -alnói rằng thư mục trống Vì vậy, tôi đoán không có khóa trên pcmC0D0p
jones

@jones Giữ một khóa trên điều khiển có thể đủ để khóa toàn bộ thẻ, tùy thuộc vào trình điều khiển. (xin lỗi vì đã trả lời sau 8 năm, bây giờ tôi đã tự học được điều đó)
Paul Stelian

0

TL; DR: Các thông số của thiết bị phải được đặt trước khi đọc hoặc ghi dữ liệu vào thiết bị.

Từng bước một:

  1. Mở thiết bị PCM. Vd : fd = open("/dev/snd/pcmC0D0p", O_RDWR). Sau khi mở, PCM ở OPENtrạng thái.

  2. Đặt tham số với ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p). Cấu trúc tham số phần cứng có mặt nạ (mỗi bit là một giá trị) và các khoảng (phạm vi [tối thiểu, tối đa]). Các tham số không được đặt phải được điền đầy đủ (tất cả các bit / giá trị được đặt cho mặt nạ; phạm vi đầy đủ cho các khoảng). Sau khi thiết lập các tham số phần cứng, PCM ở SETUPtrạng thái. Xem pcm_set_config () của TinyALSA để biết mã.

    Thiết ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZEPERIODSlà đủ. Các tham số khác là các biến thể của chúng, ngoại trừ BUFFER_SIZEtrong một số thiết bị có thể được đặt thành không nhiều PERIOD_SIZE.

  3. Gọi ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)để chuẩn bị các biến thời gian chạy thiết bị và ALSA. Sau này, PCM ở PREPAREDtrạng thái.

  4. Bắt đầu đọc (chụp) hoặc viết (phát lại).

Một ứng dụng tối thiểu để đọc hoặc ghi vào thiết bị PCM sẽ có hầu hết mã của nó xung quanh thao tác tham số phần cứng.


Tôi không chắc chắn nếu công việc đọc / ghi thực tế, vì aplay sử dụng (ít nhất là trên hệ thống tôi đang phát triển) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...) và không phải là một cuộc gọi ghi () thực tế khi phát lại. Bản thân ALSA có một trình bao bọc lấy các điểm nhập đọc / ghi và dịch chúng sang ioctl không?
Paul Stelian

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.