Generando ruido aleatorio por diversión en / dev / snd /


41

Recientemente he estado explorando la carpeta encantada / dev. Quiero escribir algunos datos aleatorios en un dispositivo de audio para generar algo de ruido.

Estoy usando ALSA.

Entonces le indico a cat que canalice algunos datos aleatorios al archivo de reproducción en la carpeta / dev ...

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

entonces recibo lo que parece ser un error del gato

 cat: write error: File descriptor in bad state

¿Cómo puedo solucionar esto para poder escuchar una deliciosa reproducción estática de mi tarjeta de sonido?


1
Creo que necesita enviar datos PCM aleatorios , o tal vez primero necesite configurar el dispositivo con algunos ioctls: no puede volcar bytes aleatorios.
Gilles 'SO- deja de ser malvado'

@Gilles Según Wikipedia, .wav es PCM y obtengo exactamente el mismo resultado cuando reemplazo el archivo aleatorio con un archivo .wav. Investigaré la configuración de algunos controles de entrada / salida.
jones

¿Alguien tiene un puntero para un tutorial sobre cómo configurar algunos ioctls? Para algo llamado ioctls, ¿pensé que ALSA como API debería proporcionar la interfaz para entrada y salida?
jones

Aquí hay un ejemplo práctico de cómo escribir datos pcm directamente en el archivo del dispositivo: github.com/igor-liferenko/pcm
Igor Liferenko

Respuestas:


46

Creo que la razón por la que esto no funciona es porque esa interfaz ha quedado en desuso. Normalmente ya no puedes escribir audio usando /dev/dsp, al menos sin ser complicado.

Hay un programa que va a lograr esto para usted en su sistema: padsp. Esto asignará el archivo /dev/audioo /dev/dspal nuevo sistema del servidor de audio.

Enciende la terminal y entra en modo raíz con sudo su.

Luego, voy cat /dev/urandomy canalizo la salida padspy uso el teecomando para enviar los datos /dev/audio. Obtendrá una tonelada de basura en su terminal, por lo que es posible que desee redirigir a /dev/null.

Una vez que esté en superusuario, intente este comando:

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

Es posible que incluso desee probar con otros dispositivos, como su mouse: Use:, /dev/psauxpor ejemplo, o el controlador usb. Incluso puede ejecutar su memoria a través de él: /dev/mem

Espero que esto aclare por qué no estaba funcionando antes.

Personalmente, ¡encontré que el mouse y la memoria son mucho más interesantes que jugar al azar estático!


1
¡Muchas gracias! Esto es lo que estaba buscando. ¡Respondí 7 meses completos después de publicar la pregunta! :-)
jones

3
Parece que sudono se requieren privilegios para esto.
iyrin

2
muchas gracias. Encontré que los binarios son extrañamente interesantes. cosas como / usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql
don bright

hmm, extraño, 'tee' puede hacer esto pero 'dd of = / dev / audio' no puede.
Jasen

@Jasen dd puede estar escribiendo demasiado a la vez. padsp simula / dev / audio para redirigirlo a través de alsa. dd sin padsp ni siquiera verá / dev / audio a menos que la emulación OSS en el núcleo esté habilitada (y por defecto no lo está). Y creo que escribir un bloque grande, mucho más grande que las memorias intermedias en el controlador, incluso podría fallar.
Paul Stelian

8

cat /dev/urandom | aplay es el comando que debe escribirse. Si no está en el grupo "audio", puede prefijar un aplay con sudo. Esto tampoco interfiere con ningún demonio (estaba ejecutando pulseaudiomientras este comando estaba activo y escuché correctamente el "ruido".

EDITAR (6 de agosto de 2019): en una versión anterior del comando también tenía padsp teealgo entre el caty aplay. Ahora que realmente estoy trabajando en el campo, me doy cuenta de que no tenía ningún sentido. Además, sé que el comando actualizado (el visible ahora al comienzo de esta respuesta) funciona porque lo uso varias veces al día en el trabajo.


66
Yo uso ALSA, y "padsp tee" no es necesario.
Geremia

1
En mis experiencias de pulseaudio (y lo que sea que Ubuntu esté usando cuando PA está inactivo) eso padsp teeera necesario (tenía 12.04.2 preciso en ese momento). El problema es que no deberías intentar volcar datos directamente en los dispositivos, incluso si fueras root ( que yo sepa, pocos archivos son legibles y ninguno se puede escribir en la carpeta / dev), ya que podría obtener un error (en el mejor de los casos, que se vuelve más común con cada actualización), bloquear el núcleo o incluso romper el dispositivo, en casos raros. Uno debe usar elementos no privilegiados, como aplay, para hacer esto (desafortunadamente, se requiere grupo de audio o raíz). @geremia
Paul Stelian

Es curioso cómo ahora veo que la padsp teecosa en realidad no tiene ningún sentido. En el trabajo uso algo similar sin esa línea para comprobar que estoy progresando en la escritura del controlador de audio. Ahora actualizaré mi respuesta.
Paul Stelian

3

Pruebe / dev / audio o uno de los otros dispositivos en / dev / snd. No todos son sumideros de datos de audio, es posible que haya capturado un mezclador, un micrófono o algo así


1
gracias por la respuesta. De acuerdo con / proc / asound / devices / dev / snd / pcmC0D0p es el dispositivo adecuado para la reproducción de audio (de ahí la 'p')
jones

1
Además, no estoy seguro, pero ¿puede haber múltiples "archivos" de desarrollo para la reproducción? Yo no tengo un '/ dev / audio' pienso '/ dev / audio' tiene algo que ver con la OSS que se utiliza en los núcleos antiguos (antes 2,5)
Jones

2

¿Un demonio de sonido (p pulseaudio. Ej. ) Mantiene un bloqueo en el dispositivo? Creo que puede averiguar si hay algo más que pueda controlar lsof.


1
Gracias por la sugerencia útil. Tenía un cheque, usando grepy lsof. pulseaudioestá usando /dev/snd/controlC0pero no está encendido /dev/snd/pcmC0D0p. Revisé dos veces yendo a /var/lockbuscar si había un archivo para un bloqueo en el dispositivo. ls -aldice que la carpeta está vacía. Así que supongo que no hay bloqueo en pcmC0D0p
jones

@jones Sostener un bloqueo en el control puede ser suficiente para bloquear toda la tarjeta, dependiendo del controlador. (perdón por responder después de 8 años, ahora lo aprendí yo mismo)
Paul Stelian

0

TL; DR: los parámetros del dispositivo deben establecerse antes de leer o escribir datos en él.

Paso a paso:

  1. Abra el dispositivo PCM. Por ejemplo: fd = open("/dev/snd/pcmC0D0p", O_RDWR). Después de abrir, PCM está en OPENestado.

  2. Establecer parámetros con ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p). La estructura de parámetros de hardware tiene máscaras (cada bit es un valor) e intervalos (rango [mínimo, máximo]). Los parámetros que no se están configurando deben pasarse rellenados (todos los bits / valores configurados para máscaras; rango completo para intervalos). Después de configurar los parámetros de hardware, PCM está en SETUPestado. Ver pcm_set_config () de TinyALSA para el código.

    Configuración ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZEy PERIODSes suficiente. Los otros parámetros son variantes de estos, excepto BUFFER_SIZEque en algunos dispositivos pueden establecerse en un no múltiplo de PERIOD_SIZE.

  3. Llame ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)para preparar el dispositivo y las variables de tiempo de ejecución ALSA. Después de esto, el PCM está en PREPAREDestado.

  4. Comience a leer (capturar) o escribir (reproducir).

Una aplicación mínima para leer o escribir en un dispositivo PCM tendrá la mayor parte de su código en torno a la manipulación de parámetros de hardware.


No estoy seguro de si el trabajo de lectura / escritura real funciona, ya que aplay usa (al menos en el sistema en el que estoy desarrollando) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...) y no una llamada de escritura () real en la reproducción. ¿ALSA tiene un contenedor que toma los puntos de entrada de lectura / escritura y los traduce a los ioctl?
Paul Stelian

@PaulStelian Sí. Consulte la definición de operaciones de archivo para pcm . En snd_pcm_read()y snd_pcm_write(), los bytes se convierten en cuadros .
Ricardo Biehl Pasquali
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.