Récemment, j'ai exploré le dossier enchanted / dev. Je souhaite écrire des données aléatoires sur un périphérique audio afin de générer du bruit.
J'utilise ALSA.
Je demande donc à cat de diriger des données aléatoires vers le fichier de lecture situé dans le dossier / dev ...
cat file-of-random-data > /dev/snd/pcmC0D0p
alors je reçois ce qui semble être une erreur de chat
cat: write error: File descriptor in bad state
Comment puis-je résoudre ce problème afin d’entendre de délicieux jeux statiques sur ma carte son?
Réponses:
Je pense que la raison pour laquelle cela ne fonctionne pas pour vous est que cette interface est obsolète. Normalement, vous ne pouvez plus écrire d’audio
/dev/dsp
, du moins sans être compliqué.Il existe un programme qui accomplira pour vous sur votre système:
padsp
. Cela mappera le fichier/dev/audio
ou/dev/dsp
le nouveau système de serveur audio.Lancez le terminal et passez en mode racine avec
sudo su
.Ensuite, je vais diriger
cat /dev/urandom
la sortie verspadsp
et utiliser latee
commande pour envoyer les données/dev/audio
. Vous aurez une tonne de déchets dans votre terminal, de sorte que vous voudrez peut-être rediriger vers/dev/null
.Une fois que vous êtes dans le superutilisateur, essayez cette commande:
Vous voudrez peut-être même essayer avec d’autres périphériques, comme votre souris: Utilisez
/dev/psaux
, par exemple, ou le pilote USB. Vous pouvez même passer votre mémoire à travers elle:/dev/mem
J'espère que cela explique pourquoi cela ne fonctionnait pas auparavant.
Personnellement, j’ai trouvé la souris et la mémoire beaucoup plus intéressantes que de jouer au statique!
la source
sudo
privilèges ne sont pas nécessaires pour cela.cat /dev/urandom | aplay
est la commande à saisir. Si vous n'êtes pas dans le groupe "audio", vous pouvez préfixer aplay avec sudo. Cela n’interfère pas non plus avec les démons (j’exécutaispulseaudio
alors que cette commande était active et entendais correctement le "bruit".EDIT (6 août 2019): Dans une version plus ancienne de la commande, j'avais également un
padsp tee
problème entrecat
etaplay
. Maintenant que je travaille réellement sur le terrain, je me rends compte que cela n’a absolument aucun sens. De plus, je sais que la commande mise à jour (celle qui est visible maintenant au début de cette réponse) fonctionne parce que je l'utilise plusieurs fois par jour au travail.la source
padsp tee
était nécessaire (j’avais alors précisé le 12.04.2), le fait est que vous ne devriez pas essayer de vider les données directement dans des périphériques, même si vous étiez root ( pour autant que je sache, peu de fichiers sont lisibles et ne peuvent pas être écrits dans le dossier / dev), car vous pourriez soit obtenir une erreur (dans le meilleur des cas, ce qui devient plus commun à chaque mise à jour), planter le noyau ou même casser le périphérique, Dans certains cas. Pour ce faire, il convient d’utiliser des éléments non privilégiés, comme aplay (groupe audio ou racine requise, malheureusement). @geremiapadsp tee
chose n'a vraiment aucun sens. Au travail, j'utilise quelque chose de similaire sans cette ligne pour vérifier que j'avance dans l'écriture du pilote audio. Va maintenant mettre à jour ma réponse.Essayez / dev / audio ou l’un des autres périphériques sous / dev / snd. Ce ne sont pas tous des puits de données audio, vous avez peut-être attrapé un mélangeur, un microphone ou autre chose
la source
Un démon du son (par exemple
pulseaudio
) détient-il un verrou sur l'appareil? Je pense que vous pouvez savoir si quelque chose d'autre a une poignée dessus vialsof
.la source
grep
etlsof
.pulseaudio
utilise/dev/snd/controlC0
mais il n'est pas allumé/dev/snd/pcmC0D0p
. J'ai eu une double vérification en allant à/var/lock
pour trouver s'il y avait un fichier pour un verrou sur l'appareil.ls -al
indique que le dossier est vide. Donc, je suppose qu'il n'y a pas de verrou sur pcmC0D0pTL; DR: Les paramètres de l'appareil doivent être définis avant de pouvoir lire ou écrire des données dessus.
Pas à pas:
Ouvrez le périphérique PCM. Par exemple:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. Après ouverture, le PCM est enOPEN
état.Définir les paramètres avec
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
. La structure des paramètres matériels comporte des masques (chaque bit est une valeur) et des intervalles (plage [minimum, maximum]). Les paramètres qui ne sont pas définis doivent être renseignés (tous les bits / valeurs définis pour les masques; plage complète pour les intervalles). Une fois les paramètres matériels définis, le PCM est à l’SETUP
état. Voir pcm_set_config () de TinyALSA pour le code.Réglage
ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
etPERIODS
est suffisante. Les autres paramètres sont des variantes de ceux-ci, saufBUFFER_SIZE
que, dans certains appareils, il est possible de définir un non multiple dePERIOD_SIZE
.Appelez
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
pour préparer le périphérique et les variables d'exécution ALSA. Après cela, le PCM est enPREPARED
état.Commencez la lecture (capture) ou l'écriture (lecture).
Une application minimale pour lire ou écrire sur un périphérique PCM aura la plupart de son code autour de la manipulation des paramètres matériels.
la source
snd_pcm_read()
etsnd_pcm_write()
, les octets sont convertis en images .