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?
Respuestas:
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/audio
o/dev/dsp
al nuevo sistema del servidor de audio.Enciende la terminal y entra en modo raíz con
sudo su
.Luego, voy
cat /dev/urandom
y canalizo la salidapadsp
y uso eltee
comando 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:
Es posible que incluso desee probar con otros dispositivos, como su mouse: Use:,
/dev/psaux
por 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!
fuente
sudo
no se requieren privilegios para esto.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 ejecutandopulseaudio
mientras 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 tee
algo entre elcat
yaplay
. 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.fuente
padsp tee
era 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). @geremiapadsp tee
cosa 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.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í
fuente
¿Un demonio de sonido (p
pulseaudio
. Ej. ) Mantiene un bloqueo en el dispositivo? Creo que puede averiguar si hay algo más que pueda controlarlsof
.fuente
grep
ylsof
.pulseaudio
está usando/dev/snd/controlC0
pero no está encendido/dev/snd/pcmC0D0p
. Revisé dos veces yendo a/var/lock
buscar si había un archivo para un bloqueo en el dispositivo.ls -al
dice que la carpeta está vacía. Así que supongo que no hay bloqueo en pcmC0D0pTL; DR: los parámetros del dispositivo deben establecerse antes de leer o escribir datos en él.
Paso a paso:
Abra el dispositivo PCM. Por ejemplo:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. Después de abrir, PCM está enOPEN
estado.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á enSETUP
estado. Ver pcm_set_config () de TinyALSA para el código.Configuración
ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
yPERIODS
es suficiente. Los otros parámetros son variantes de estos, exceptoBUFFER_SIZE
que en algunos dispositivos pueden establecerse en un no múltiplo dePERIOD_SIZE
.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á enPREPARED
estado.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.
fuente
snd_pcm_read()
ysnd_pcm_write()
, los bytes se convierten en cuadros .