
최근에 나는 마법의 /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
와 . 실제로 이 분야에서 일하면서 이것이 전혀 말이 되지 않는다는 것을 깨달았습니다. 또한 업데이트된 명령(현재 이 답변의 시작 부분에 표시되는 명령)이 직장에서 하루에 여러 번 사용하기 때문에 작동한다는 것을 알고 있습니다.cat
aplay
답변3
/dev/audio 또는 /dev/snd에서 다른 장치 중 하나를 사용해 보십시오. 이들 모두가 오디오 데이터 싱크는 아니며 믹서, 마이크 등을 캡처했을 수도 있습니다.
답변4
고쳐 쓰다(2020-12-25): stdin에서 stdout으로 데이터를 전달하고 PCM 파일인 경우 stdout을 설정하는 쉘 스크립트를 만들었습니다. 확인하다https://github.com/psqli/pcmsh.
핵심요약: 데이터를 읽거나 쓰기 전에 장치의 매개변수를 설정해야 합니다.
단계별:
PCM 장치를 켜십시오. 예를 들어:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. 켜져 있으면 PCMOPEN
상태입니다.설정 매개변수를 사용합니다
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
. 하드웨어 매개변수 구조에는마스크(각 비트는 값입니다)간격([최소, 최대] 범위). 설정되지 않은 매개변수는 채워져야 합니다(마스크에 대해 설정된 모든 비트/값, 전체 범위의 간격). 하드웨어 매개변수를 설정한 후 PCMSETUP
상태가 됩니다. 바라보다pcm_set_config()TinyALSA에 대한 코드입니다.ACCESS
,FORMAT
,RATE
및 설정CHANNELS
으로 충분PERIOD_SIZE
합니다PERIODS
. 다른 매개변수는 이러한 매개변수의 변형입니다. 단,BUFFER_SIZE
일부 장치에서는 비다중으로 설정할 수 있습니다PERIOD_SIZE
.ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
장치 및 ALSA 런타임 변수를 준비하기 위해 호출됩니다 . 그 이후에는 PCM 상태가 됩니다PREPARED
.읽기(캡처) 또는 쓰기(재생)를 시작하세요.
PCM 장치를 읽거나 쓰는 최소 애플리케이션의 코드 대부분은 하드웨어 매개변수를 중심으로 이루어집니다.