/ dev / snd /에서 재미를 위해 랜덤 노이즈 생성


41

최근에는 마법에 걸린 / dev 폴더를 탐색했습니다. 노이즈를 생성하기 위해 임의의 데이터를 오디오 장치에 쓰고 싶습니다.

ALSA를 사용하고 있습니다.

따라서 cat에 임의의 데이터를 / dev 폴더의 재생 파일로 파이프하도록 지시합니다.

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

그런 다음 고양이의 오류로 보이는 것을받습니다

 cat: write error: File descriptor in bad state

사운드 카드에서 맛있는 정적 플레이를들을 수 있도록이 문제를 어떻게 해결할 수 있습니까?


1
임의의 PCM 데이터 를 보내야 하거나, 먼저 몇 개의 ioctl을 사용하여 장치를 설정 해야한다고 생각합니다 . 임의 바이트 만 덤프 할 수는 없습니다.
Gilles 'SO- 악마 그만해'

@Gilles Wikipedia에 따르면 .wav는 PCM이며 임의 파일을 .wav 파일로 바꿀 때 정확히 동일한 결과를 얻습니다. 입 / 출력 컨트롤 설정을 조사하겠습니다.
jones

누군가 ioctl을 설정하는 방법에 대한 자습서에 대한 포인터가 있습니까? ioctls라는 이름의 ALSA를 API로 입력 및 출력용 인터페이스를 제공해야한다고 생각 했습니까?
jones

다음은 pcm 데이터를 장치 파일에 직접 쓰는 방법에 대한 실제 예입니다. github.com/igor-liferenko/pcm
Igor Liferenko

답변:


46

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

이것이 이전에 작동하지 않은 이유를 분명히하기를 바랍니다.

개인적으로, 마우스와 메모리가 랜덤 스태틱을 플레이하는 것보다 훨씬 흥미로웠다는 것을 알았습니다!


1
고마워요! 이것이 내가 찾던 것입니다. 질문을 게시 한 후 7 개월 동안 답변했습니다! :-)
jones

3
이것에는 sudo특권이 필요하지 않은 것 같습니다 .
iyrin

2
매우 감사합니다. 바이너리가 이상하게 재미 있다는 것을 알았습니다. 일처럼는 / usr / 빈 / LS는 / usr / 빈 / 그놈 터미널은 / usr / 빈 / mysql을
돈 밝은

흠, 이상한, 'tee'는 이것을 할 수 있지만 'dd of = / dev / audio'는 할 수 없습니다.
Jasen

@Jasen dd가 한 번에 너무 많이 쓰고있을 수 있습니다. padsp는 / dev / audio를 시뮬레이션하여 alsa를 통해 리디렉션합니다. 커널 내부 OSS 에뮬레이션이 활성화되어 있지 않으면 padsp가없는 dd는 / dev / audio도 볼 수 없습니다 (기본적으로 활성화되어 있지 않음). 그리고 드라이버 내 버퍼보다 ​​훨씬 큰 큰 블록을 작성하면 실패 할 수 있다고 생각합니다.
Paul Stelian

8

cat /dev/urandom | aplay 입력해야하는 명령입니다. "audio"그룹에 속하지 않으면 ado 접두사를 sudo로 지정할 수 있습니다. 이것은 또한 모든 데몬을 방해하지 않습니다 ( pulseaudio이 명령이 활성화되어 있고 "노이즈"가 올바르게 들리는 동안 실행 중이었습니다.

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


6
나는 ALSA를 사용하고 "padsp 티"는 필요하지 않습니다.
Geremia

1
padsp tee펄스 오디오 경험 (그리고 PA가 다운 될 때 우분투가 사용하는 모든 것) ( 필요한 시점에 정확한 12.04.2를 가졌음)은 루트 인 경우에도 장치에 데이터를 직접 덤프하지 않아야합니다 ( 내가 읽을 수 있고 / dev 폴더에 쓸 수있는 파일이 거의 없다는 것을 아는 한, 오류가 발생하거나 (가장 좋은 경우에는 각 업데이트에 더 일반적 임) 커널을 중단 시키거나 장치를 손상시킬 수 있기 때문에, 드문 경우입니다. 이를 위해서는 aplay와 같은 권한이없는 요소를 사용해야합니다 (불행히도 오디오 그룹 또는 루트 필요). @geremia
Paul Stelian

재미난 지금 나는 그 padsp tee일이 실제로 전혀 의미가 없다는 것을 알았습니다 . 직장에서 나는 오디오 드라이버 작성을 진행하고 있는지 테스트하기 위해 그 줄이없는 비슷한 것을 사용합니다. 이제 답변을 업데이트하겠습니다.
Paul Stelian

3

/ dev / audio 또는 / dev / snd 아래의 다른 장치 중 하나를 시도하십시오. 그들 모두가 오디오 데이터 싱크 인 것은 아닙니다. 믹서, 마이크 등을 잡았을 수 있습니다.


1
답장을 보내 주셔서 감사합니다. / proc / asound / devices에 따르면 / dev / snd / pcmC0D0p는 오디오 재생에 적합한 장치입니다 (따라서 'p')
jones

1
또한 확실하지 않지만 재생할 여러 개의 "파일"이있을 수 있습니까? 나는 하지 않습니다 가지고 '은 / dev / 오디오'나는 생각한다 '는 / dev / 오디오'(2.5 이전) 이전의 커널에 사용되는 OSS 함께 할 수있는 뭔가가
존스

2

사운드 데몬 (예 :) pulseaudio이 장치를 잠그고 있습니까? 를 통해 다른 핸들이 있는지 알아낼 수 있다고 생각합니다 lsof.


1
유용한 제안에 감사드립니다. 내가 사용, 수표를 가지고 greplsof. pulseaudio사용 /dev/snd/controlC0중이지만에 없습니다 /dev/snd/pcmC0D0p. /var/lock장치에 잠금 파일이 있는지 확인하려고 두 번 확인했습니다 . ls -al폴더가 비어 있음을 나타냅니다. pcmC0D0p에 잠금이없는 것 같습니다
jones

@jones 드라이버에 따라 제어 장치를 잠그면 카드 전체를 잠그기에 충분할 수 있습니다. (8 년 후 답변을 드려 죄송합니다. 이제 본인이 알게되었습니다)
Paul Stelian

0

TL; DR : 데이터를 읽거나 쓰기 전에 장치의 매개 변수를 설정해야합니다.

단계별 :

  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상태입니다. 코드는 TinyALSA의 pcm_set_config () 를 참조하십시오 .

    설정 ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZE그리고 PERIODS충분하다. 다른 매개 변수는 BUFFER_SIZE일부 장치에서의 배수가 아닌 것으로 설정 될 수 있다는 점 을 제외하고는 이들의 변형 입니다 PERIOD_SIZE.

  3. ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)장치 및 ALSA 런타임 변수를 준비하기 위해 호출 합니다. 이 후 PCM은 PREPARED상태입니다.

  4. 읽기 (캡처) 또는 쓰기 (재생)를 시작하십시오.

PCM 장치를 읽거나 쓰는 최소한의 응용 프로그램은 하드웨어 매개 변수 조작과 관련된 대부분의 코드를 갖습니다.


재생이 실제 쓰기 / 쓰기가 작동하는지 확실하지 않습니다. 플레이에서 (적어도 개발중인 시스템에서) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...)을 사용하고 재생시 실제 write () 호출이 아닌지 확인하십시오. ALSA 자체에는 읽기 / 쓰기 진입 점을 가져 와서 ioctl로 변환하는 래퍼가 있습니까?
Paul Stelian

@PaulStelian 예. pcm의 파일 작업 정의를 참조하십시오 . 에서 snd_pcm_read()snd_pcm_write(), 바이트 프레임으로 변환됩니다 .
Ricardo Biehl Pasquali
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.