엔터테인먼트를 위해 /dev/snd/에서 무작위 노이즈 생성

엔터테인먼트를 위해 /dev/snd/에서 무작위 노이즈 생성

최근에 나는 마법의 /dev 폴더를 탐색하고 있습니다. 소음을 발생시키기 위해 오디오 장치에 임의의 데이터를 쓰고 싶습니다.

저는 ALSA를 사용하고 있습니다.

그래서 나는 cat에게 임의의 데이터를 /dev 폴더의 플레이 파일로 파이프하도록 지시합니다.

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

그런 다음 고양이에게서 오류가 발생했습니다.

 cat: write error: File descriptor in bad state

사운드 카드에서 멋진 정적 재생 사운드를 얻을 수 있도록 이 문제를 어떻게 해결합니까?

답변1

이것이 작동하지 않는 이유는 인터페이스가 더 이상 사용되지 않기 때문이라고 생각합니다. /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

이전에 작동하지 않았던 이유가 명확해지기를 바랍니다.

개인적으로 랜덤 정적인 플레이보다 마우스와 메모리가 더 재미있는 것 같아요!

답변2

cat /dev/urandom | aplay 입력해야 하는 명령입니다. 오디오 그룹에 속하지 않은 경우 aplay 앞에 sudo를 붙일 수 있습니다. 이는 또한 데몬을 방해하지 않습니다( pulseaudio이 명령이 활성화되어 있는 동안 실행 중이고 "소음"이 올바르게 들립니다.

편집(2019년 8월 6일): 이전 버전의 명령에는 padsp tee와 . 실제로 이 분야에서 일하면서 이것이 전혀 말이 되지 않는다는 것을 깨달았습니다. 또한 업데이트된 명령(현재 이 답변의 시작 부분에 표시되는 명령)이 직장에서 하루에 여러 번 사용하기 때문에 작동한다는 것을 알고 있습니다.cataplay

답변3

/dev/audio 또는 /dev/snd에서 다른 장치 중 하나를 사용해 보십시오. 이들 모두가 오디오 데이터 싱크는 아니며 믹서, 마이크 등을 캡처했을 수도 있습니다.

답변4

고쳐 쓰다(2020-12-25): stdin에서 stdout으로 데이터를 전달하고 PCM 파일인 경우 stdout을 설정하는 쉘 스크립트를 만들었습니다. 확인하다https://github.com/psqli/pcmsh.

핵심요약: 데이터를 읽거나 쓰기 전에 장치의 매개변수를 설정해야 합니다.

단계별:

  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 장치를 읽거나 쓰는 최소 애플리케이션의 코드 대부분은 하드웨어 매개변수를 중심으로 이루어집니다.

관련 정보